Removes the pseudo device prerequisite that the LVGL setup routine has been executed before initialization. The pseudo devices are now registered at the end of the LVGL setup routine, the driver is not concerned with configuring the devices anymore. This also removes the need for enforcing certain priorities within the same init level. This resolves issue #62753. Signed-off-by: Fabian Blatz <fabianblatz@gmail.com>
88 lines
3.3 KiB
C
88 lines
3.3 KiB
C
/*
|
|
* Copyright 2023 Fabian Blatz <fabianblatz@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#define DT_DRV_COMPAT zephyr_lvgl_button_input
|
|
|
|
#include "lvgl_common_input.h"
|
|
#include "lvgl_button_input.h"
|
|
|
|
#include <zephyr/logging/log.h>
|
|
|
|
LOG_MODULE_DECLARE(lvgl);
|
|
|
|
struct lvgl_button_input_config {
|
|
struct lvgl_common_input_config common_config; /* Needs to be first member */
|
|
const uint16_t *input_codes;
|
|
uint8_t num_codes;
|
|
const lv_coord_t *coordinates;
|
|
};
|
|
|
|
static void lvgl_button_process_event(const struct device *dev, struct input_event *evt)
|
|
{
|
|
struct lvgl_common_input_data *data = dev->data;
|
|
const struct lvgl_button_input_config *cfg = dev->config;
|
|
uint8_t i;
|
|
|
|
for (i = 0; i < cfg->num_codes; i++) {
|
|
if (evt->code == cfg->input_codes[i]) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (i == cfg->num_codes) {
|
|
LOG_DBG("Ignored input event: %u", evt->code);
|
|
return;
|
|
}
|
|
|
|
data->pending_event.btn_id = i;
|
|
data->pending_event.state = evt->value ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
|
|
|
|
if (k_msgq_put(cfg->common_config.event_msgq, &data->pending_event, K_NO_WAIT) != 0) {
|
|
LOG_WRN("Could not put input data into queue");
|
|
}
|
|
}
|
|
|
|
int lvgl_button_input_init(const struct device *dev)
|
|
{
|
|
struct lvgl_common_input_data *data = dev->data;
|
|
const struct lvgl_button_input_config *cfg = dev->config;
|
|
int ret;
|
|
|
|
ret = lvgl_input_register_driver(LV_INDEV_TYPE_BUTTON, dev);
|
|
if (ret < 0) {
|
|
return ret;
|
|
}
|
|
|
|
lv_indev_set_button_points(data->indev, (const lv_point_t *)cfg->coordinates);
|
|
|
|
return ret;
|
|
}
|
|
|
|
#define ASSERT_PROPERTIES(inst) \
|
|
BUILD_ASSERT(DT_INST_PROP_LEN(inst, input_codes) * 2 == \
|
|
DT_INST_PROP_LEN(inst, coordinates), \
|
|
"Property coordinates must contain one coordinate per input-code.")
|
|
|
|
#define LVGL_BUTTON_INPUT_DEFINE(inst) \
|
|
ASSERT_PROPERTIES(inst); \
|
|
LVGL_INPUT_DEFINE(inst, button, CONFIG_LV_Z_BUTTON_INPUT_MSGQ_COUNT, \
|
|
lvgl_button_process_event); \
|
|
static const uint16_t lvgl_button_input_codes_##inst[] = DT_INST_PROP(inst, input_codes); \
|
|
static const lv_coord_t lvgl_button_coordinates_##inst[] = \
|
|
DT_INST_PROP(inst, coordinates); \
|
|
static const struct lvgl_button_input_config lvgl_button_input_config_##inst = { \
|
|
.common_config.event_msgq = &LVGL_INPUT_EVENT_MSGQ(inst, button), \
|
|
.input_codes = lvgl_button_input_codes_##inst, \
|
|
.num_codes = DT_INST_PROP_LEN(inst, input_codes), \
|
|
.coordinates = lvgl_button_coordinates_##inst, \
|
|
}; \
|
|
static struct lvgl_common_input_data lvgl_common_input_data_##inst; \
|
|
DEVICE_DT_INST_DEFINE(inst, NULL, NULL, &lvgl_common_input_data_##inst, \
|
|
&lvgl_button_input_config_##inst, POST_KERNEL, \
|
|
CONFIG_INPUT_INIT_PRIORITY, NULL);
|
|
|
|
DT_INST_FOREACH_STATUS_OKAY(LVGL_BUTTON_INPUT_DEFINE)
|