Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 模拟多点触摸事件(单指线性滑动)_Android_C_Linux Kernel_Linux Device Driver - Fatal编程技术网

Android 模拟多点触摸事件(单指线性滑动)

Android 模拟多点触摸事件(单指线性滑动),android,c,linux-kernel,linux-device-driver,Android,C,Linux Kernel,Linux Device Driver,我正在对使用的驱动程序文件进行编辑。 我的目标是绑定一个从(x1,y1)到(x2,y2)的沿线滑动手势 为此,我在钥匙压力检测功能内执行此功能: static void do_swipe(struct kp *kp, long xstart, long ystart, long xend, long yend, int id) { printk("SWIPE! X1 %d Y1 %d X2 %d Y2 %d ID %d \n",xstart,ystart,xend,yen

我正在对使用的驱动程序文件进行编辑。 我的目标是绑定一个从(x1,y1)到(x2,y2)的沿线滑动手势

为此,我在钥匙压力检测功能内执行此功能:

static void do_swipe(struct kp *kp, long xstart, long ystart, long xend, long yend,
        int id) {
    printk("SWIPE! X1 %d Y1 %d X2 %d Y2 %d ID %d \n",xstart,ystart,xend,yend,id);
    int sx, sy;
    int dx = abs(xend - xstart);
    int dy = abs(yend - ystart);
    if (xstart < xend)
        sx = 1;
    else
        sx = -1;
    if (ystart < yend)
        sy = 1;
    else
        sy = -1;
    int err = dx - dy;
    long tempx = xstart;
    long tempy = ystart;
    while (1) {
        key_report(kp, tempx, tempy, id);
        //Touch is now detected with input_sync
        input_sync(kp->input);
        if(tempx == xend && tempy == yend) break;
        int e2 = 2 * err;
        if (e2 > (-1)*dy) {
            err = err - dy;
            tempx = tempx + sx;
        } else if (e2 < dx) {
            err = err + dx;
            tempy = tempy + sy;
        }
    }
    printk("END! X %d Y %d \n",tempx, tempy);

}
其中kp->input是这样定义的

struct input_dev *input;
编辑:我更新了代码,还附加了按键压力的通用代码,因为我希望驾驶员只对每个按键压力执行一次刷卡,以避免刷卡循环

static void kp_work(struct kp *kp) {
int i, code, value;
kp_search_key(kp);
if (key_param[0] == 3) {
    if (kp->key_valid[4] == 1) {
        value = kp->key_value[4];
        kp->flagchan4 = 0;
        if (value >= 0 && value <= (9 + 40)) {
            if (key_param[99] == 1 ) {
                do_swipe(kp, key_param[25], key_param[26], key_param[97],
                        key_param[98], 12);
            } else
                key_report(kp, key_param[25], key_param[26], 12);
        } else if (value >= 392 - 40 && value <= (392 + 40)) {
            if (key_param[102] == 1) {
                do_swipe(kp, key_param[23], key_param[24], key_param[100],
                        key_param[101], 12);
            } else
                key_report(kp, key_param[23], key_param[24], 12);
        } 
        kp->flagchan4 = 0;
    } else {
        kp->flagchan4 = 1;
    }
}
input_sync(kp->input);
}
静态无效kp\u工作(结构kp*kp){
int i,代码,值;
kp搜索密钥(kp);
如果(键参数[0]==3){
如果(kp->key_valid[4]==1){
value=kp->key_value[4];
kp->flagchan4=0;
如果(值>=0&&value=392-40&&value标志通道4=0;
}否则{
kp->flagchan4=1;
}
}
输入同步(kp->输入);
}
也许我可以在kp->flagchan4上设置一个检查。。。
编辑:在flagchan4上设置一个检查就成功了。

就像在中一样,似乎说您需要一个最终的
输入\u sync()
将其清除。您也可以尝试将代码放入
工作队列
,我不知道事件系统是否被值淹没。@artlessnoise您给了我正确的提示,现在我在每个
键报告
后立即输入同步。现在触摸事件会显示在屏幕上,但如果我一直按该键,则swipe继续,如何实施“锁定”密钥的策略,使其只执行一次刷卡?@artlessnoise driver正在工作,这要感谢您的提示。如果您想创建一个答案,我会接受它。创建一个社区wiki答案并接受它是很好的;如果您真的渴望积分,您也可以创建自己的答案。我会将您的标题更新为“模拟多点触控事件”。我认为这更好地描述了正在发生的事情。如果我编辑一个问题并改变其含义,一群非内核开发人员会拒绝它。
static void kp_work(struct kp *kp) {
int i, code, value;
kp_search_key(kp);
if (key_param[0] == 3) {
    if (kp->key_valid[4] == 1) {
        value = kp->key_value[4];
        kp->flagchan4 = 0;
        if (value >= 0 && value <= (9 + 40)) {
            if (key_param[99] == 1 ) {
                do_swipe(kp, key_param[25], key_param[26], key_param[97],
                        key_param[98], 12);
            } else
                key_report(kp, key_param[25], key_param[26], 12);
        } else if (value >= 392 - 40 && value <= (392 + 40)) {
            if (key_param[102] == 1) {
                do_swipe(kp, key_param[23], key_param[24], key_param[100],
                        key_param[101], 12);
            } else
                key_report(kp, key_param[23], key_param[24], 12);
        } 
        kp->flagchan4 = 0;
    } else {
        kp->flagchan4 = 1;
    }
}
input_sync(kp->input);
}