xref: /OK3568_Linux_fs/app/lvgl_demo/lvgl/lv_port_indev.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /**
2*4882a593Smuzhiyun  * @file lv_port_indev_templ.c
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun  /* Copy this file as "lv_port_indev.c" and set this value to "1" to enable conten */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <stdlib.h>
9*4882a593Smuzhiyun #include "lvgl.h"
10*4882a593Smuzhiyun #include "lv_port_indev.h"
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include "evdev.h"
13*4882a593Smuzhiyun #include "key.h"
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun typedef struct _GROUP_NODE {
16*4882a593Smuzhiyun     struct _GROUP_NODE *next;
17*4882a593Smuzhiyun     lv_group_t *group;
18*4882a593Smuzhiyun } GROUP_NODE;
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun static int rot_indev;
21*4882a593Smuzhiyun lv_indev_t * indev_touchpad;
22*4882a593Smuzhiyun lv_indev_t * indev_key;
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun GROUP_NODE *group_list = NULL;
25*4882a593Smuzhiyun 
lv_port_indev_group_create(void)26*4882a593Smuzhiyun lv_group_t *lv_port_indev_group_create(void)
27*4882a593Smuzhiyun {
28*4882a593Smuzhiyun     struct _GROUP_NODE *group_node = NULL;
29*4882a593Smuzhiyun     lv_group_t *group = lv_group_create();
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun     lv_indev_set_group(indev_key, group);
32*4882a593Smuzhiyun     lv_group_set_default(group);
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun     group_node = (struct _GROUP_NODE *)malloc(sizeof(struct _GROUP_NODE));
35*4882a593Smuzhiyun     group_node->group = group;
36*4882a593Smuzhiyun     group_node->next = NULL;
37*4882a593Smuzhiyun     if (group_list) {
38*4882a593Smuzhiyun         group_node->next = group_list;
39*4882a593Smuzhiyun         group_list = group_node;
40*4882a593Smuzhiyun     } else {
41*4882a593Smuzhiyun         group_list = group_node;
42*4882a593Smuzhiyun     }
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun     return group;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun 
lv_port_indev_group_destroy(lv_group_t * group)47*4882a593Smuzhiyun void lv_port_indev_group_destroy(lv_group_t *group)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun     if (group_list) {
50*4882a593Smuzhiyun         struct _GROUP_NODE *group_node = NULL;
51*4882a593Smuzhiyun         group_node = group_list;
52*4882a593Smuzhiyun         if (group_list->group == group) {
53*4882a593Smuzhiyun             group_list = group_list->next;
54*4882a593Smuzhiyun             if (group_list) {
55*4882a593Smuzhiyun                 lv_indev_set_group(indev_key, group_list->group);
56*4882a593Smuzhiyun                 lv_group_set_default(group_list->group);
57*4882a593Smuzhiyun             } else {
58*4882a593Smuzhiyun                 lv_indev_set_group(indev_key, NULL);
59*4882a593Smuzhiyun                 lv_group_set_default(NULL);
60*4882a593Smuzhiyun             }
61*4882a593Smuzhiyun             free(group_node);
62*4882a593Smuzhiyun         } else {
63*4882a593Smuzhiyun             while (group_node->next) {
64*4882a593Smuzhiyun                 struct _GROUP_NODE *group_node_next = group_node->next;
65*4882a593Smuzhiyun                 if (group_node_next->group == group) {
66*4882a593Smuzhiyun                     group_node->next = group_node_next->next;
67*4882a593Smuzhiyun                     free(group_node_next);
68*4882a593Smuzhiyun                     break;
69*4882a593Smuzhiyun                 }
70*4882a593Smuzhiyun                 group_node = group_node->next;
71*4882a593Smuzhiyun             }
72*4882a593Smuzhiyun         }
73*4882a593Smuzhiyun         lv_group_del(group);
74*4882a593Smuzhiyun     }
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun 
lv_port_indev_init(int rot)77*4882a593Smuzhiyun void lv_port_indev_init(int rot)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun     /**
80*4882a593Smuzhiyun      * Here you will find example implementation of input devices supported by LittelvGL:
81*4882a593Smuzhiyun      *  - Touchpad
82*4882a593Smuzhiyun      *  - Mouse (with cursor support)
83*4882a593Smuzhiyun      *  - Keypad (supports GUI usage only with key)
84*4882a593Smuzhiyun      *  - Encoder (supports GUI usage only with: left, right, push)
85*4882a593Smuzhiyun      *  - Button (external buttons to press points on the screen)
86*4882a593Smuzhiyun      *
87*4882a593Smuzhiyun      *  The `..._read()` function are only examples.
88*4882a593Smuzhiyun      *  You should shape them according to your hardware
89*4882a593Smuzhiyun      */
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun     static lv_indev_drv_t indev_drv;
92*4882a593Smuzhiyun     static lv_indev_drv_t key_drv;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun     rot_indev = rot;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun     /*------------------
97*4882a593Smuzhiyun      * Touchpad
98*4882a593Smuzhiyun      * -----------------*/
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun     /*Initialize your touchpad if you have*/
101*4882a593Smuzhiyun     evdev_init(rot);
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun     /*Register a touchpad input device*/
104*4882a593Smuzhiyun     lv_indev_drv_init(&indev_drv);
105*4882a593Smuzhiyun     indev_drv.type = LV_INDEV_TYPE_POINTER;
106*4882a593Smuzhiyun     indev_drv.read_cb = evdev_read;
107*4882a593Smuzhiyun     indev_touchpad = lv_indev_drv_register(&indev_drv);
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun #if USE_KEY
110*4882a593Smuzhiyun     key_init();
111*4882a593Smuzhiyun     lv_indev_drv_init(&key_drv);
112*4882a593Smuzhiyun     key_drv.type = LV_INDEV_TYPE_KEYPAD;
113*4882a593Smuzhiyun     key_drv.read_cb = key_read;
114*4882a593Smuzhiyun     indev_key = lv_indev_drv_register(&key_drv);
115*4882a593Smuzhiyun     lv_port_indev_group_create();
116*4882a593Smuzhiyun #endif
117*4882a593Smuzhiyun }
118