Я работал над 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));
Я предполагаю, что ОС получает печать перед моим приложением... Любая помощь будет оценена.