запрос помощи Raspberry Pi Touch - PullRequest
       39

запрос помощи Raspberry Pi Touch

0 голосов
/ 23 октября 2018

Я работал над 5-дюймовым проектом с сенсорным экраном на Rasbian, и моя программа использует следующий код для инициализации и чтения сенсорного экрана. Я хочу, чтобы мое приложение использовало ввод, чтобы оно не вызывало ОС и не удалялосфокусироваться на моем приложении. Каков наилучший способ сделать это, чтобы мое приложение оставалось на переднем плане? Я использую кадровый буфер для отображения кнопок и пользовательского интерфейса.

Инициализация:

int g_fdTouchScreen;
const char *g_pDevice = "/dev/input/event0";    // Find proper the event number with the evtest command from terminal
struct input_event g_ieTouchScreen;

int g_iTouchX = 0;
int g_iTouchY = 0;
int g_iTouchPressure = 0;

/******************************************************************************
 * InitDisplay - Initialize the dislay and touch screen
 ******************************************************************************/
void InitDisplay(void)
{
    if((g_fdTouchScreen = open(g_pDevice, O_RDWR | O_NONBLOCK)) == -1) {
        perror("Error opening Touch Screen");
        exit(EXIT_FAILURE);
    }
}


/******************************************************************************
 * ReadTouchScreen - Read Touch Screen data
 ******************************************************************************/

int ReadTouchScreen(void)
{
    if (read(g_fdTouchScreen, &g_ieTouchScreen, sizeof(struct input_event)) == -1)
    {
        return (0); // No touch
    }

// Looks like the OS gets the event first?
    // Try to write nothing to the file so it doesnt get used by the OS
    g_ieTouchScreen.type = 0;
    g_ieTouchScreen.code = 0;
    g_ieTouchScreen.value = 0;
    lseek(g_fdTouchScreen, SEEK_CUR, -sizeof(struct input_event));
    write(g_fdTouchScreen, &g_ieTouchScreen, sizeof(struct input_event));

    //printf("time %ld.%06ld\ttype %d\tcode %d\tvalue %d\n", ieTouchScreen.time.tv_sec, ieTouccreen.time.tv_usec, ieTouchScreen.type, ieTouchScreen.code, ieTouchScreen.value);
    if (g_ieTouchScreen.type == EV_ABS)
    {
        if (g_ieTouchScreen.code == ABS_X)
        {
            g_iTouchX = (int)((g_ieTouchScreen.value - 150.0f) / 4.7f);
            //printf("Absolute X: %d\n", g_iTouchX);    // X left 150 right 4000 - real divisor should be 4.8125 but this gives closer pixel values
        }
        else if (g_ieTouchScreen.code == ABS_Y)
        {
            g_iTouchY = (int)((g_ieTouchScreen.value - 300.0f) / 7.18f);
            //printf("Absolute Y: %d\n", g_iTouchY);   // Y top 300 bottom 3750 = 7.1875
        }
        else if (g_ieTouchScreen.code == ABS_PRESSURE)
        {
            if (g_ieTouchScreen.value >= 59000)
                g_iTouchPressure = (g_ieTouchScreen.value - 59000) / 50;
            //printf("Pressure: %d\n", g_iTouchPressure);
        }
        else
            printf("Code: %02X\n", g_ieTouchScreen.code);
    }
    return (1);
}

Я попытался перезаписать запись в файле следующим образом (и, как видно из кода выше), но мне не повезло:

// Try to write nothing to the file so it doesn't get used by the OS
g_ieTouchScreen.type = 0;
g_ieTouchScreen.code = 0;
g_ieTouchScreen.value = 0;
lseek(g_fdTouchScreen, SEEK_CUR, -sizeof(struct input_event));
write(g_fdTouchScreen, &g_ieTouchScreen, sizeof(struct input_event));

Я предполагаю, что ОС получает печать перед моим приложением... Любая помощь будет оценена.

...