From 2d9930ca9ce0b305f14083e83c322987e01dc03b Mon Sep 17 00:00:00 2001 From: Peter Siegmund Date: Tue, 27 Aug 2024 21:57:24 +0200 Subject: [PATCH] loading date/time via SNTP Signed-off-by: Peter Siegmund --- ePaper-ESP-IDF/Makefile | 1 + .../components/connectivity/CMakeLists.txt | 5 +- .../components/connectivity/include/ntp.h | 11 +++ ePaper-ESP-IDF/components/connectivity/ntp.c | 76 ++++++++++++++++++ .../components/mapView/ip-info.http | 1 - ePaper-ESP-IDF/components/mapView/mapView.cpp | 59 ++++++++------ .../components/splash_screen/splash_screen.c | 39 ++++++++- ePaper-ESP-IDF/data/staticmap.png | Bin 41149 -> 0 bytes ePaper-ESP-IDF/dependencies.lock | 16 ++-- ePaper-ESP-IDF/main/Kconfig.projbuild | 8 ++ ePaper-ESP-IDF/sdkconfig.defaults | 6 ++ 11 files changed, 188 insertions(+), 34 deletions(-) create mode 100644 ePaper-ESP-IDF/components/connectivity/include/ntp.h create mode 100644 ePaper-ESP-IDF/components/connectivity/ntp.c delete mode 100644 ePaper-ESP-IDF/components/mapView/ip-info.http delete mode 100644 ePaper-ESP-IDF/data/staticmap.png diff --git a/ePaper-ESP-IDF/Makefile b/ePaper-ESP-IDF/Makefile index 5d946eb..b0a8947 100644 --- a/ePaper-ESP-IDF/Makefile +++ b/ePaper-ESP-IDF/Makefile @@ -1,2 +1,3 @@ +download_map: curl -o ./data/staticmap.png https://maps.googleapis.com/maps/api/staticmap\?center\=53.541962,%209.993402\&zoom\=15\&size\=540x540\&key\=AIzaSyARgP_FKFXsrcgVd_HVWoIfH5N8-a88wlQ\&map_id\=2f371c2346218fe8 python imgconvert.py -i ./data/staticmap.png -o components/mapView/include/staticmap.h -n staticmap diff --git a/ePaper-ESP-IDF/components/connectivity/CMakeLists.txt b/ePaper-ESP-IDF/components/connectivity/CMakeLists.txt index c9a92d5..2cc765a 100644 --- a/ePaper-ESP-IDF/components/connectivity/CMakeLists.txt +++ b/ePaper-ESP-IDF/components/connectivity/CMakeLists.txt @@ -1,5 +1,6 @@ -idf_component_register(SRCS "connectivity.c" +idf_component_register(SRCS "connectivity.c" "ntp.c" INCLUDE_DIRS "include" PRIV_REQUIRES esp_event - esp_wifi) + esp_wifi + nvs_flash) diff --git a/ePaper-ESP-IDF/components/connectivity/include/ntp.h b/ePaper-ESP-IDF/components/connectivity/include/ntp.h new file mode 100644 index 0000000..8a36666 --- /dev/null +++ b/ePaper-ESP-IDF/components/connectivity/include/ntp.h @@ -0,0 +1,11 @@ +#pragma once + +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif +esp_err_t init_ntp(void); +#ifdef __cplusplus +} +#endif diff --git a/ePaper-ESP-IDF/components/connectivity/ntp.c b/ePaper-ESP-IDF/components/connectivity/ntp.c new file mode 100644 index 0000000..d7741b7 --- /dev/null +++ b/ePaper-ESP-IDF/components/connectivity/ntp.c @@ -0,0 +1,76 @@ +#include "ntp.h" + +#include +#include +#include +#include "esp_attr.h" +#include "esp_event.h" +#include "esp_log.h" +#include "esp_netif_sntp.h" +#include "esp_sleep.h" +#include "esp_sntp.h" +#include "esp_system.h" +#include "lwip/ip_addr.h" +#include "nvs_flash.h" + +#include "sdkconfig.h" + +static const char* TAG = "NTP"; + +void obtain_time(void) { + ESP_LOGI(TAG, "Initializing SNTP"); + + esp_sntp_config_t config = + ESP_NETIF_SNTP_DEFAULT_CONFIG(CONFIG_SNTP_TIME_SERVER); + config.start = false; + config.server_from_dhcp = true; + config.renew_servers_after_new_IP = true; + config.index_of_first_server = 1; + config.ip_event_to_renew = IP_EVENT_STA_GOT_IP; + esp_netif_sntp_init(&config); + + ESP_LOGI(TAG, "Starting SNTP"); + esp_netif_sntp_start(); + + // wait for time to be set + time_t now = 0; + struct tm timeinfo = {0}; + int retry = 0; + const int retry_count = 15; + while (esp_netif_sntp_sync_wait(2000 / portTICK_PERIOD_MS) == + ESP_ERR_TIMEOUT && + ++retry < retry_count) { + ESP_LOGI(TAG, "Waiting for system time to be set... (%d/%d)", retry, + retry_count); + } + time(&now); + localtime_r(&now, &timeinfo); + + esp_netif_sntp_deinit(); +} + +esp_err_t init_ntp(void) { + time_t now; + struct tm timeinfo; + time(&now); + localtime_r(&now, &timeinfo); + + if (timeinfo.tm_year < (2016 - 1900)) { + ESP_LOGI( + TAG, + "Time is not set yet. Connecting to WiFi and getting time over NTP."); + obtain_time(); + } + + char strftime_buf[64]; + + // Set timezone to Eastern Standard Time and print local time + setenv("TZ", "CET-1CEST,M3.5.0,M10.5.0/3", 1); + tzset(); + time(&now); + localtime_r(&now, &timeinfo); + strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); + ESP_LOGI(TAG, "The current date/time in Berlin/Europe is: %s", strftime_buf); + + return ESP_OK; +} diff --git a/ePaper-ESP-IDF/components/mapView/ip-info.http b/ePaper-ESP-IDF/components/mapView/ip-info.http deleted file mode 100644 index 32762a3..0000000 --- a/ePaper-ESP-IDF/components/mapView/ip-info.http +++ /dev/null @@ -1 +0,0 @@ -GET https://ipapi.co/json \ No newline at end of file diff --git a/ePaper-ESP-IDF/components/mapView/mapView.cpp b/ePaper-ESP-IDF/components/mapView/mapView.cpp index 02296e7..036e571 100644 --- a/ePaper-ESP-IDF/components/mapView/mapView.cpp +++ b/ePaper-ESP-IDF/components/mapView/mapView.cpp @@ -1,9 +1,12 @@ #include "mapView.h" #include +#include +#include #include #include #include "epd_driver.h" +#include "fonts/opensans12b.h" #include "fonts/opensans26b.h" #include "fonts/opensans6.h" #include "staticmap.h" @@ -52,29 +55,39 @@ void mapView(void* args) { std::memset(framebuffer, 0xFF, EPD_WIDTH * EPD_HEIGHT / 2); - int32_t width = staticmap_width; - int32_t height = staticmap_height; - const uint8_t* data = staticmap_data; - - Rect_t area = { - .x = EPD_WIDTH - width, .y = 0, .width = width, .height = height}; - epd_copy_to_framebuffer(area, (uint8_t*)data, framebuffer); - epd_draw_rect(area.x, area.y, area.width, area.height, 0, framebuffer); - - int32_t x = area.x / 2; - int32_t y = area.height / 2 - 26; - currentFont = OpenSans26B; - drawString(x, y, "Hello, World!", CENTER); - - drawVessel(EPD_WIDTH - EPD_WIDTH / 4, EPD_HEIGHT - EPD_HEIGHT / 5, - "DEEPENSCHRIEWER 1"); - - epd_poweron(); - epd_clear(); - epd_draw_grayscale_image(epd_full_screen(), framebuffer); - epd_poweroff_all(); - while (1) { - vTaskDelay(pdMS_TO_TICKS(100)); + int32_t width = staticmap_width; + int32_t height = staticmap_height; + const uint8_t* data = staticmap_data; + + Rect_t area = { + .x = EPD_WIDTH - width, .y = 0, .width = width, .height = height}; + epd_copy_to_framebuffer(area, (uint8_t*)data, framebuffer); + epd_draw_rect(area.x, area.y, area.width, area.height, 0, framebuffer); + + int32_t x = area.x / 2; + int32_t y = 26; + currentFont = OpenSans26B; + drawString(x, y, "Tide Display", CENTER); + + time_t now; + struct tm timeinfo; + char strftime_buf[64]; + + currentFont = OpenSans12B; + time(&now); + localtime_r(&now, &timeinfo); + strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); + drawString(6, area.height - 33, strftime_buf, LEFT); + + drawVessel(EPD_WIDTH - EPD_WIDTH / 4, EPD_HEIGHT - EPD_HEIGHT / 5, + "DEEPENSCHRIEWER 1"); + + epd_poweron(); + epd_clear(); + epd_draw_grayscale_image(epd_full_screen(), framebuffer); + epd_poweroff_all(); + + vTaskDelay(pdMS_TO_TICKS(60000)); } } diff --git a/ePaper-ESP-IDF/components/splash_screen/splash_screen.c b/ePaper-ESP-IDF/components/splash_screen/splash_screen.c index 7012862..1311f6e 100644 --- a/ePaper-ESP-IDF/components/splash_screen/splash_screen.c +++ b/ePaper-ESP-IDF/components/splash_screen/splash_screen.c @@ -1,8 +1,10 @@ #include "splash_screen.h" +#include #include #include "connectivity.h" #include "epd_driver.h" #include "fonts/opensans16.h" +#include "ntp.h" #include "nvs_flash.h" #include "sdkconfig.h" @@ -17,14 +19,15 @@ void nvs_init(void) { } void wifi_init(void) { - epd_poweron(); epd_clear(); + int32_t x = 100; int32_t y = 100; const int16_t bufferSize = 200; char buffer[bufferSize]; snprintf(buffer, bufferSize, "Connecting to SSDI: %s", CONFIG_WIFI_SSID); writeln(&OpenSans16, buffer, &x, &y, NULL); + esp_err_t ret = init_wifi(); if (ret != ESP_OK) { epd_clear(); @@ -35,14 +38,44 @@ void wifi_init(void) { writeln(&OpenSans16, buffer, &x, &y, NULL); epd_poweroff(); while (1) { - /// + vTaskDelay(pdMS_TO_TICKS(100)); + }; + } +} + +void time_init(void) { + epd_clear(); + + int32_t x = 100; + int32_t y = 100; + const int16_t bufferSize = 200; + char buffer[bufferSize]; + snprintf(buffer, bufferSize, "Loading NTP Data..."); + writeln(&OpenSans16, buffer, &x, &y, NULL); + + esp_err_t ret = init_ntp(); + if (ret != ESP_OK) { + epd_clear(); + x = 100; + y = 100; + snprintf(buffer, bufferSize, "Failed to get NTP data and timezone: %s", + esp_err_to_name(ret)); + writeln(&OpenSans16, buffer, &x, &y, NULL); + epd_poweroff(); + while (1) { + vTaskDelay(pdMS_TO_TICKS(100)); }; } - epd_poweroff(); } void splash_screen(void) { epd_init(); nvs_init(); + + epd_poweron(); + wifi_init(); + time_init(); + + epd_poweroff(); } diff --git a/ePaper-ESP-IDF/data/staticmap.png b/ePaper-ESP-IDF/data/staticmap.png deleted file mode 100644 index 917ea91ccc0e34f7f30813f9d52a8922972377a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41149 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 diff --git a/ePaper-ESP-IDF/dependencies.lock b/ePaper-ESP-IDF/dependencies.lock index 2635320..1831419 100644 --- a/ePaper-ESP-IDF/dependencies.lock +++ b/ePaper-ESP-IDF/dependencies.lock @@ -1,15 +1,21 @@ dependencies: espressif/zlib: component_hash: 999ec50086ac1c82b8321d8f540dc9fd10f5622948b935558aa16b4b66e95d9d + dependencies: + - name: idf + require: private + version: '>=4.4' source: - service_url: https://api.components.espressif.com/ + registry_url: https://components.espressif.com/ type: service version: 1.3.0 idf: - component_hash: null source: type: idf - version: 5.2.1 -manifest_hash: 9fe7e2c77ea407d47f07333832a5be5b87fc9871227faa74633b17f8cd0fd0c1 + version: 5.2.2 +direct_dependencies: +- espressif/zlib +- idf +manifest_hash: 7fd1b00bda391a50c91df72443d14b974ce16be6bfa2efdabe51083d3a6e3185 target: esp32s3 -version: 1.0.0 +version: 2.0.0 diff --git a/ePaper-ESP-IDF/main/Kconfig.projbuild b/ePaper-ESP-IDF/main/Kconfig.projbuild index 82663e9..f7c3b34 100644 --- a/ePaper-ESP-IDF/main/Kconfig.projbuild +++ b/ePaper-ESP-IDF/main/Kconfig.projbuild @@ -21,6 +21,14 @@ menu "Tide Display Setting" inexistent. endmenu + menu "Time Configuration" + config SNTP_TIME_SERVER + string "SNTP server name" + default "pool.ntp.org" + help + Hostname of the main SNTP server. + endmenu + menu "Map" choice "Map Provider" prompt "Map Provider" diff --git a/ePaper-ESP-IDF/sdkconfig.defaults b/ePaper-ESP-IDF/sdkconfig.defaults index 885e8fe..0229d70 100644 --- a/ePaper-ESP-IDF/sdkconfig.defaults +++ b/ePaper-ESP-IDF/sdkconfig.defaults @@ -20,6 +20,12 @@ CONFIG_SPIRAM_MODE_OCT=y CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +# +# SNTP +# +CONFIG_LWIP_DHCP_GET_NTP_SRV=y +CONFIG_LWIP_DHCP_MAX_NTP_SERVERS=1 + # # ESP System Settings #