From 97afa5926542277a89f6ab98546841ddd13f8396 Mon Sep 17 00:00:00 2001 From: Marc Date: Fri, 1 Nov 2024 08:53:42 +0100 Subject: [PATCH] fonctionnel avec nvelle gestion images --- .gitmodules | 6 + .vscode/settings.json | 8 +- components/esp_littlefs | 1 + components/image_downloader/CMakeLists.txt | 2 +- .../image_downloader/image_downloader.c | 2 +- components/littlefs | 1 + components/meteofrance/meteofrance.c | 2 +- main/CMakeLists.txt | 15 +- main/idf_component.yml | 1 + main/images/mqtt_ko.png | Bin 0 -> 13632 bytes main/images/mqtt_ok.png | Bin 0 -> 15353 bytes main/images/wifi_ko.png | Bin 0 -> 483 bytes main/images/wifi_ko_orig.png | Bin 0 -> 10526 bytes main/images/wifi_ok.png | Bin 0 -> 372 bytes main/images/wifi_ok_orig.png | Bin 0 -> 10927 bytes main/{images => images_meteo}/p10j.png | Bin main/{images => images_meteo}/p10n.png | Bin main/{images => images_meteo}/p11j.png | Bin main/{images => images_meteo}/p11n.png | Bin main/{images => images_meteo}/p12bisj.png | Bin main/{images => images_meteo}/p12j.png | Bin main/{images => images_meteo}/p12n.png | Bin main/{images => images_meteo}/p13bisj.png | Bin main/{images => images_meteo}/p13j.png | Bin main/{images => images_meteo}/p13n.png | Bin main/{images => images_meteo}/p14bisj.png | Bin main/{images => images_meteo}/p14j.png | Bin main/{images => images_meteo}/p14n.png | Bin main/{images => images_meteo}/p15j.png | Bin main/{images => images_meteo}/p15n.png | Bin main/{images => images_meteo}/p16bisj.png | Bin main/{images => images_meteo}/p16j.png | Bin main/{images => images_meteo}/p16n.png | Bin main/{images => images_meteo}/p17j.png | Bin main/{images => images_meteo}/p17n.png | Bin main/{images => images_meteo}/p18j.png | Bin main/{images => images_meteo}/p18n.png | Bin main/{images => images_meteo}/p19j.png | Bin main/{images => images_meteo}/p19n.png | Bin main/{images => images_meteo}/p1j.png | Bin main/{images => images_meteo}/p1n.png | Bin main/{images => images_meteo}/p20j.png | Bin main/{images => images_meteo}/p20n.png | Bin main/{images => images_meteo}/p21j.png | Bin main/{images => images_meteo}/p21n.png | Bin main/{images => images_meteo}/p22j.png | Bin main/{images => images_meteo}/p22n.png | Bin main/{images => images_meteo}/p23j.png | Bin main/{images => images_meteo}/p23n.png | Bin main/{images => images_meteo}/p24j.png | Bin main/{images => images_meteo}/p24n.png | Bin main/{images => images_meteo}/p25j.png | Bin main/{images => images_meteo}/p25n.png | Bin main/{images => images_meteo}/p26j.png | Bin main/{images => images_meteo}/p26n.png | Bin main/{images => images_meteo}/p27j.png | Bin main/{images => images_meteo}/p27n.png | Bin main/{images => images_meteo}/p28j.png | Bin main/{images => images_meteo}/p28n.png | Bin main/{images => images_meteo}/p29j.png | Bin main/{images => images_meteo}/p29n.png | Bin main/{images => images_meteo}/p2j.png | Bin main/{images => images_meteo}/p2n.png | Bin main/{images => images_meteo}/p30j.png | Bin main/{images => images_meteo}/p30n.png | Bin main/{images => images_meteo}/p31j.png | Bin main/{images => images_meteo}/p31n.png | Bin main/{images => images_meteo}/p32j.png | Bin main/{images => images_meteo}/p32n.png | Bin main/{images => images_meteo}/p3j.png | Bin main/{images => images_meteo}/p3n.png | Bin main/{images => images_meteo}/p4j.png | Bin main/{images => images_meteo}/p4n.png | Bin main/{images => images_meteo}/p5bisj.png | Bin main/{images => images_meteo}/p5j.png | Bin main/{images => images_meteo}/p5n.png | Bin main/{images => images_meteo}/p6j.png | Bin main/{images => images_meteo}/p6n.png | Bin main/{images => images_meteo}/p7j.png | Bin main/{images => images_meteo}/p7n.png | Bin main/{images => images_meteo}/p8j.png | Bin main/{images => images_meteo}/p8n.png | Bin main/{images => images_meteo}/p9j.png | Bin main/{images => images_meteo}/p9n.png | Bin main/main.c | 177 ++++++++++++++---- main/mqtt.c | 62 +++++- main/wifi.c | 35 +++- partition_table/partitionTable.bin | Bin 3072 -> 0 bytes partition_table/partitionTable.csv | 2 +- partitions.csv | 2 +- sdkconfig | 68 ++++--- 91 files changed, 313 insertions(+), 71 deletions(-) create mode 100644 .gitmodules create mode 160000 components/esp_littlefs create mode 160000 components/littlefs create mode 100644 main/images/mqtt_ko.png create mode 100644 main/images/mqtt_ok.png create mode 100644 main/images/wifi_ko.png create mode 100644 main/images/wifi_ko_orig.png create mode 100644 main/images/wifi_ok.png create mode 100644 main/images/wifi_ok_orig.png rename main/{images => images_meteo}/p10j.png (100%) rename main/{images => images_meteo}/p10n.png (100%) rename main/{images => images_meteo}/p11j.png (100%) rename main/{images => images_meteo}/p11n.png (100%) rename main/{images => images_meteo}/p12bisj.png (100%) rename main/{images => images_meteo}/p12j.png (100%) rename main/{images => images_meteo}/p12n.png (100%) rename main/{images => images_meteo}/p13bisj.png (100%) rename main/{images => images_meteo}/p13j.png (100%) rename main/{images => images_meteo}/p13n.png (100%) rename main/{images => images_meteo}/p14bisj.png (100%) rename main/{images => images_meteo}/p14j.png (100%) rename main/{images => images_meteo}/p14n.png (100%) rename main/{images => images_meteo}/p15j.png (100%) rename main/{images => images_meteo}/p15n.png (100%) rename main/{images => images_meteo}/p16bisj.png (100%) rename main/{images => images_meteo}/p16j.png (100%) rename main/{images => images_meteo}/p16n.png (100%) rename main/{images => images_meteo}/p17j.png (100%) rename main/{images => images_meteo}/p17n.png (100%) rename main/{images => images_meteo}/p18j.png (100%) rename main/{images => images_meteo}/p18n.png (100%) rename main/{images => images_meteo}/p19j.png (100%) rename main/{images => images_meteo}/p19n.png (100%) rename main/{images => images_meteo}/p1j.png (100%) rename main/{images => images_meteo}/p1n.png (100%) rename main/{images => images_meteo}/p20j.png (100%) rename main/{images => images_meteo}/p20n.png (100%) rename main/{images => images_meteo}/p21j.png (100%) rename main/{images => images_meteo}/p21n.png (100%) rename main/{images => images_meteo}/p22j.png (100%) rename main/{images => images_meteo}/p22n.png (100%) rename main/{images => images_meteo}/p23j.png (100%) rename main/{images => images_meteo}/p23n.png (100%) rename main/{images => images_meteo}/p24j.png (100%) rename main/{images => images_meteo}/p24n.png (100%) rename main/{images => images_meteo}/p25j.png (100%) rename main/{images => images_meteo}/p25n.png (100%) rename main/{images => images_meteo}/p26j.png (100%) rename main/{images => images_meteo}/p26n.png (100%) rename main/{images => images_meteo}/p27j.png (100%) rename main/{images => images_meteo}/p27n.png (100%) rename main/{images => images_meteo}/p28j.png (100%) rename main/{images => images_meteo}/p28n.png (100%) rename main/{images => images_meteo}/p29j.png (100%) rename main/{images => images_meteo}/p29n.png (100%) rename main/{images => images_meteo}/p2j.png (100%) rename main/{images => images_meteo}/p2n.png (100%) rename main/{images => images_meteo}/p30j.png (100%) rename main/{images => images_meteo}/p30n.png (100%) rename main/{images => images_meteo}/p31j.png (100%) rename main/{images => images_meteo}/p31n.png (100%) rename main/{images => images_meteo}/p32j.png (100%) rename main/{images => images_meteo}/p32n.png (100%) rename main/{images => images_meteo}/p3j.png (100%) rename main/{images => images_meteo}/p3n.png (100%) rename main/{images => images_meteo}/p4j.png (100%) rename main/{images => images_meteo}/p4n.png (100%) rename main/{images => images_meteo}/p5bisj.png (100%) rename main/{images => images_meteo}/p5j.png (100%) rename main/{images => images_meteo}/p5n.png (100%) rename main/{images => images_meteo}/p6j.png (100%) rename main/{images => images_meteo}/p6n.png (100%) rename main/{images => images_meteo}/p7j.png (100%) rename main/{images => images_meteo}/p7n.png (100%) rename main/{images => images_meteo}/p8j.png (100%) rename main/{images => images_meteo}/p8n.png (100%) rename main/{images => images_meteo}/p9j.png (100%) rename main/{images => images_meteo}/p9n.png (100%) delete mode 100644 partition_table/partitionTable.bin diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..c1c4323 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "components/littlefs"] + path = components/littlefs + url = https://github.com/littlefs-project/littlefs.git +[submodule "components/esp_littlefs"] + path = components/esp_littlefs + url = https://github.com/joltwallet/esp_littlefs.git diff --git a/.vscode/settings.json b/.vscode/settings.json index 826b555..10b3089 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,6 +7,12 @@ "esp_log.h": "c", "esp_wifi.h": "c", "esp_lvgl_port.h": "c", - "mqtt.h": "c" + "mqtt.h": "c", + "stdio.h": "c", + "locale.h": "c", + "obtain_time.h": "c", + "i2c.h": "c", + "lv_global.h": "c", + "cstdint": "c" } } \ No newline at end of file diff --git a/components/esp_littlefs b/components/esp_littlefs new file mode 160000 index 0000000..28639dd --- /dev/null +++ b/components/esp_littlefs @@ -0,0 +1 @@ +Subproject commit 28639dd469af0b33df55d481da8383347e88067e diff --git a/components/image_downloader/CMakeLists.txt b/components/image_downloader/CMakeLists.txt index c89003a..e4bf1a5 100644 --- a/components/image_downloader/CMakeLists.txt +++ b/components/image_downloader/CMakeLists.txt @@ -1,3 +1,3 @@ idf_component_register(SRCS "image_downloader.c" INCLUDE_DIRS "include" - REQUIRES json esp_http_client esp-tls esp_timer fatfs sdmmc vfs) + REQUIRES json esp_http_client esp-tls esp_timer ) diff --git a/components/image_downloader/image_downloader.c b/components/image_downloader/image_downloader.c index 7b23616..5b6b8f2 100644 --- a/components/image_downloader/image_downloader.c +++ b/components/image_downloader/image_downloader.c @@ -52,7 +52,7 @@ static const char *TAG = "ImgDwn"; #define IMGDWN_WIDTH 600 #define IMGDWN_HEIGHT 460 #define IMGDWN_URL2 ("http://vps-edf71efa.vps.ovh.net:3000/render/d-solo/7BtRMrv4k/temperatures?orgId=1&var-emplacement=entree_ECS&var-emplacement=entree_reseauSol&panelId=4&width=650&height=460&scale=1&tz=Europe%2FParis/") -#define IMGDWN_URL ("http://vps-edf71efa.vps.ovh.net:3000/render/d-solo/bOcPeysGz/hauteur-cuve?orgId=1&from=now-2d&refresh=1m&panelId=4&width=650&height=460&scale=1&tz=Europe%2FParis") +#define IMGDWN_URL ("http://vps-edf71efa.vps.ovh.net:3000/render/d-solo/bOcPeysGz/hauteur-cuve?orgId=1&from=now-2d&refresh=1m&panelId=4&width=300&height=200&scale=1&tz=Europe%2FParis") // 650 460 // As default is 512 without setting buffer_size property in esp_http_client_config_t #define HTTP_RECEIVE_BUFFER_SIZE 1938 diff --git a/components/littlefs b/components/littlefs new file mode 160000 index 0000000..d01280e --- /dev/null +++ b/components/littlefs @@ -0,0 +1 @@ +Subproject commit d01280e64934a09ba16cac60cf9d3a37e228bb66 diff --git a/components/meteofrance/meteofrance.c b/components/meteofrance/meteofrance.c index f870228..53dd0f6 100644 --- a/components/meteofrance/meteofrance.c +++ b/components/meteofrance/meteofrance.c @@ -385,7 +385,7 @@ void initialise_weather_data_retrieval(unsigned long retreival_period) // http_client_on_process_chunk(&http_client, process_chunk); // http_client_on_disconnected(&http_client, disconnected); TaskHandle_t xHandle = NULL; - BaseType_t ret1 = xTaskCreate(&http_request_task, "http_request_task", 8 * 1024, NULL, 5, &xHandle); + BaseType_t ret1 = xTaskCreate(&http_request_task, "http_request_task", 5 * 1024, NULL, 5, &xHandle); if(ret1!=pdPASS ){ ESP_LOGE(TAG, "Impossible de creer la tache %i", ret1); } diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 53f3361..348fe82 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,8 +1,14 @@ idf_component_register(SRC_DIRS . fonts INCLUDE_DIRS "." - REQUIRES heap esp_wifi nvs_flash mqtt meteofrance esp_netif image_downloader) -lvgl_port_create_c_image("images/p13bisj.png" "images/" "ARGB8888" "NONE") -#lvgl_port_create_c_image("images/esp_logo.png" "images/" "ARGB8888" "NONE") + REQUIRES heap esp_wifi nvs_flash mqtt meteofrance esp_netif image_downloader fatfs sdmmc vfs littlefs + PRIV_REQUIRES littlefs) + +lvgl_port_create_c_image("images/wifi_ok.png" "images/" "ARGB8888" "NONE") +lvgl_port_create_c_image("images/wifi_ko.png" "images/" "ARGB8888" "NONE") +lvgl_port_create_c_image("images/mqtt_ok.png" "images/" "AUTO" "NONE") +lvgl_port_create_c_image("images/mqtt_ko.png" "images/" "ARGB8888" "NONE") +# lvgl_port_create_c_image("images/p13bisj.png" "images/" "ARGB8888" "NONE") +# lvgl_port_create_c_image("images/esp_logo.png" "images/" "ARGB8888" "NONE") # lvgl_port_create_c_image("images/p10j.png" "images/" "ARGB8888" "NONE") # lvgl_port_create_c_image("images/p10n.png" "images/" "ARGB8888" "NONE") # lvgl_port_create_c_image("images/p11j.png" "images/" "ARGB8888" "NONE") @@ -74,6 +80,9 @@ lvgl_port_create_c_image("images/p13bisj.png" "images/" "ARGB8888" "NONE") lvgl_port_add_images(${COMPONENT_LIB} "images/") +littlefs_create_partition_image(littlefs images_meteo FLASH_IN_PROJECT) + + set_source_files_properties( PROPERTIES COMPILE_OPTIONS "-DLV_LVGL_H_INCLUDE_SIMPLE;-Wno-format;-DLV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(montserrat_medium_12) LV_FONT_DECLARE(montserrat_medium_18) LV_FONT_DECLARE(montserrat_medium_24)" diff --git a/main/idf_component.yml b/main/idf_component.yml index 9b7ef01..8343ec4 100644 --- a/main/idf_component.yml +++ b/main/idf_component.yml @@ -1,4 +1,5 @@ dependencies: + joltwallet/littlefs: ^1.14.8 esp_lcd_touch_gt911: version: ^1 esp_lvgl_port: diff --git a/main/images/mqtt_ko.png b/main/images/mqtt_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..b926476f567cdb3c90123f8183ea0fce500a8e34 GIT binary patch literal 13632 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 literal 0 HcmV?d00001 diff --git a/main/images/mqtt_ok.png b/main/images/mqtt_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..77ae13aa943b4cf6a0090720aacfe213ba09d2b6 GIT binary patch literal 15353 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 literal 0 HcmV?d00001 diff --git a/main/images/wifi_ko.png b/main/images/wifi_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..30fd494dcd9ff1aed0c28c5bbe5c8c3fc9ceabd6 GIT binary patch literal 483 zcmV<90UZ8`P)pGl}SWFR49>Mkg>19P!xxM)u(euI#?m-KcOsY>P9*kg;=p5p}pq~_dQSEH{IO(JLi1of-&ZK9ueJcH`6qAT~`zZ zK)2f^qFSw%PN#{e)9J{v4Bz*OXf~ULLLmT>B&AZRLZM)qCJ_yXLjZ|HLKH{&G#c4#b~>FBQLonnkW3~; zQOsmAsMqVG(TIrF>$R$?0D{3FfPTMEM9pTiTrLyQU@(ZqV&E&z=W_tEERVT!zD8%d%|SmL#cED&=xH#uxx15(ELfi2sc1y3uG9Kp+qh z1Ob4q>zB*rJ?baTeKbuI1Yt6nT(8&D>C|eq02qcrM6cKDFU?CG$JuVTM6_D1T-PNc z+qRF#NvpU-ax Z&Nt+RW%>tWr_MScE?8GZpCLF9ntS}gi12Dae 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 V@<9v!f$lcK03)l*)t6lF{vZ7}&Efz6 literal 0 HcmV?d00001 diff --git a/main/images/wifi_ok.png b/main/images/wifi_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..9205a9d2a05e0c59854193538a11f31cbcf84501 GIT binary patch literal 372 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 DJP>KW literal 0 HcmV?d00001 diff --git a/main/images/p10j.png b/main/images_meteo/p10j.png similarity index 100% rename from main/images/p10j.png rename to main/images_meteo/p10j.png diff --git a/main/images/p10n.png b/main/images_meteo/p10n.png similarity index 100% rename from main/images/p10n.png rename to main/images_meteo/p10n.png diff --git a/main/images/p11j.png b/main/images_meteo/p11j.png similarity index 100% rename from main/images/p11j.png rename to main/images_meteo/p11j.png diff --git a/main/images/p11n.png b/main/images_meteo/p11n.png similarity index 100% rename from main/images/p11n.png rename to main/images_meteo/p11n.png diff --git a/main/images/p12bisj.png b/main/images_meteo/p12bisj.png similarity index 100% rename from main/images/p12bisj.png rename to main/images_meteo/p12bisj.png diff --git a/main/images/p12j.png b/main/images_meteo/p12j.png similarity index 100% rename from main/images/p12j.png rename to main/images_meteo/p12j.png diff --git a/main/images/p12n.png b/main/images_meteo/p12n.png similarity index 100% rename from main/images/p12n.png rename to main/images_meteo/p12n.png diff --git a/main/images/p13bisj.png b/main/images_meteo/p13bisj.png similarity index 100% rename from main/images/p13bisj.png rename to main/images_meteo/p13bisj.png diff --git a/main/images/p13j.png b/main/images_meteo/p13j.png similarity index 100% rename from main/images/p13j.png rename to main/images_meteo/p13j.png diff --git a/main/images/p13n.png b/main/images_meteo/p13n.png similarity index 100% rename from main/images/p13n.png rename to main/images_meteo/p13n.png diff --git a/main/images/p14bisj.png b/main/images_meteo/p14bisj.png similarity index 100% rename from main/images/p14bisj.png rename to main/images_meteo/p14bisj.png diff --git a/main/images/p14j.png b/main/images_meteo/p14j.png similarity index 100% rename from main/images/p14j.png rename to main/images_meteo/p14j.png diff --git a/main/images/p14n.png b/main/images_meteo/p14n.png similarity index 100% rename from main/images/p14n.png rename to main/images_meteo/p14n.png diff --git a/main/images/p15j.png b/main/images_meteo/p15j.png similarity index 100% rename from main/images/p15j.png rename to main/images_meteo/p15j.png diff --git a/main/images/p15n.png b/main/images_meteo/p15n.png similarity index 100% rename from main/images/p15n.png rename to main/images_meteo/p15n.png diff --git a/main/images/p16bisj.png b/main/images_meteo/p16bisj.png similarity index 100% rename from main/images/p16bisj.png rename to main/images_meteo/p16bisj.png diff --git a/main/images/p16j.png b/main/images_meteo/p16j.png similarity index 100% rename from main/images/p16j.png rename to main/images_meteo/p16j.png diff --git a/main/images/p16n.png b/main/images_meteo/p16n.png similarity index 100% rename from main/images/p16n.png rename to main/images_meteo/p16n.png diff --git a/main/images/p17j.png b/main/images_meteo/p17j.png similarity index 100% rename from main/images/p17j.png rename to main/images_meteo/p17j.png diff --git a/main/images/p17n.png b/main/images_meteo/p17n.png similarity index 100% rename from main/images/p17n.png rename to main/images_meteo/p17n.png diff --git a/main/images/p18j.png b/main/images_meteo/p18j.png similarity index 100% rename from main/images/p18j.png rename to main/images_meteo/p18j.png diff --git a/main/images/p18n.png b/main/images_meteo/p18n.png similarity index 100% rename from main/images/p18n.png rename to main/images_meteo/p18n.png diff --git a/main/images/p19j.png b/main/images_meteo/p19j.png similarity index 100% rename from main/images/p19j.png rename to main/images_meteo/p19j.png diff --git a/main/images/p19n.png b/main/images_meteo/p19n.png similarity index 100% rename from main/images/p19n.png rename to main/images_meteo/p19n.png diff --git a/main/images/p1j.png b/main/images_meteo/p1j.png similarity index 100% rename from main/images/p1j.png rename to main/images_meteo/p1j.png diff --git a/main/images/p1n.png b/main/images_meteo/p1n.png similarity index 100% rename from main/images/p1n.png rename to main/images_meteo/p1n.png diff --git a/main/images/p20j.png b/main/images_meteo/p20j.png similarity index 100% rename from main/images/p20j.png rename to main/images_meteo/p20j.png diff --git a/main/images/p20n.png b/main/images_meteo/p20n.png similarity index 100% rename from main/images/p20n.png rename to main/images_meteo/p20n.png diff --git a/main/images/p21j.png b/main/images_meteo/p21j.png similarity index 100% rename from main/images/p21j.png rename to main/images_meteo/p21j.png diff --git a/main/images/p21n.png b/main/images_meteo/p21n.png similarity index 100% rename from main/images/p21n.png rename to main/images_meteo/p21n.png diff --git a/main/images/p22j.png b/main/images_meteo/p22j.png similarity index 100% rename from main/images/p22j.png rename to main/images_meteo/p22j.png diff --git a/main/images/p22n.png b/main/images_meteo/p22n.png similarity index 100% rename from main/images/p22n.png rename to main/images_meteo/p22n.png diff --git a/main/images/p23j.png b/main/images_meteo/p23j.png similarity index 100% rename from main/images/p23j.png rename to main/images_meteo/p23j.png diff --git a/main/images/p23n.png b/main/images_meteo/p23n.png similarity index 100% rename from main/images/p23n.png rename to main/images_meteo/p23n.png diff --git a/main/images/p24j.png b/main/images_meteo/p24j.png similarity index 100% rename from main/images/p24j.png rename to main/images_meteo/p24j.png diff --git a/main/images/p24n.png b/main/images_meteo/p24n.png similarity index 100% rename from main/images/p24n.png rename to main/images_meteo/p24n.png diff --git a/main/images/p25j.png b/main/images_meteo/p25j.png similarity index 100% rename from main/images/p25j.png rename to main/images_meteo/p25j.png diff --git a/main/images/p25n.png b/main/images_meteo/p25n.png similarity index 100% rename from main/images/p25n.png rename to main/images_meteo/p25n.png diff --git a/main/images/p26j.png b/main/images_meteo/p26j.png similarity index 100% rename from main/images/p26j.png rename to main/images_meteo/p26j.png diff --git a/main/images/p26n.png b/main/images_meteo/p26n.png similarity index 100% rename from main/images/p26n.png rename to main/images_meteo/p26n.png diff --git a/main/images/p27j.png b/main/images_meteo/p27j.png similarity index 100% rename from main/images/p27j.png rename to main/images_meteo/p27j.png diff --git a/main/images/p27n.png b/main/images_meteo/p27n.png similarity index 100% rename from main/images/p27n.png rename to main/images_meteo/p27n.png diff --git a/main/images/p28j.png b/main/images_meteo/p28j.png similarity index 100% rename from main/images/p28j.png rename to main/images_meteo/p28j.png diff --git a/main/images/p28n.png b/main/images_meteo/p28n.png similarity index 100% rename from main/images/p28n.png rename to main/images_meteo/p28n.png diff --git a/main/images/p29j.png b/main/images_meteo/p29j.png similarity index 100% rename from main/images/p29j.png rename to main/images_meteo/p29j.png diff --git a/main/images/p29n.png b/main/images_meteo/p29n.png similarity index 100% rename from main/images/p29n.png rename to main/images_meteo/p29n.png diff --git a/main/images/p2j.png b/main/images_meteo/p2j.png similarity index 100% rename from main/images/p2j.png rename to main/images_meteo/p2j.png diff --git a/main/images/p2n.png b/main/images_meteo/p2n.png similarity index 100% rename from main/images/p2n.png rename to main/images_meteo/p2n.png diff --git a/main/images/p30j.png b/main/images_meteo/p30j.png similarity index 100% rename from main/images/p30j.png rename to main/images_meteo/p30j.png diff --git a/main/images/p30n.png b/main/images_meteo/p30n.png similarity index 100% rename from main/images/p30n.png rename to main/images_meteo/p30n.png diff --git a/main/images/p31j.png b/main/images_meteo/p31j.png similarity index 100% rename from main/images/p31j.png rename to main/images_meteo/p31j.png diff --git a/main/images/p31n.png b/main/images_meteo/p31n.png similarity index 100% rename from main/images/p31n.png rename to main/images_meteo/p31n.png diff --git a/main/images/p32j.png b/main/images_meteo/p32j.png similarity index 100% rename from main/images/p32j.png rename to main/images_meteo/p32j.png diff --git a/main/images/p32n.png b/main/images_meteo/p32n.png similarity index 100% rename from main/images/p32n.png rename to main/images_meteo/p32n.png diff --git a/main/images/p3j.png b/main/images_meteo/p3j.png similarity index 100% rename from main/images/p3j.png rename to main/images_meteo/p3j.png diff --git a/main/images/p3n.png b/main/images_meteo/p3n.png similarity index 100% rename from main/images/p3n.png rename to main/images_meteo/p3n.png diff --git a/main/images/p4j.png b/main/images_meteo/p4j.png similarity index 100% rename from main/images/p4j.png rename to main/images_meteo/p4j.png diff --git a/main/images/p4n.png b/main/images_meteo/p4n.png similarity index 100% rename from main/images/p4n.png rename to main/images_meteo/p4n.png diff --git a/main/images/p5bisj.png b/main/images_meteo/p5bisj.png similarity index 100% rename from main/images/p5bisj.png rename to main/images_meteo/p5bisj.png diff --git a/main/images/p5j.png b/main/images_meteo/p5j.png similarity index 100% rename from main/images/p5j.png rename to main/images_meteo/p5j.png diff --git a/main/images/p5n.png b/main/images_meteo/p5n.png similarity index 100% rename from main/images/p5n.png rename to main/images_meteo/p5n.png diff --git a/main/images/p6j.png b/main/images_meteo/p6j.png similarity index 100% rename from main/images/p6j.png rename to main/images_meteo/p6j.png diff --git a/main/images/p6n.png b/main/images_meteo/p6n.png similarity index 100% rename from main/images/p6n.png rename to main/images_meteo/p6n.png diff --git a/main/images/p7j.png b/main/images_meteo/p7j.png similarity index 100% rename from main/images/p7j.png rename to main/images_meteo/p7j.png diff --git a/main/images/p7n.png b/main/images_meteo/p7n.png similarity index 100% rename from main/images/p7n.png rename to main/images_meteo/p7n.png diff --git a/main/images/p8j.png b/main/images_meteo/p8j.png similarity index 100% rename from main/images/p8j.png rename to main/images_meteo/p8j.png diff --git a/main/images/p8n.png b/main/images_meteo/p8n.png similarity index 100% rename from main/images/p8n.png rename to main/images_meteo/p8n.png diff --git a/main/images/p9j.png b/main/images_meteo/p9j.png similarity index 100% rename from main/images/p9j.png rename to main/images_meteo/p9j.png diff --git a/main/images/p9n.png b/main/images_meteo/p9n.png similarity index 100% rename from main/images/p9n.png rename to main/images_meteo/p9n.png diff --git a/main/main.c b/main/main.c index 01a8922..e2b428f 100644 --- a/main/main.c +++ b/main/main.c @@ -1,5 +1,3 @@ -#include "wifi.h" -#include "mqtt.h" #include "misc/lv_types.h" #include "freertos/FreeRTOS.h" #include "freertos/event_groups.h" @@ -10,18 +8,24 @@ #include "esp_lcd_panel_io.h" #include "esp_lcd_panel_ops.h" #include "esp_lcd_panel_rgb.h" +#include "esp_lcd_touch_gt911.h" #include "esp_lvgl_port.h" #include "esp_event.h" #include "nvs_flash.h" -#include "meteofrance.h" -#include "image_downloader.h" #include -#include "fatfs.h" -#define DIR FF_DIR /* ESP IDF typedefs `DIR` as `FF_DIR` in its version of ff.h. Use `FF_DIR` in LVGL too */ #include "esp_vfs_fat.h" #include "sdmmc_cmd.h" #include + +// Includes personnels #include "obtain_time.h" +#include "fatfs.h" +#include "meteofrance.h" +#include "image_downloader.h" +#include "wifi.h" +#include "mqtt.h" + +#include "esp_littlefs.h" #define MOUNT_POINT "/sdcard" // Pin assignments can be set in menuconfig, see "SD SPI Example Configuration" menu. @@ -32,7 +36,6 @@ #define PIN_NUM_CS 10 -#include "esp_lcd_touch_gt911.h" #include "main.h" LV_FONT_DECLARE(montserrat_medium_12) LV_FONT_DECLARE(montserrat_medium_18) @@ -299,8 +302,6 @@ static void _app_button_cb(lv_event_t *e) } } -lv_subject_t wifiStatus; -lv_subject_t mqttStatus; lv_subject_t meteoStatus; static lv_style_t no_padding; @@ -313,6 +314,9 @@ static void app_main_display(void) lv_style_init(&no_padding); lv_style_set_pad_all(&no_padding, 0); + lv_style_init(&style_font_18); + lv_style_set_text_font(&style_font_18, &montserrat_medium_18); + lv_obj_t *cont_status = lv_obj_create(lv_layer_top()); lv_obj_add_style(cont_status,&no_padding,0); lv_obj_align(cont_status,LV_ALIGN_TOP_RIGHT,0,0); @@ -332,23 +336,25 @@ static void app_main_display(void) sprintf(strftime_buf,"%s %d %s", days[timeinfo.tm_wday], timeinfo.tm_mday, months[timeinfo.tm_mon]); lv_label_set_text(jour,strftime_buf); - lv_obj_align(jour, LV_ALIGN_CENTER,0,0); + + lv_obj_refr_size(cont_status); + //lv_obj_align(jour, LV_ALIGN_CENTER,0,0); lv_obj_t *meteoR = lv_label_create(cont_status); lv_label_set_text(meteoR,"--"); lv_label_bind_text(meteoR, &meteoStatus, "Meteo %d"); - lv_obj_t *wifi = lv_label_create(cont_status); - lv_obj_set_style_bg_color(wifi, lv_palette_darken(LV_PALETTE_GREY, 3), 0); - lv_obj_set_style_border_width(wifi,1,0); - lv_obj_set_style_border_color(wifi,lv_palette_darken(LV_PALETTE_GREY, 3),0); - lv_label_set_text(wifi,"Wifi Ok"); - lv_label_bind_text(wifi, &wifiStatus, "Wifi %d"); + lv_obj_t *wifi = lv_image_create(cont_status); + //lv_obj_set_style_bg_color(wifi, lv_palette_darken(LV_PALETTE_GREY, 3), 0); + //lv_obj_set_style_border_width(wifi,1,0); + //lv_obj_set_style_border_color(wifi,lv_palette_darken(LV_PALETTE_GREY, 3),0); + //lv_label_set_text(wifi,"Wifi Ok"); + //lv_label_bind_text(wifi, &wifiStatus, "Wifi %d"); - lv_obj_t *mqtt = lv_label_create(cont_status); - lv_label_set_text(mqtt,"Mqtt Ok"); - lv_label_bind_text(mqtt, &mqttStatus, "Mqtt %d"); + lv_image_create(cont_status); + //lv_label_set_text(mqtt,"Mqtt Ok"); + //lv_label_bind_text(mqtt, &mqttStatus, "Mqtt %d"); lv_obj_t *scr = lv_scr_act(); @@ -426,7 +432,7 @@ static void event_handler(lv_event_t *e) } LV_IMAGE_DECLARE(plan_rdc); LV_IMAGE_DECLARE(plan_etage); - +/* LV_IMAGE_DECLARE(p1j); LV_IMAGE_DECLARE(p2j); LV_IMAGE_DECLARE(p3j); @@ -443,6 +449,7 @@ LV_IMAGE_DECLARE(p26j); LV_IMAGE_DECLARE(p27j); LV_IMAGE_DECLARE(p28j); LV_IMAGE_DECLARE(p29j); +*/ struct lv_observer_t { lv_subject_t * subject; /**< The observed value */ @@ -511,6 +518,11 @@ static void weatherdataH_obs_cb(lv_observer_t *observer, lv_subject_t *subject) void showMeteoIcon(const char *icon, lv_obj_t *desc_icon, int childNr) { lv_obj_t* img = lv_obj_get_child(desc_icon, childNr); + char *str1= "A:/littlefs/"; + char* result = malloc(strlen(str1) + strlen(icon) + 6); + sprintf(result, "%s%s.png", str1, icon); + lv_image_set_src(img, result); + /* if (strcmp(icon, "p1j") == 0) { lv_image_set_src(img, &p1j); @@ -579,6 +591,7 @@ void showMeteoIcon(const char *icon, lv_obj_t *desc_icon, int childNr) { ESP_LOGE(TAG, "Image %s non connue", icon); } + */ } /* ------------------------------------------------------------ */ /* Fragment meteo journaliere (date,icone, min et max) */ @@ -1026,10 +1039,7 @@ void draw_ihm() // keys.clear(); lv_obj_clean(lv_scr_act()); - - - - /*Create a Tab view object*/ + /*Create a Tab view object*/ lv_obj_t * tabview; tabview = lv_tabview_create(lv_screen_active()); lv_tabview_set_tab_bar_position(tabview, LV_DIR_LEFT); @@ -1061,8 +1071,6 @@ void draw_ihm() static lv_style_t style_btn; lv_style_init(&style_btn); - lv_style_init(&style_font_18); - lv_style_set_text_font(&style_font_18, &montserrat_medium_18); lv_style_init(&style_font_24); lv_style_set_text_font(&style_font_24, &montserrat_medium_24); @@ -1303,19 +1311,39 @@ void mount_sd_card(){ } void app_main(void){ - esp_log_level_set("wifi", ESP_LOG_ERROR); + printf("Minimum free heap size: %" PRIu32 " bytes\n", esp_get_minimum_free_heap_size()); + printf("Free heap size: %" PRIu32 " bytes\n", esp_get_free_heap_size()); + + printf("1- Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); + + esp_log_level_set("wifi", ESP_LOG_ERROR); + + printf("2- Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); mount_sd_card(); + + esp_vfs_littlefs_conf_t conf = { + .base_path = "/littlefs", + .partition_label = "littlefs", + .format_if_mount_failed = true, + .dont_mount = false, + }; + + printf("3 - Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); /* LCD HW initialization */ ESP_ERROR_CHECK(app_lcd_init()); + printf("4 - Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); /* Touch initialization */ ESP_ERROR_CHECK(app_touch_init()); + printf("5 - Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); /* LVGL initialization */ ESP_ERROR_CHECK(app_lvgl_init()); + printf("6 - Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); + /* On affiche au plus tot l'ecran de démarrage */ if(lvgl_port_lock(0)){ //ESP_ERROR_CHECK(esp_lcd_panel_mirror(lcd_panel,true,true)); @@ -1324,6 +1352,7 @@ void app_main(void){ } + printf("7 - Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); // Initialize NVS esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) @@ -1333,15 +1362,16 @@ void app_main(void){ } ESP_ERROR_CHECK(ret); - lv_subject_init_int(&wifiStatus,-1); - lv_subject_init_int(&mqttStatus,-1); lv_subject_init_int(&meteoStatus,-1); + printf("8 - Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); ESP_LOGI(TAG, "ESP_WIFI_MODE_STA"); wifi_init_sta(); - //mqtt_app_start(); + printf("8b - Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); + mqtt_app_start(); - time_t now; + printf("9 - Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); + time_t now; struct tm timeinfo; time(&now); localtime_r(&now, &timeinfo); @@ -1361,24 +1391,26 @@ void app_main(void){ localtime_r(&now, &timeinfo); strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); - printf("Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); - heap_caps_print_heap_info(MALLOC_CAP_DEFAULT); + printf("10. Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); + heap_caps_print_heap_info(MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); on_weather_data_retrieval(weather_data_retreived); on_weather_data_retrieval_start(weather_data_retreived_start); - initialise_weather_data_retrieval(60000); + initialise_weather_data_retrieval(600000); ESP_LOGW(TAG, "Weather data retrieval initialized"); + printf("11. Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); ESP_LOGW(TAG, "On telecharge l'image cuve"); TaskHandle_t xHandle = NULL; - BaseType_t ret1 = xTaskCreate(&imgdwn, "imageDownload_task", 5 * 1024, NULL, 5, &xHandle); + BaseType_t ret1 = xTaskCreate(&imgdwn, "imageDownload_task", 3 * 1024, NULL, 5, &xHandle); if(ret1!=pdPASS ){ ESP_LOGE(TAG, "Impossiblke de creer la tache %i", ret1); } + printf("12. Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); /* Show LVGL objects */ if(lvgl_port_lock(0)){ draw_ihm(); @@ -1386,6 +1418,81 @@ void app_main(void){ lvgl_port_unlock(); } + printf("13. Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); + printf("Minimum free heap size: %" PRIu32 " bytes\n", esp_get_minimum_free_heap_size()); + printf("Free heap size: %" PRIu32 " bytes\n", esp_get_free_heap_size()); +LV_ASSERT_MEM_INTEGRITY(); + +lv_mem_monitor_t mon; +lv_mem_monitor(&mon); +printf("used: %6d (%3d %%), frag: %3d %%, biggest free: %6d\n", + (int)mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct, + (int)mon.free_biggest_size); + + ESP_LOGI(TAG, "Initializing LittleFS"); + + esp_vfs_littlefs_conf_t conflfs = { + .base_path = "/littlefs", + .partition_label = "littlefs", + .format_if_mount_failed = true, + .dont_mount = false, + }; + + // Use settings defined above to initialize and mount LittleFS filesystem. + // Note: esp_vfs_littlefs_register is an all-in-one convenience function. + ret = esp_vfs_littlefs_register(&conflfs); + + if (ret != ESP_OK) + { + if (ret == ESP_FAIL) + { + ESP_LOGE(TAG, "Failed to mount or format filesystem"); + } + else if (ret == ESP_ERR_NOT_FOUND) + { + ESP_LOGE(TAG, "Failed to find LittleFS partition"); + } + else + { + ESP_LOGE(TAG, "Failed to initialize LittleFS (%s)", esp_err_to_name(ret)); + } + return; + } + + size_t total = 0, used = 0; + ret = esp_littlefs_info(conflfs.partition_label, &total, &used); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "Failed to get LittleFS partition information (%s)", esp_err_to_name(ret)); + } + else + { + ESP_LOGI(TAG, "Partition size: total: %d, used: %d", total, used); + } + + ESP_LOGI(TAG, "Reading file"); + FILE *f = fopen("/littlefs/p1j.png", "r"); + if (f == NULL) + { + ESP_LOGE(TAG, "Failed to open file for reading"); + return; + } + + char line[128]; + char *pos; + + fgets(line, sizeof(line), f); + fclose(f); + // strip newline + pos = strchr(line, '\n'); + if (pos) + { + *pos = '\0'; + } + ESP_LOGI(TAG, "Read from file: '%s'", line); + } + + diff --git a/main/mqtt.c b/main/mqtt.c index 5fc056c..45ade4e 100644 --- a/main/mqtt.c +++ b/main/mqtt.c @@ -4,7 +4,8 @@ #include "mqtt_client.h" esp_mqtt_client_handle_t client; -extern lv_subject_t mqttStatus; +lv_subject_t mqttStatus; + extern lv_subject_t tempIntSubj; extern lv_subject_t tempExtSubj; extern lv_subject_t hauteurCuveSubj; @@ -19,6 +20,50 @@ char *topicTempExt = "house/temp/282A802600008059"; char *topicHauteurCuve = "house/cuve/hauteur"; char *topicTempInt = "house/temp/287DCF1E00008020"; char *topicHauteurCuveEvol = "house/cuve/hauteurEvol"; +char *topicTest = "test"; + +LV_IMAGE_DECLARE(mqtt_ok); +LV_IMAGE_DECLARE(mqtt_ko); + +static void mqttStatus_obs_cb(lv_observer_t * observer, lv_subject_t * subject); + +static void mqttStatus_obs_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + ESP_LOGE(TAG, "On passe dans le callback de chgt de statut; %li", lv_subject_get_int(subject)); + if(lvgl_port_lock(0)){ + lv_obj_t * wifiSt = lv_obj_get_child(lv_obj_get_child(lv_layer_top(), 0),3); + if(lv_obj_check_type(wifiSt, &lv_image_class)){ + switch (lv_subject_get_int(subject)) + { + case 0: + lv_image_set_src(wifiSt,&mqtt_ko); + break; + case 1: + lv_image_set_src(wifiSt,&mqtt_ok); + break; + case 2: + lv_color_t color = lv_color_make(255, 0, 0); + lv_obj_set_style_image_recolor_opa(wifiSt, 125, 0); + lv_obj_set_style_image_recolor(wifiSt, color, 0); + vTaskDelay(2000 / portTICK_PERIOD_MS); + + break; + case 3: + lv_obj_set_style_image_recolor_opa(wifiSt, 0, 0); + break; + default: + break; + } + }else{ + ESP_LOGE(TAG, "L'objet recuip en semble pas etre du bon type"); + } + lvgl_port_unlock(); + } + //int32_t prev_v = lv_subject_get_previous_int(subject); + //int32_t cur_v = lv_subject_get_int(subject); + + //lv_obj_t * btn = lv_observer_get_target(observer); +} static void log_error_if_nonzero(const char *message, int error_code) { @@ -91,7 +136,10 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_ msg_id = esp_mqtt_client_subscribe(client, topicHauteurCuveEvol, 0); ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); - //msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1); + msg_id = esp_mqtt_client_subscribe(client, topicTest, 0); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + + //msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1); //ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); //msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1"); @@ -118,6 +166,7 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_ ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); break; case MQTT_EVENT_DATA: + lv_subject_set_int(&mqttStatus,2); ESP_LOGI(TAG, "MQTT_EVENT_DATA"); printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); printf("DATA=%.*s\r\n", event->data_len, event->data); @@ -166,11 +215,15 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_ lv_subject_copy_string(&hauteurCuveSubj, datas); free(datas); lvgl_port_unlock(); + }else if (strncmp(event->topic, topicTest, 4) == 0){ + ESP_LOGE(TAG,"Msg reecu sur test"); } + else { ESP_LOGE(TAG, "None match :-("); } + lv_subject_set_int(&mqttStatus,3); break; case MQTT_EVENT_ERROR: ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); @@ -189,6 +242,11 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_ } void mqtt_app_start(void) { + + lv_subject_init_int(&mqttStatus,-1); + lv_subject_add_observer_obj(&mqttStatus, mqttStatus_obs_cb, NULL, NULL); + + esp_mqtt_client_config_t mqtt_cfg = { .broker.address.uri = "mqtt://192.168.0.10", .network.timeout_ms = 1000}; diff --git a/main/wifi.c b/main/wifi.c index 8ed2e53..4189b16 100644 --- a/main/wifi.c +++ b/main/wifi.c @@ -24,7 +24,37 @@ static const char *TAG = "wifi"; static int s_retry_num = 0; -extern lv_subject_t wifiStatus; +static lv_subject_t wifiStatus; +LV_IMAGE_DECLARE(wifi_ok); +LV_IMAGE_DECLARE(wifi_ko); + +static void wifiStatus_obs_cb(lv_observer_t * observer, lv_subject_t * subject); + + +static void wifiStatus_obs_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + ESP_LOGE(TAG, "On passe dans le callback de chgt de statut; %li", lv_subject_get_int(subject)); + lv_obj_t * wifiSt = lv_obj_get_child(lv_obj_get_child(lv_layer_top(), 0),2); + if(lv_obj_check_type(wifiSt, &lv_image_class)){ + switch (lv_subject_get_int(subject)) + { + case 0: + lv_image_set_src(wifiSt,&wifi_ko); + break; + case 1: + lv_image_set_src(wifiSt,&wifi_ok); + break; + default: + break; + } + }else{ + ESP_LOGE(TAG, "L'objet recuip en semble pas etre du bon type"); + } + //int32_t prev_v = lv_subject_get_previous_int(subject); + //int32_t cur_v = lv_subject_get_int(subject); + + //lv_obj_t * btn = lv_observer_get_target(observer); +} static void wifi_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { @@ -108,6 +138,9 @@ void wifi_init_sta(void) ESP_ERROR_CHECK(esp_wifi_start()); ESP_LOGI(TAG, "wifi_init_sta finished."); + lv_subject_init_int(&wifiStatus,0); + lv_subject_add_observer_obj(&wifiStatus, wifiStatus_obs_cb, NULL, NULL); + /* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum * number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */ diff --git a/partition_table/partitionTable.bin b/partition_table/partitionTable.bin deleted file mode 100644 index 0fdd7d86a86edca68b5bdace1597859f876f9669..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3072 zcmZ1#z{tcffq{V`fq@~ftQg2Z1*-xW85lkQ#S|DA@=Fp^5=#