acid-drop- Hacking the planet from a LilyGo T-Deck using custom firmware |
git clone git://git.acid.vegas/acid-drop.git |
Log | Files | Refs | Archive | README | LICENSE |
lv_hal_indev.c (5856B)
1 /** 2 * @file lv_hal_indev.c 3 * 4 * @description Input device HAL interface 5 * 6 */ 7 8 /********************* 9 * INCLUDES 10 *********************/ 11 #include "../misc/lv_assert.h" 12 #include "../hal/lv_hal_indev.h" 13 #include "../core/lv_indev.h" 14 #include "../misc/lv_mem.h" 15 #include "../misc/lv_gc.h" 16 #include "lv_hal_disp.h" 17 18 /********************* 19 * DEFINES 20 *********************/ 21 22 /********************** 23 * TYPEDEFS 24 **********************/ 25 26 /********************** 27 * GLOBAL PROTOTYPES 28 **********************/ 29 30 /********************** 31 * STATIC PROTOTYPES 32 **********************/ 33 34 /********************** 35 * STATIC VARIABLES 36 **********************/ 37 38 /********************** 39 * MACROS 40 **********************/ 41 #if LV_LOG_TRACE_INDEV 42 #define INDEV_TRACE(...) LV_LOG_TRACE(__VA_ARGS__) 43 #else 44 #define INDEV_TRACE(...) 45 #endif 46 47 /********************** 48 * GLOBAL FUNCTIONS 49 **********************/ 50 51 /** 52 * Initialize an input device driver with default values. 53 * It is used to surly have known values in the fields ant not memory junk. 54 * After it you can set the fields. 55 * @param driver pointer to driver variable to initialize 56 */ 57 void lv_indev_drv_init(lv_indev_drv_t * driver) 58 { 59 lv_memset_00(driver, sizeof(lv_indev_drv_t)); 60 61 driver->type = LV_INDEV_TYPE_NONE; 62 driver->scroll_limit = LV_INDEV_DEF_SCROLL_LIMIT; 63 driver->scroll_throw = LV_INDEV_DEF_SCROLL_THROW; 64 driver->long_press_time = LV_INDEV_DEF_LONG_PRESS_TIME; 65 driver->long_press_repeat_time = LV_INDEV_DEF_LONG_PRESS_REP_TIME; 66 driver->gesture_limit = LV_INDEV_DEF_GESTURE_LIMIT; 67 driver->gesture_min_velocity = LV_INDEV_DEF_GESTURE_MIN_VELOCITY; 68 } 69 70 /** 71 * Register an initialized input device driver. 72 * @param driver pointer to an initialized 'lv_indev_drv_t' variable. 73 * Only pointer is saved, so the driver should be static or dynamically allocated. 74 * @return pointer to the new input device or NULL on error 75 */ 76 lv_indev_t * lv_indev_drv_register(lv_indev_drv_t * driver) 77 { 78 if(driver->disp == NULL) driver->disp = lv_disp_get_default(); 79 80 if(driver->disp == NULL) { 81 LV_LOG_WARN("lv_indev_drv_register: no display registered hence can't attach the indev to " 82 "a display"); 83 return NULL; 84 } 85 86 lv_indev_t * indev = _lv_ll_ins_head(&LV_GC_ROOT(_lv_indev_ll)); 87 LV_ASSERT_MALLOC(indev); 88 if(!indev) { 89 return NULL; 90 } 91 92 lv_memset_00(indev, sizeof(lv_indev_t)); 93 indev->driver = driver; 94 95 indev->proc.reset_query = 1; 96 indev->driver->read_timer = lv_timer_create(lv_indev_read_timer_cb, LV_INDEV_DEF_READ_PERIOD, indev); 97 98 return indev; 99 } 100 101 /** 102 * Update the driver in run time. 103 * @param indev pointer to a input device. (return value of `lv_indev_drv_register`) 104 * @param new_drv pointer to the new driver 105 */ 106 void lv_indev_drv_update(lv_indev_t * indev, lv_indev_drv_t * new_drv) 107 { 108 LV_ASSERT_NULL(indev); 109 LV_ASSERT_NULL(indev->driver); 110 LV_ASSERT_NULL(indev->driver->read_timer); 111 lv_timer_del(indev->driver->read_timer); 112 113 LV_ASSERT_NULL(new_drv); 114 if(new_drv->disp == NULL) { 115 new_drv->disp = lv_disp_get_default(); 116 } 117 if(new_drv->disp == NULL) { 118 LV_LOG_WARN("lv_indev_drv_register: no display registered hence can't attach the indev to " 119 "a display"); 120 indev->proc.disabled = true; 121 return; 122 } 123 124 indev->driver = new_drv; 125 indev->driver->read_timer = lv_timer_create(lv_indev_read_timer_cb, LV_INDEV_DEF_READ_PERIOD, indev); 126 indev->proc.reset_query = 1; 127 } 128 129 /** 130 * Remove the provided input device. Make sure not to use the provided input device afterwards anymore. 131 * @param indev pointer to delete 132 */ 133 void lv_indev_delete(lv_indev_t * indev) 134 { 135 LV_ASSERT_NULL(indev); 136 LV_ASSERT_NULL(indev->driver); 137 LV_ASSERT_NULL(indev->driver->read_timer); 138 /*Clean up the read timer first*/ 139 lv_timer_del(indev->driver->read_timer); 140 /*Remove the input device from the list*/ 141 _lv_ll_remove(&LV_GC_ROOT(_lv_indev_ll), indev); 142 /*Free the memory of the input device*/ 143 lv_mem_free(indev); 144 } 145 146 /** 147 * Get the next input device. 148 * @param indev pointer to the current input device. NULL to initialize. 149 * @return the next input devise or NULL if no more. Give the first input device when the parameter 150 * is NULL 151 */ 152 lv_indev_t * lv_indev_get_next(lv_indev_t * indev) 153 { 154 if(indev == NULL) 155 return _lv_ll_get_head(&LV_GC_ROOT(_lv_indev_ll)); 156 else 157 return _lv_ll_get_next(&LV_GC_ROOT(_lv_indev_ll), indev); 158 } 159 160 /** 161 * Read data from an input device. 162 * @param indev pointer to an input device 163 * @param data input device will write its data here 164 */ 165 void _lv_indev_read(lv_indev_t * indev, lv_indev_data_t * data) 166 { 167 lv_memset_00(data, sizeof(lv_indev_data_t)); 168 169 /* For touchpad sometimes users don't set the last pressed coordinate on release. 170 * So be sure a coordinates are initialized to the last point */ 171 if(indev->driver->type == LV_INDEV_TYPE_POINTER) { 172 data->point.x = indev->proc.types.pointer.last_raw_point.x; 173 data->point.y = indev->proc.types.pointer.last_raw_point.y; 174 } 175 /*Similarly set at least the last key in case of the user doesn't set it on release*/ 176 else if(indev->driver->type == LV_INDEV_TYPE_KEYPAD) { 177 data->key = indev->proc.types.keypad.last_key; 178 } 179 /*For compatibility assume that used button was enter (encoder push)*/ 180 else if(indev->driver->type == LV_INDEV_TYPE_ENCODER) { 181 data->key = LV_KEY_ENTER; 182 } 183 184 if(indev->driver->read_cb) { 185 INDEV_TRACE("calling indev_read_cb"); 186 indev->driver->read_cb(indev->driver, data); 187 } 188 else { 189 LV_LOG_WARN("indev_read_cb is not registered"); 190 } 191 } 192 193 /********************** 194 * STATIC FUNCTIONS 195 **********************/