Hello there ,
What do you want to achieve?
I’m trying to move a slider with an “ENCODER” type driver
Description
Using the same logic as button, I’m adding my slider to a group, and add the indev_driver to it. But the slider doesn’t move at all. I think I am missing something.
What MCU/Processor/Board and compiler are you using?
Board : Custom ESP32 board
IDE : platformIO
What LVGL version are you using?
LVGL 9.1
What have you tried so far?
I succeeded to control a group of 3 buttons (navigate between them , and press one). So I think my lv_indev is working right.
Code to reproduce
Declaring my indev driver in main.cpp :
btn_drv = lv_indev_create();
lv_indev_set_type(btn_drv, LV_INDEV_TYPE_ENCODER); /*Touchpad should have POINTER type*/
lv_indev_set_read_cb(btn_drv, bouton_read);
My callback function (may need to improve it) in main.cpp :
void bouton_read(lv_indev_t * drv, lv_indev_data_t* data) {
static uint32_t last_button_state = 0;
// Lecture de l'état actuel des boutons
uint32_t current_button_state = 0;
if (digitalRead(BTN_ENTER_PIN))
{
Serial.println("BTN ENTER PRESSED");
}
if (digitalRead(BTN_BACK_PIN))
{
Serial.println("BTN BACK PRESSED");
}
if (digitalRead(BTN_LEFT_PIN))
{
Serial.println("BTN LEFT PRESSED");
}
if (digitalRead(BTN_RIGHT_PIN))
{
Serial.println("BTN RIGHT PRESSED");
}
current_button_state |= digitalRead(BTN_ENTER_PIN) ? LV_KEY_ENTER : 0;
current_button_state |= digitalRead(BTN_BACK_PIN) ? LV_KEY_BACKSPACE : 0;
current_button_state |= digitalRead(BTN_LEFT_PIN) ? LV_KEY_LEFT : 0;
current_button_state |= digitalRead(BTN_RIGHT_PIN) ? LV_KEY_RIGHT : 0;
// Déterminer les touches enfoncées et relâchées depuis la dernière lecture
uint32_t diff = current_button_state ^ last_button_state;
last_button_state = current_button_state;
// Mettre à jour l'état des touches pour LVGL
data->state = diff ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
data->key = diff ? current_button_state : 0;
}
Slider declaration in screen_cfg_cq.cpp :
/*************************************/
/** Create first slider_score **/
/*************************************/
/*Create a slider_score in the center of the display*/
slider_score = lv_slider_create(scr_cfg_cq);
lv_obj_center(slider_score);
lv_slider_set_range(slider_score,MIN_SCORE,MAX_SCORE);
lv_slider_set_value(slider_score, DEFAULT_SCORE,LV_ANIM_OFF);
lv_obj_add_event_cb(slider_score, slider_score_event_cb, LV_EVENT_ALL, NULL);
sliderGroup = lv_group_create();
lv_group_add_obj(sliderGroup, slider_score);
Callback from a button to switch screen and set the lv_indev to the slider group :
static void btn_conq_cb(lv_event_t * e)
{
lv_event_code_t code = lv_event_get_code(e);
if(code == LV_EVENT_PRESSED) {
// Screen transition
lv_screen_load_anim(scr_cfg_cq, LV_SCR_LOAD_ANIM_OUT_LEFT, 800, 500, true);
// Set the drive to the right group
//lv_group_remove_obj(btn_conquest);
lv_indev_set_group(btn_drv, sliderGroup);
}
}
Screenshot and/or video
Slider displaying OK
Thanks,
Thomas.