lvgl / lv_drivers

TFT and touch pad drivers for LVGL embedded GUI library
https://docs.lvgl.io/master/porting/index.html
MIT License
291 stars 310 forks source link

fix: The mouse moves outside the screen area #251

Closed Woodliys closed 1 year ago

Woodliys commented 1 year ago

evdev_root_x/y will continue to increase as the mouse moves out of the screen. If you move the mouse inside the screen, wait until evdev_root_x/y is less than hor/ver_res. This is a problem.

kisvegabor commented 1 year ago

Maybe I misunderstand the problem, but it seems a cleaner solution to me:

#if EVDEV_CALIBRATE
    //Add these 2 lines
    evdev_root_x = LV_CLAMP(EVDEV_HOR_MIN, evdev_root_x, EVDEV_HOR_MAX);
    evdev_root_y = LV_CLAMP(EVDEV_VER_MIN, evdev_root_y, EVDEV_VER_MAX);

    data->point.x = map(evdev_root_x, EVDEV_HOR_MIN, EVDEV_HOR_MAX, 0, drv->disp->driver->hor_res);
    data->point.y = map(evdev_root_y, EVDEV_VER_MIN, EVDEV_VER_MAX, 0, drv->disp->driver->ver_res);
#else
    data->point.x = evdev_root_x;
    data->point.y = evdev_root_y;
#endif
Woodliys commented 1 year ago

True, but I don't think evdev_root_x/y should exceed the value of hor/ver_res, maybe it should:

    evdev_root_x = LV_CLAMP(0, evdev_root_x, drv->disp->driver->hor_res-1);
    evdev_root_y = LV_CLAMP(0, evdev_root_y, drv->disp->driver->ver_res-1);

#if EVDEV_CALIBRATE
    data->point.x = map(evdev_root_x, EVDEV_HOR_MIN, EVDEV_HOR_MAX, 0, drv->disp->driver->hor_res);
    data->point.y = map(evdev_root_y, EVDEV_VER_MIN, EVDEV_VER_MAX, 0, drv->disp->driver->ver_res);
#else
    data->point.x = evdev_root_x;
    data->point.y = evdev_root_y;
#endif
kisvegabor commented 1 year ago

Probably the combination of the two should be the best option as during calibration below evdev_root_x/y is needed in its raw form:


#if EVDEV_CALIBRATE
    evdev_root_x = LV_CLAMP(EVDEV_HOR_MIN, evdev_root_x, EVDEV_HOR_MAX);
    evdev_root_y = LV_CLAMP(EVDEV_VER_MIN, evdev_root_y, EVDEV_VER_MAX);

    data->point.x = map(evdev_root_x, EVDEV_HOR_MIN, EVDEV_HOR_MAX, 0, drv->disp->driver->hor_res);
    data->point.y = map(evdev_root_y, EVDEV_VER_MIN, EVDEV_VER_MAX, 0, drv->disp->driver->ver_res);
#else
    evdev_root_x = LV_CLAMP(0, evdev_root_x, drv->disp->driver->hor_res-1);
    evdev_root_y = LV_CLAMP(0, evdev_root_y, drv->disp->driver->ver_res-1);

    data->point.x = evdev_root_x;
    data->point.y = evdev_root_y;
#endif
Woodliys commented 1 year ago

Uh, you are right.

kisvegabor commented 1 year ago

Could update it? I can't test it now so it'd be safer you added the discussed changes.

Woodliys commented 1 year ago

I just tested it. The others had problems, but this one is fine.


#if EVDEV_CALIBRATE
    evdev_root_x = LV_CLAMP(EVDEV_HOR_MIN, evdev_root_x, EVDEV_HOR_MAX);
    evdev_root_y = LV_CLAMP(EVDEV_VER_MIN, evdev_root_y, EVDEV_VER_MAX);

    data->point.x = map(evdev_root_x, EVDEV_HOR_MIN, EVDEV_HOR_MAX, 0, drv->disp->driver->hor_res);
    data->point.y = map(evdev_root_y, EVDEV_VER_MIN, EVDEV_VER_MAX, 0, drv->disp->driver->ver_res);
#else
    evdev_root_x = LV_CLAMP(0, evdev_root_x, drv->disp->driver->hor_res-1);
    evdev_root_y = LV_CLAMP(0, evdev_root_y, drv->disp->driver->ver_res-1);

    data->point.x = evdev_root_x;
    data->point.y = evdev_root_y;
#endif
kisvegabor commented 1 year ago

Thank you!