树莓派触摸帮助请求

时间:2018-10-22 21:13:22

标签: raspberry-pi raspberry-pi3 raspbian touchscreen

我一直在Rasbian上进行5“触摸屏项目的开发,并且让我的程序使用以下代码来初始化和读取触摸屏。我希望我的应用吃掉输入内容,以便它不会触发操作系统并删除将焦点从我的应用程序中移开。什么是使我的应用程序停留在前台的最佳方法是什么?我正在使用帧缓冲区来显示按钮和UI。

初始化:

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));

我猜想操作系统在我的应用发布之前就得到了媒体的青睐。

0 个答案:

没有答案