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.h (7718B)

      1 /**
      2  * @file lv_hal_indev.h
      3  *
      4  * @description Input Device HAL interface layer header file
      5  *
      6  */
      7 
      8 #ifndef LV_HAL_INDEV_H
      9 #define LV_HAL_INDEV_H
     10 
     11 #ifdef __cplusplus
     12 extern "C" {
     13 #endif
     14 
     15 /*********************
     16  *      INCLUDES
     17  *********************/
     18 #include "../lv_conf_internal.h"
     19 
     20 #include <stdbool.h>
     21 #include <stdint.h>
     22 #include "../misc/lv_area.h"
     23 #include "../misc/lv_timer.h"
     24 
     25 /*********************
     26  *      DEFINES
     27  *********************/
     28 
     29 /*Drag threshold in pixels*/
     30 #define LV_INDEV_DEF_SCROLL_LIMIT         10
     31 
     32 /*Drag throw slow-down in [%]. Greater value -> faster slow-down*/
     33 #define LV_INDEV_DEF_SCROLL_THROW         10
     34 
     35 /*Long press time in milliseconds.
     36  *Time to send `LV_EVENT_LONG_PRESSSED`)*/
     37 #define LV_INDEV_DEF_LONG_PRESS_TIME      400
     38 
     39 /*Repeated trigger period in long press [ms]
     40  *Time between `LV_EVENT_LONG_PRESSED_REPEAT*/
     41 #define LV_INDEV_DEF_LONG_PRESS_REP_TIME  100
     42 
     43 
     44 /*Gesture threshold in pixels*/
     45 #define LV_INDEV_DEF_GESTURE_LIMIT        50
     46 
     47 /*Gesture min velocity at release before swipe (pixels)*/
     48 #define LV_INDEV_DEF_GESTURE_MIN_VELOCITY 3
     49 
     50 
     51 /**********************
     52  *      TYPEDEFS
     53  **********************/
     54 
     55 struct _lv_obj_t;
     56 struct _lv_disp_t;
     57 struct _lv_group_t;
     58 struct _lv_indev_t;
     59 struct _lv_indev_drv_t;
     60 
     61 /** Possible input device types*/
     62 typedef enum {
     63     LV_INDEV_TYPE_NONE,    /**< Uninitialized state*/
     64     LV_INDEV_TYPE_POINTER, /**< Touch pad, mouse, external button*/
     65     LV_INDEV_TYPE_KEYPAD,  /**< Keypad or keyboard*/
     66     LV_INDEV_TYPE_BUTTON,  /**< External (hardware button) which is assigned to a specific point of the screen*/
     67     LV_INDEV_TYPE_ENCODER, /**< Encoder with only Left, Right turn and a Button*/
     68 } lv_indev_type_t;
     69 
     70 /** States for input devices*/
     71 typedef enum {
     72     LV_INDEV_STATE_RELEASED = 0,
     73     LV_INDEV_STATE_PRESSED
     74 } lv_indev_state_t;
     75 
     76 /** Data structure passed to an input driver to fill*/
     77 typedef struct {
     78     lv_point_t point; /**< For LV_INDEV_TYPE_POINTER the currently pressed point*/
     79     uint32_t key;     /**< For LV_INDEV_TYPE_KEYPAD the currently pressed key*/
     80     uint32_t btn_id;  /**< For LV_INDEV_TYPE_BUTTON the currently pressed button*/
     81     int16_t enc_diff; /**< For LV_INDEV_TYPE_ENCODER number of steps since the previous read*/
     82 
     83     lv_indev_state_t state; /**< LV_INDEV_STATE_REL or LV_INDEV_STATE_PR*/
     84     bool continue_reading;  /**< If set to true, the read callback is invoked again*/
     85 } lv_indev_data_t;
     86 
     87 /** Initialized by the user and registered by 'lv_indev_add()'*/
     88 typedef struct _lv_indev_drv_t {
     89 
     90     /**< Input device type*/
     91     lv_indev_type_t type;
     92 
     93     /**< Function pointer to read input device data.*/
     94     void (*read_cb)(struct _lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
     95 
     96     /** Called when an action happened on the input device.
     97      * The second parameter is the event from `lv_event_t`*/
     98     void (*feedback_cb)(struct _lv_indev_drv_t *, uint8_t);
     99 
    100 #if LV_USE_USER_DATA
    101     void * user_data;
    102 #endif
    103 
    104     /**< Pointer to the assigned display*/
    105     struct _lv_disp_t * disp;
    106 
    107     /**< Timer to periodically read the input device*/
    108     lv_timer_t * read_timer;
    109 
    110     /**< Number of pixels to slide before actually drag the object*/
    111     uint8_t scroll_limit;
    112 
    113     /**< Drag throw slow-down in [%]. Greater value means faster slow-down*/
    114     uint8_t scroll_throw;
    115 
    116     /**< At least this difference should be between two points to evaluate as gesture*/
    117     uint8_t gesture_min_velocity;
    118 
    119     /**< At least this difference should be to send a gesture*/
    120     uint8_t gesture_limit;
    121 
    122     /**< Long press time in milliseconds*/
    123     uint16_t long_press_time;
    124 
    125     /**< Repeated trigger period in long press [ms]*/
    126     uint16_t long_press_repeat_time;
    127 } lv_indev_drv_t;
    128 
    129 /** Run time data of input devices
    130  * Internally used by the library, you should not need to touch it.
    131  */
    132 typedef struct _lv_indev_proc_t {
    133     lv_indev_state_t state; /**< Current state of the input device.*/
    134     /*Flags*/
    135     uint8_t long_pr_sent : 1;
    136     uint8_t reset_query : 1;
    137     uint8_t disabled : 1;
    138     uint8_t wait_until_release : 1;
    139 
    140     union {
    141         struct {
    142             /*Pointer and button data*/
    143             lv_point_t act_point; /**< Current point of input device.*/
    144             lv_point_t last_point; /**< Last point of input device.*/
    145             lv_point_t last_raw_point; /**< Last point read from read_cb. */
    146             lv_point_t vect; /**< Difference between `act_point` and `last_point`.*/
    147             lv_point_t scroll_sum; /*Count the dragged pixels to check LV_INDEV_DEF_SCROLL_LIMIT*/
    148             lv_point_t scroll_throw_vect;
    149             lv_point_t scroll_throw_vect_ori;
    150             struct _lv_obj_t * act_obj;      /*The object being pressed*/
    151             struct _lv_obj_t * last_obj;     /*The last object which was pressed*/
    152             struct _lv_obj_t * scroll_obj;   /*The object being scrolled*/
    153             struct _lv_obj_t * last_pressed; /*The lastly pressed object*/
    154             lv_area_t scroll_area;
    155 
    156             lv_point_t gesture_sum; /*Count the gesture pixels to check LV_INDEV_DEF_GESTURE_LIMIT*/
    157             /*Flags*/
    158             lv_dir_t scroll_dir : 4;
    159             lv_dir_t gesture_dir : 4;
    160             uint8_t gesture_sent : 1;
    161         } pointer;
    162         struct {
    163             /*Keypad data*/
    164             lv_indev_state_t last_state;
    165             uint32_t last_key;
    166         } keypad;
    167     } types;
    168 
    169     uint32_t pr_timestamp;         /**< Pressed time stamp*/
    170     uint32_t longpr_rep_timestamp; /**< Long press repeat time stamp*/
    171 } _lv_indev_proc_t;
    172 
    173 /** The main input device descriptor with driver, runtime data ('proc') and some additional
    174  * information*/
    175 typedef struct _lv_indev_t {
    176     struct _lv_indev_drv_t * driver;
    177     _lv_indev_proc_t proc;
    178     struct _lv_obj_t * cursor;     /**< Cursor for LV_INPUT_TYPE_POINTER*/
    179     struct _lv_group_t * group;    /**< Keypad destination group*/
    180     const lv_point_t * btn_points; /**< Array points assigned to the button ()screen will be pressed
    181                                       here by the buttons*/
    182 } lv_indev_t;
    183 
    184 /**********************
    185  * GLOBAL PROTOTYPES
    186  **********************/
    187 
    188 /**
    189  * Initialize an input device driver with default values.
    190  * It is used to surely have known values in the fields and not memory junk.
    191  * After it you can set the fields.
    192  * @param driver pointer to driver variable to initialize
    193  */
    194 void lv_indev_drv_init(struct _lv_indev_drv_t * driver);
    195 
    196 /**
    197  * Register an initialized input device driver.
    198  * @param driver pointer to an initialized 'lv_indev_drv_t' variable (can be local variable)
    199  * @return pointer to the new input device or NULL on error
    200  */
    201 lv_indev_t * lv_indev_drv_register(struct _lv_indev_drv_t * driver);
    202 
    203 /**
    204  * Update the driver in run time.
    205  * @param indev pointer to an input device. (return value of `lv_indev_drv_register`)
    206  * @param new_drv pointer to the new driver
    207  */
    208 void lv_indev_drv_update(lv_indev_t * indev, struct _lv_indev_drv_t * new_drv);
    209 
    210 /**
    211 * Remove the provided input device. Make sure not to use the provided input device afterwards anymore.
    212 * @param indev pointer to delete
    213 */
    214 void lv_indev_delete(lv_indev_t * indev);
    215 
    216 /**
    217  * Get the next input device.
    218  * @param indev pointer to the current input device. NULL to initialize.
    219  * @return the next input device or NULL if there are no more. Provide the first input device when
    220  * the parameter is NULL
    221  */
    222 lv_indev_t * lv_indev_get_next(lv_indev_t * indev);
    223 
    224 /**
    225  * Read data from an input device.
    226  * @param indev pointer to an input device
    227  * @param data input device will write its data here
    228  */
    229 void _lv_indev_read(lv_indev_t * indev, lv_indev_data_t * data);
    230 
    231 /**********************
    232  *      MACROS
    233  **********************/
    234 
    235 #ifdef __cplusplus
    236 } /*extern "C"*/
    237 #endif
    238 
    239 #endif