embox

Форк
0
/
input_dev_port.c 
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

17
static bool left_button_down = false;
18
static int16_t last_x = 0, last_y = 0;
19
static int inp_fd;
20
#if LVGL_VERSION_MAJOR == 7
21
bool lvgl_port_input_dev_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) {
22
#else
23
void lvgl_port_input_dev_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) {
24
#endif
25

26
	(void) indev_drv;      /*Unused*/
27

28
	/*Store the collected data*/
29
	data->point.x = last_x;
30
	data->point.y = last_y;
31
	data->state = left_button_down ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
32
#if LVGL_VERSION_MAJOR == 7
33
	return false;
34
#endif
35
}
36

37
int lvgl_port_input_dev_init(const char *path) {
38
	inp_fd = open(path, O_RDONLY | O_NONBLOCK);
39
	if (inp_fd == -1) {
40
		log_error("Cannot find mouse \"%s\"", path);
41
		return -1;
42
	}
43

44
	return 0;
45
}
46

47
static int normalize_coord(int x, int a, int b) {
48
	if (x < a) {
49
		return a;
50
	} else if (x > b - 1) {
51
		return b - 1;
52
	} else {
53
		return x;
54
	}
55
}
56

57
void lvgl_port_mouse_handle(void) {
58
	struct input_event ev;
59

60
	while (1) {
61
		if (read(inp_fd, &ev, sizeof ev) <= 0) {
62
			break;
63
		}
64

65
		last_x += (ev.value >> 16) & 0xffff;
66
		last_y -= ev.value & 0xffff;
67

68
		last_x = normalize_coord(last_x, 0, LV_HOR_RES_MAX);
69
		last_y = normalize_coord(last_y, 0, LV_VER_RES_MAX);
70

71
		left_button_down = !!(ev.type & MOUSE_BUTTON_LEFT);
72
	}
73
}
74

75
void lvgl_port_touchscreen_handle(void) {
76
	struct input_event ev;
77

78
	while (1) {
79
		if (read(inp_fd, &ev, sizeof ev) <= 0) {
80
			break;
81
		}
82

83
		switch (ev.type & ~TS_EVENT_NEXT) {
84
		case TS_TOUCH_1:
85
			last_x = (int16_t) ((ev.value >> 16) & 0xffff);
86
			last_y = (int16_t) ev.value & 0xffff;
87

88
			last_x = normalize_coord(last_x, 0, LV_HOR_RES_MAX);
89
			last_y = normalize_coord(last_y, 0, LV_VER_RES_MAX);
90

91
			left_button_down = true;
92

93
			break;
94
		case TS_TOUCH_1_RELEASED:
95
			left_button_down = false;
96

97
			break;
98
		default:
99
			continue;
100
		}
101
	}
102
}
103

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.