(ESP-IDF)LVGL 对接 编码器
驱动编码器
这里使用 ESP-IDF 提供的驱动
#include "dev_knob.h"
#include "esp_log.h"
static const char *TAG = "dev_knob";
#define GPIO_KNOB_A 6
#define GPIO_KNOB_B 10
knob_handle_t knob_handle = NULL;
static void knob_left_cb(void *arg, void *data) {
ESP_LOGI(TAG, "knob left");
}
static void knob_right_cb(void *arg, void *data) {
ESP_LOGI(TAG, "knob right");
}
void lvdev_knob_init(void) {
knob_config_t cfg = {
.default_direction = 0,
.gpio_encoder_a = GPIO_KNOB_A,
.gpio_encoder_b = GPIO_KNOB_B,
};
knob_handle = iot_knob_create(&cfg);
iot_knob_register_cb(knob_handle, KNOB_LEFT, knob_left_cb, NULL);
iot_knob_register_cb(knob_handle, KNOB_RIGHT, knob_right_cb, NULL);
}
对接 LVGL
indev_encoder需要引出被外部调用
static void encoder_init(void) {
lvdev_knob_init();
}
static void encoder_read(lv_indev_t *indev_drv, lv_indev_data_t *data) {
static int32_t last_encoder_count = 0;
knob_event_t current_event = iot_knob_get_event(knob_handle);
int32_t current_count = iot_knob_get_count_value(knob_handle);
// 计算编码器差值
int32_t encoder_diff = current_count - last_encoder_count;
// 根据事件类型设置编码器差值
switch (current_event) {
case KNOB_LEFT:
data->enc_diff = -1;
break;
case KNOB_RIGHT:
data->enc_diff = 1;
break;
case KNOB_NONE:
data->enc_diff = encoder_diff;
break;
default:
data->enc_diff = 0;
break;
}
last_encoder_count = current_count;
data->state = module_button_get_press_state() ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED;
data->continue_reading = false;
}
lv_indev_t *indev_encoder;
void lv_port_knob_init(void) {
encoder_init();
indev_encoder = lv_indev_create();
lv_indev_set_type(indev_encoder, LV_INDEV_TYPE_ENCODER);
lv_indev_set_read_cb(indev_encoder, encoder_read);
}
控件加入组并接入编码器
// 创建组
lv_group_t *group = lv_group_create();
lv_group_set_wrap(group, true);
// 组绑定编码器
lv_indev_set_group(encoder_indev, group);
// 把控件加入组
lv_group_add_obj(lvsc_main.group, page);
// 添加聚焦事件
lv_obj_add_event_cb(page, lvsc_event_cb, LV_EVENT_FOCUSED, NULL);
// 初始聚焦哪个控件
lv_group_focus_obj(lv_group_get_focused(group));
License:
CC BY 4.0