diff --git a/main/display_gui.c b/main/display_gui.c new file mode 100644 --- /dev/null +++ b/main/display_gui.c @@ -0,0 +1,258 @@ +// +// display_gui: display elements onscreen +// + +#include "display_gui.h" +#include "display.h" +#include "esp_lvgl_port.h" +#include "esp_err.h" +#include "esp_log.h" +#include "esp_check.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + + + + +static lv_obj_t *ui_Screen1; +static lv_obj_t *ui_redsquare; + +static lv_obj_t *meter; +static lv_meter_indicator_t *meter_indic1; + +static lv_obj_t *ue_img_logo; +static lv_obj_t *esp_img_logo; +static lv_obj_t *label; + + +static lv_obj_t *ui_Dropdown2; + +LV_IMG_DECLARE(ue_logo) +LV_IMG_DECLARE(esp_logo) +LV_IMG_DECLARE(red_square) + + +void display_gui_homescreen(void) +{ + + // Actually create homescreen widgets + + + display_lock(0); + + label = lv_label_create(lv_scr_act()); + lv_label_set_text(label, "Yup"); + // lv_obj_align_to(label, lv_scr_act(), LV_ALIGN_OUT_BOTTOM_MID, 0, 10); + + + // display_slider(); + //Call one at a time to see examples + display_meter(); + // display_image(); + // display_window(); + //display_dropdown(); + + display_unlock(); +} + + + + + + + + + + + + + +void display_meter() +{ + meter = lv_meter_create(lv_scr_act()); + lv_obj_center(meter); + lv_obj_set_size(meter, 140, 140); + + /*Remove the circle from the middle*/ + lv_obj_remove_style(meter, NULL, LV_PART_INDICATOR); + + /*Add a scale first*/ + lv_meter_scale_t *scale = lv_meter_add_scale(meter); + lv_meter_set_scale_ticks(meter, scale, 11, 2, 10, lv_palette_main(LV_PALETTE_GREY)); + lv_meter_set_scale_major_ticks(meter, scale, 1, 2, 15, lv_color_hex3(0xeee), 10); + lv_meter_set_scale_range(meter, scale, 0, 100, 270, 90); + + /*Add a three arc indicator*/ + meter_indic1 = lv_meter_add_arc(meter, scale, 10, lv_color_hex3(0x00F), 0); + // lv_meter_indicator_t *indic2 = lv_meter_add_arc(meter, scale, 10, lv_color_hex3(0x0F0), -10); + // lv_meter_indicator_t *indic3 = lv_meter_add_arc(meter, scale, 10, lv_color_hex3(0xF00), -20); + + /*Create an animation to set the value*/ + /*lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_exec_cb(&a, set_value); + lv_anim_set_values(&a, 0, 100); + lv_anim_set_repeat_delay(&a, 100); + lv_anim_set_playback_delay(&a, 2000); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + + lv_anim_set_time(&a, 2000); + lv_anim_set_playback_time(&a, 500); + lv_anim_set_var(&a, indic1); + lv_anim_start(&a); */ + + /* + lv_anim_set_time(&a, 1000); + lv_anim_set_playback_time(&a, 1000); + lv_anim_set_var(&a, indic2); + lv_anim_start(&a); + + lv_anim_set_time(&a, 1000); + lv_anim_set_playback_time(&a, 2000); + lv_anim_set_var(&a, indic3); + lv_anim_start(&a); + */ + /* page 3 */ +} + +static void dropdown_event_handler(lv_event_t *e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t *obj = lv_event_get_target(e); + if (code == LV_EVENT_VALUE_CHANGED) + { + char buf[32]; + lv_dropdown_get_selected_str(obj, buf, sizeof(buf)); + LV_LOG_USER("Option: %s", buf); + } +} + +/** + * @brief dispaly dropdown is rotated 180 degrees (USB to the right is the orentation) + * + */ +void display_dropdown() +{ + lv_disp_t *dispp = lv_disp_get_default(); + ui_Dropdown2 = lv_dropdown_create(lv_scr_act()); + lv_dropdown_set_options(ui_Dropdown2, "Apple\n" + "Banana\n" + "Orange\n" + "Melon\n" + "Grape\n" + "Raspberry"); + lv_obj_set_width(ui_Dropdown2, 150); + lv_obj_set_height(ui_Dropdown2, LV_SIZE_CONTENT); /// 1 + lv_obj_set_x(ui_Dropdown2, 0); + lv_obj_set_y(ui_Dropdown2, -20); + lv_obj_set_align(ui_Dropdown2, LV_ALIGN_CENTER); + lv_obj_add_flag(ui_Dropdown2, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags + lv_obj_add_event_cb(ui_Dropdown2, dropdown_event_handler, LV_EVENT_ALL, NULL); +} + +void display_window() +{ + lv_obj_t *win = lv_win_create(lv_scr_act(), 40); + assert(win); + lv_win_add_title(win, "test123!"); +} + +void display_image() +{ + esp_img_logo = lv_img_create(lv_scr_act()); + lv_img_set_src(esp_img_logo, &esp_logo); + lv_obj_center(esp_img_logo); +} + +void display_red_square() +{ + // ui_Screen1 = lv_obj_create(NULL); + // lv_obj_clear_flag(ui_Screen1, LV_OBJ_FLAG_SCROLLABLE); /// Flags + + ui_redsquare = lv_img_create(lv_scr_act()); + lv_img_set_src(ui_redsquare, &red_square); + lv_obj_set_width(ui_redsquare, LV_SIZE_CONTENT); /// 1 + lv_obj_set_height(ui_redsquare, LV_SIZE_CONTENT); /// 1 + lv_obj_set_align(ui_redsquare, LV_ALIGN_CENTER); + lv_obj_add_flag(ui_redsquare, LV_OBJ_FLAG_ADV_HITTEST); /// Flags + lv_obj_clear_flag(ui_redsquare, LV_OBJ_FLAG_SCROLLABLE); /// Flags +} + +static void slider_event_cb(lv_event_t *e); +static lv_obj_t *slider_label; + +void display_slider() +{ + lv_disp_t *dispp = lv_disp_get_default(); + /*Create a slider in the center of the display*/ + lv_obj_t *slider = lv_slider_create(lv_scr_act()); + lv_obj_set_x(slider, 0); + lv_obj_set_y(slider, -40); + lv_obj_set_align(slider, LV_ALIGN_CENTER); + lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL); + + /*Create a label below the slider*/ + slider_label = lv_label_create(lv_scr_act()); + lv_label_set_text(slider_label, "0%"); + lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); +} + + + + +static void slider_event_cb(lv_event_t *e) +{ + lv_obj_t *slider = lv_event_get_target(e); + char buf[8]; + lv_snprintf(buf, sizeof(buf), "%d%%", (int)lv_slider_get_value(slider)); + lv_label_set_text(slider_label, buf); + lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); +} + +void get_img_color() +{ + lv_color_t pixel_color = lv_img_buf_get_px_color(&red_square, 50, 50, lv_color_make(0, 0, 0)); + uint32_t c32 = lv_color_to32(pixel_color); + printf("Pixel color: %lu \n", c32); +} + + + + + +static void set_value(void *indic, int32_t v) +{ + lv_meter_set_indicator_end_value(meter, indic, v); +} + + + +void display_update_text(char* str) +{ + display_lock(0); + lv_label_set_text(label, str); + display_unlock(); +} + + + +// make a display task that listens for messages from a queue that change visual elements +uint32_t value = 0; + +void display_gui_process(void) +{ + + display_lock(0); + + set_value(meter_indic1, value); + + value = (value + 1) % 100; + + display_unlock(); + +} + + + + +