embox
102 строки · 2.0 Кб
1/**
2* @file
3* @brief LVGL input devices interface port
4*
5* @date 15.02.2021
6* @author Alexander Kalmuk
7*/
8
9#include <fcntl.h>10#include <unistd.h>11#include <stdbool.h>12#include <util/log.h>13#include <drivers/input/input_dev.h>14
15#include "lvgl.h"16
17static bool left_button_down = false;18static int16_t last_x = 0, last_y = 0;19static int inp_fd;20#if LVGL_VERSION_MAJOR == 721bool lvgl_port_input_dev_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) {22#else23void lvgl_port_input_dev_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) {24#endif25
26(void) indev_drv; /*Unused*/27
28/*Store the collected data*/29data->point.x = last_x;30data->point.y = last_y;31data->state = left_button_down ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;32#if LVGL_VERSION_MAJOR == 733return false;34#endif35}
36
37int lvgl_port_input_dev_init(const char *path) {38inp_fd = open(path, O_RDONLY | O_NONBLOCK);39if (inp_fd == -1) {40log_error("Cannot find mouse \"%s\"", path);41return -1;42}43
44return 0;45}
46
47static int normalize_coord(int x, int a, int b) {48if (x < a) {49return a;50} else if (x > b - 1) {51return b - 1;52} else {53return x;54}55}
56
57void lvgl_port_mouse_handle(void) {58struct input_event ev;59
60while (1) {61if (read(inp_fd, &ev, sizeof ev) <= 0) {62break;63}64
65last_x += (ev.value >> 16) & 0xffff;66last_y -= ev.value & 0xffff;67
68last_x = normalize_coord(last_x, 0, LV_HOR_RES_MAX);69last_y = normalize_coord(last_y, 0, LV_VER_RES_MAX);70
71left_button_down = !!(ev.type & MOUSE_BUTTON_LEFT);72}73}
74
75void lvgl_port_touchscreen_handle(void) {76struct input_event ev;77
78while (1) {79if (read(inp_fd, &ev, sizeof ev) <= 0) {80break;81}82
83switch (ev.type & ~TS_EVENT_NEXT) {84case TS_TOUCH_1:85last_x = (int16_t) ((ev.value >> 16) & 0xffff);86last_y = (int16_t) ev.value & 0xffff;87
88last_x = normalize_coord(last_x, 0, LV_HOR_RES_MAX);89last_y = normalize_coord(last_y, 0, LV_VER_RES_MAX);90
91left_button_down = true;92
93break;94case TS_TOUCH_1_RELEASED:95left_button_down = false;96
97break;98default:99continue;100}101}102}
103