Hardware Button

Overview

A Hardware Button is an external button typically located next to the screen and assigned to specific coordinates on the screen. If a button is pressed, it simulates a press at the assigned coordinate, similar to a touchpad.

To assign Hardware Buttons to coordinates, use lv_indev_set_button_points(my_indev, points_array).

points_array should look like this:

static const lv_point_t points_array[] = {
    {12,30}, /* First button is assigned to x=12; y=30 */
    {60,90}  /* Second button is assigned to x=60; y=90 */
};

Important:

points_array must not go out of scope. Declare it either as a global variable or as a static variable inside a function.

The index of the pressed button should be set in data->btn_id in the read_cb.

data->state should also be set to either LV_INDEV_STATE_PRESSED or LV_INDEV_STATE_RELEASED.

Example

Here is a complete example:

static const lv_point_t points_array[] = {
    {12,30}, /* First button is assigned to x=12; y=30 */
    {60,90}  /* Second button is assigned to x=60; y=90 */
};

lv_indev_t * indev = lv_indev_create();
lv_indev_set_type(indev, LV_INDEV_TYPE_BUTTON);
lv_indev_set_button_points(indev, points_array);
lv_indev_set_read_cb(indev, button_read);

...

void button_read(lv_indev_t * indev, lv_indev_data_t * data)
{
    /* Get the ID (0,1,2...) of the pressed button.
     * Let's say it returns -1 if no button was pressed */
    int btn_pr = my_btn_read();

    /* Is there a button press? */
    if(btn_pr >= 0) {
       data->btn_id = btn_pr;           /* Save the ID of the pressed button */
       data->state = LV_INDEV_STATE_PRESSED;  /* Set the pressed state */
    } else {
       data->state = LV_INDEV_STATE_RELEASED; /* Set the released state */
    }
}