/**1* @file hal_indev.c2*3* @description Input device HAL interface4*5*/67/*********************8* INCLUDES9*********************/10#include "../lv_hal/lv_hal_indev.h"11#include "../lv_misc/lv_mem.h"12#include "../lv_misc/lv_gc.h"1314#if defined(LV_GC_INCLUDE)15# include LV_GC_INCLUDE16#endif /* LV_ENABLE_GC */171819/*********************20* DEFINES21*********************/2223/**********************24* TYPEDEFS25**********************/2627/**********************28* STATIC PROTOTYPES29**********************/3031/**********************32* STATIC VARIABLES33**********************/3435/**********************36* MACROS37**********************/3839/**********************40* GLOBAL FUNCTIONS41**********************/4243/**44* Initialize an input device driver with default values.45* It is used to surly have known values in the fields ant not memory junk.46* After it you can set the fields.47* @param driver pointer to driver variable to initialize48*/49void lv_indev_drv_init(lv_indev_drv_t * driver)50{51driver->read = NULL;52driver->type = LV_INDEV_TYPE_NONE;53driver->user_data = NULL;54}5556/**57* Register an initialized input device driver.58* @param driver pointer to an initialized 'lv_indev_drv_t' variable (can be local variable)59* @return pointer to the new input device or NULL on error60*/61lv_indev_t * lv_indev_drv_register(lv_indev_drv_t * driver)62{63lv_indev_t * node;6465node = lv_mem_alloc(sizeof(lv_indev_t));66if(!node) return NULL;6768memset(node, 0, sizeof(lv_indev_t));69memcpy(&node->driver, driver, sizeof(lv_indev_drv_t));7071node->next = NULL;72node->proc.reset_query = 1;73node->cursor = NULL;74node->group = NULL;75node->btn_points = NULL;7677if(LV_GC_ROOT(_lv_indev_list) == NULL) {78LV_GC_ROOT(_lv_indev_list) = node;79} else {80lv_indev_t * last = LV_GC_ROOT(_lv_indev_list);81while(last->next)82last = last->next;8384last->next = node;85}8687return node;88}8990/**91* Get the next input device.92* @param indev pointer to the current input device. NULL to initialize.93* @return the next input devise or NULL if no more. Give the first input device when the parameter is NULL94*/95lv_indev_t * lv_indev_next(lv_indev_t * indev)96{9798if(indev == NULL) {99return LV_GC_ROOT(_lv_indev_list);100} else {101if(indev->next == NULL) return NULL;102else return indev->next;103}104}105106/**107* Read data from an input device.108* @param indev pointer to an input device109* @param data input device will write its data here110* @return false: no more data; true: there more data to read (buffered)111*/112bool lv_indev_read(lv_indev_t * indev, lv_indev_data_t * data)113{114bool cont = false;115116memset(data, 0, sizeof(lv_indev_data_t));117data->state = LV_INDEV_STATE_REL;118119if(indev->driver.read) {120data->user_data = indev->driver.user_data;121122LV_LOG_TRACE("idnev read started");123cont = indev->driver.read(data);124LV_LOG_TRACE("idnev read finished");125} else {126LV_LOG_WARN("indev function registered");127}128129return cont;130}131132/**********************133* STATIC FUNCTIONS134**********************/135136137