1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-21 06:53:01 +08:00
lvgl/lv_hal/lv_hal_indev.c

131 lines
3.1 KiB
C
Raw Normal View History

/**
* @file hal_indev.c
*
* @description Input device HAL interface
2018-06-19 09:49:58 +02:00
*
*/
/*********************
* INCLUDES
*********************/
#include "../lv_hal/lv_hal_indev.h"
2017-11-23 20:42:14 +01:00
#include "../lv_misc/lv_mem.h"
#include "../lv_misc/lv_gc.h"
2019-02-12 12:21:34 +01:00
#include "lv_hal_disp.h"
#if defined(LV_GC_INCLUDE)
# include LV_GC_INCLUDE
#endif /* LV_ENABLE_GC */
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
/**********************
* STATIC VARIABLES
**********************/
/**********************
* MACROS
**********************/
/**********************
* GLOBAL FUNCTIONS
**********************/
/**
* Initialize an input device driver with default values.
* It is used to surly have known values in the fields ant not memory junk.
* After it you can set the fields.
* @param driver pointer to driver variable to initialize
*/
2018-06-19 09:49:58 +02:00
void lv_indev_drv_init(lv_indev_drv_t * driver)
{
2017-12-17 01:54:09 +01:00
driver->read = NULL;
driver->type = LV_INDEV_TYPE_NONE;
2019-02-10 11:06:47 +01:00
driver->disp = NULL;
2018-02-23 17:03:00 +01:00
driver->user_data = NULL;
}
/**
2017-10-20 22:41:10 +02:00
* Register an initialized input device driver.
* @param driver pointer to an initialized 'lv_indev_drv_t' variable (can be local variable)
* @return pointer to the new input device or NULL on error
*/
2018-06-19 09:49:58 +02:00
lv_indev_t * lv_indev_drv_register(lv_indev_drv_t * driver)
{
2019-02-10 11:06:47 +01:00
if(driver->disp == NULL) driver->disp = lv_disp_get_last();
if(driver->disp == NULL) {
LV_LOG_WARN("lv_indev_drv_register: no display registered hence can't attache the indev to a display");
return NULL;
}
lv_indev_t * node = lv_ll_ins_head(&LV_GC_ROOT(_lv_indev_ll));
if(!node) {
lv_mem_assert(node);
return NULL;
}
memset(node, 0, sizeof(lv_indev_t));
memcpy(&node->driver, driver, sizeof(lv_indev_drv_t));
node->proc.reset_query = 1;
node->cursor = NULL;
node->group = NULL;
node->btn_points = NULL;
return node;
}
/**
* Get the next input device.
* @param indev pointer to the current input device. NULL to initialize.
* @return the next input devise or NULL if no more. Give the first input device when the parameter is NULL
*/
lv_indev_t * lv_indev_next(lv_indev_t * indev)
{
2019-02-10 11:06:47 +01:00
if(indev == NULL) return lv_ll_get_head(LV_GC_ROOT(&_lv_indev_ll));
else return lv_ll_get_next(LV_GC_ROOT(&_lv_indev_ll), indev);
}
/**
* Read data from an input device.
* @param indev pointer to an input device
* @param data input device will write its data here
* @return false: no more data; true: there more data to read (buffered)
*/
2018-06-19 09:49:58 +02:00
bool lv_indev_read(lv_indev_t * indev, lv_indev_data_t * data)
{
bool cont = false;
2018-11-24 07:41:18 +01:00
memset(data, 0, sizeof(lv_indev_data_t));
data->state = LV_INDEV_STATE_REL;
2017-12-17 01:54:09 +01:00
if(indev->driver.read) {
2018-02-23 17:03:00 +01:00
data->user_data = indev->driver.user_data;
2018-07-25 20:39:24 +02:00
2018-10-05 17:22:49 +02:00
LV_LOG_TRACE("idnev read started");
2017-12-17 01:54:09 +01:00
cont = indev->driver.read(data);
2018-10-05 17:22:49 +02:00
LV_LOG_TRACE("idnev read finished");
} else {
2018-10-05 17:22:49 +02:00
LV_LOG_WARN("indev function registered");
}
return cont;
}
/**********************
* STATIC FUNCTIONS
**********************/