From bf85c544f58e3caffeedc94238bbbd5cdd821ff0 Mon Sep 17 00:00:00 2001 From: Marc PASTEUR Date: Mon, 15 Dec 2025 07:05:50 +0100 Subject: [PATCH] fonctionne qemu + linux host --- .devcontainer/Dockerfile | 13 +++++ .devcontainer/devcontainer.json | 21 ++++++++ components/domotic_display/ihm.c | 53 +++++++++++++++++-- components/domotic_display/model.c | 6 +-- .../test_host/main/CMakeLists.txt | 2 + .../domotic_display/test_host/main/test_ihm.c | 13 ++++- main/Kconfig.projbuild | 10 +++- sdkconfig.defaults | 2 +- 8 files changed, 108 insertions(+), 12 deletions(-) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..dafb8ad --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,13 @@ +ARG DOCKER_TAG=latest +FROM espressif/idf:${DOCKER_TAG} + +ENV LC_ALL=C.UTF-8 +ENV LANG=C.UTF-8 + +RUN apt-get update -y && apt-get install udev -y + +RUN echo "source /opt/esp/idf/export.sh > /dev/null 2>&1" >> ~/.bashrc + +ENTRYPOINT [ "/opt/esp/entrypoint.sh" ] + +CMD ["/bin/bash", "-c"] \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..b801786 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,21 @@ +{ + "name": "ESP-IDF QEMU", + "build": { + "dockerfile": "Dockerfile" + }, + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.defaultProfile.linux": "bash", + "idf.espIdfPath": "/opt/esp/idf", + "idf.toolsPath": "/opt/esp", + "idf.gitPath": "/usr/bin/git" + }, + "extensions": [ + "espressif.esp-idf-extension", + "espressif.esp-idf-web" + ] + } + }, + "runArgs": ["--privileged"] +} \ No newline at end of file diff --git a/components/domotic_display/ihm.c b/components/domotic_display/ihm.c index 1d4db4a..a2ecc0f 100644 --- a/components/domotic_display/ihm.c +++ b/components/domotic_display/ihm.c @@ -1105,6 +1105,45 @@ static lv_style_t no_padding; static lv_style_t objstyle; static lv_style_t txtstyle; +void coverCardContent(lv_obj_t *cont_colVolets) +{ + lv_obj_set_style_pad_all(cont_colVolets, 5, 0); + lv_obj_set_flex_align(cont_colVolets, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_set_size(cont_colVolets, lv_pct(60), lv_pct(70)); + lv_obj_set_flex_flow(cont_colVolets, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(cont_colVolets, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_BETWEEN, LV_FLEX_ALIGN_CENTER); + + lv_obj_t *btnUp = lv_button_create(cont_colVolets); + lv_obj_add_style(btnUp, &style_btn, 0); + lv_obj_add_event_cb(btnUp, event_handler, LV_EVENT_ALL, upEvent); + //lv_obj_align(btnUp, LV_ALIGN_CENTER, 0, -40); + lv_obj_remove_flag(btnUp, LV_OBJ_FLAG_PRESS_LOCK); + lv_obj_t *label = lv_label_create(btnUp); + lv_obj_add_style(label, &style_lbvValue, 0); + lv_label_set_text(label, LV_SYMBOL_UP); + lv_obj_center(label); + + lv_obj_t *btnDwn = lv_button_create(cont_colVolets); + lv_obj_add_style(btnDwn, &style_btn, 0); + lv_obj_add_event_cb(btnDwn, event_handler, LV_EVENT_ALL, downEvent); + //lv_obj_align(btnDwn, LV_ALIGN_CENTER, 0, -40); + lv_obj_remove_flag(btnDwn, LV_OBJ_FLAG_PRESS_LOCK); + label = lv_label_create(btnDwn); + lv_obj_add_style(label, &style_lbvValue, 0); + lv_label_set_text(label, LV_SYMBOL_DOWN); + lv_obj_center(label); +} +void meteoCardContent(lv_obj_t *container) +{ + lv_obj_t *txt = lv_label_create(container); + lv_label_set_text(txt, "Meteo"); +} +void minuteurCardContent(lv_obj_t *container) +{ + lv_obj_t *txt = lv_label_create(container); + lv_label_set_text(txt, "Minuteur"); +} + void draw_ihm() { @@ -1197,11 +1236,11 @@ void draw_ihm() lv_obj_set_style_pad_column(apps,6, 0); - create_card(apps, "Météo"); + create_card(apps, "Météo", meteoCardContent); - create_card(apps, "Volets"); - create_card(apps,"Minuteur"); - create_card(apps,"Messagerie"); + create_card(apps, "Volets", coverCardContent); + create_card(apps, "Minuteur", minuteurCardContent); + create_card(apps, "Messagerie", coverCardContent); return; // *************************************************************************************************** @@ -1268,7 +1307,8 @@ void draw_ihm() lv_obj_set_flex_flow(tabMeteo, LV_FLEX_FLOW_COLUMN); } -void create_card(lv_obj_t *parent, char *lbl) + +void create_card(lv_obj_t *parent, char *lbl, void(*contentFct)(lv_obj_t*)) { //lv_style_init(&objstyle); //lv_style_init(&txtstyle); @@ -1301,6 +1341,9 @@ void create_card(lv_obj_t *parent, char *lbl) lv_obj_set_style_radius(icon, LV_COORD_MAX, 0); // lv_obj_add_style(icon, &c->styles[STYLE_COLOR_ACCENT][STYLE_TYPE_A8_IMG], 0); lv_obj_add_flag(icon, LV_OBJ_FLAG_EVENT_BUBBLE); + + lv_obj_t *content = lv_obj_create(app_card); + contentFct(content); } void log_cb(lv_log_level_t level, const char * buf){ diff --git a/components/domotic_display/model.c b/components/domotic_display/model.c index 5f03642..fe2688a 100644 --- a/components/domotic_display/model.c +++ b/components/domotic_display/model.c @@ -4,6 +4,6 @@ lv_subject_t hourSubj; lv_subject_t minuteSubj; lv_subject_t timeGroup; -lv_color_t base = LV_COLOR_MAKE(126, 94, 133); -lv_color_t accent = LV_COLOR_MAKE(204, 16, 16); -lv_color_t bgColor = LV_COLOR_MAKE(235, 199, 158); +//lv_color_t base = LV_COLOR_MAKE(126, 94, 133); +//lv_color_t accent = LV_COLOR_MAKE(204, 16, 16); +//lv_color_t bgColor = LV_COLOR_MAKE(235, 199, 158); diff --git a/components/domotic_display/test_host/main/CMakeLists.txt b/components/domotic_display/test_host/main/CMakeLists.txt index d8ada2e..09e292b 100644 --- a/components/domotic_display/test_host/main/CMakeLists.txt +++ b/components/domotic_display/test_host/main/CMakeLists.txt @@ -10,6 +10,8 @@ idf_component_register(SRCS "../../fonts/montserrat_medium_24.c" "../../fonts/roboto_medium_36.c" "../../fonts/roboto_medium_72.c" + "../../images/wifi_ko.c" + "../../images/wifi_ok.c" INCLUDE_DIRS "../../include" WHOLE_ARCHIVE diff --git a/components/domotic_display/test_host/main/test_ihm.c b/components/domotic_display/test_host/main/test_ihm.c index ec56010..510e1a8 100644 --- a/components/domotic_display/test_host/main/test_ihm.c +++ b/components/domotic_display/test_host/main/test_ihm.c @@ -11,7 +11,10 @@ #include "simulator_util.h" #include "simulator_settings.h" #include "esp_log.h" +#include "eventsManager.h" + esp_mqtt_client_handle_t client; +SemaphoreHandle_t lvgl_mux; /* contains the name of the selected backend if user * has specified one on the command line */ @@ -138,6 +141,10 @@ int app_main(int argc, char *argv[]) { /* code */ printf("hello\n"); + + lvgl_mux = xSemaphoreCreateRecursiveMutex(); + assert(lvgl_mux); + init_display_ihm(); /* Initialize LVGL. */ @@ -163,10 +170,14 @@ int app_main(int argc, char *argv[]) /*lv_timer_t *clock_timer = */lv_timer_create(clock_timer_cb, 1000, NULL); //draw_ihm(); - drawIhm(NULL); + startEvtManager(); + + xTaskCreate(drawIhm, "LVGL", 128 * 1024, getIHMQueueHandle(), 3, NULL); /* Enter the run loop of the selected backend */ driver_backends_run_loop(); + //drawIhm(getIHMQueueHandle()); + return 0; } diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index 574a7c0..a025bbd 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -12,11 +12,17 @@ menu "Domotic Configuration" help WiFi password (WPA or WPA2) for the example to use. - #config GPIO_INPUT_CAPTEUR_PIR + config EXAMPLE_QEMU_RGB_PANEL_DEDIC_FB + bool "Use QEMU RGB panel dedicated framebuffer" + default "n" + help + Use QEMU RGB panel dedicated framebuffer as the framebuffer for LVGL. + + #config GPIO_INPUT_CAPTEUR_PIR # int "GPIO PIN Capteur PIR" # range ENV_GPIO_RANGE_MIN ENV_GPIO_IN_RANGE_MAX # default 4 # help # GPIO pin à utiliser pour le capteur de présence IR. -endmenu +endmenu \ No newline at end of file diff --git a/sdkconfig.defaults b/sdkconfig.defaults index f42cae9..90f5e5b 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -8,7 +8,7 @@ CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_COMPILER_OPTIMIZATION_SIZE=y CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE=y CONFIG_SPIRAM=y -CONFIG_SPIRAM_MODE_QUAD=y +CONFIG_SPIRAM_MODE_OCT=y CONFIG_SPIRAM_IGNORE_NOTFOUND=y # CONFIG_SPIRAM_MEMTEST is not set