From 7c7d298af1d7d5180e5c470f1ccdb152bb9d3df3 Mon Sep 17 00:00:00 2001 From: marc Date: Tue, 6 May 2025 20:57:25 +0200 Subject: [PATCH] coredump httpserver --- main/CMakeLists.txt | 5 +- main/index.html | 80 ++++++++++++++++++++++++++++++ main/main.c | 115 +++++++++++++++++++++++++++++++++++++++++--- partitions.csv | 1 + sdkconfig | 69 ++++++++++++++++++-------- 5 files changed, 242 insertions(+), 28 deletions(-) create mode 100644 main/index.html diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 7d352d2..5938d21 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -2,8 +2,9 @@ set(EXTRA_COMPONENT_DIRS ../components) idf_component_register(SRC_DIRS . fonts INCLUDE_DIRS "." - REQUIRES heap nvs_flash meteofrance communication esp_netif image_downloader fatfs sdmmc vfs littlefs wifi_logger protocol_examples_common app_update esp_https_ota bsp_extra esp32_p4_function_ev_board esp_driver_gpio - EMBED_TXTFILES ${project_dir}/main/ca_cert.pem) + REQUIRES heap espcoredump esp_http_server nvs_flash meteofrance communication esp_netif image_downloader fatfs sdmmc vfs littlefs wifi_logger protocol_examples_common app_update esp_https_ota bsp_extra esp32_p4_function_ev_board esp_driver_gpio + EMBED_TXTFILES ${project_dir}/main/ca_cert.pem + EMBED_FILES "index.html") set_source_files_properties( diff --git a/main/index.html b/main/index.html new file mode 100644 index 0000000..9daf545 --- /dev/null +++ b/main/index.html @@ -0,0 +1,80 @@ + + + + + + + + +
+

Developed by Mark

+

How to save and Download crash dump

+

+

+ +
+ + diff --git a/main/main.c b/main/main.c index 9dc87da..81d56eb 100644 --- a/main/main.c +++ b/main/main.c @@ -13,6 +13,8 @@ #include "sdmmc_cmd.h" #include +#include "esp_http_server.h" + #include "bsp/esp-bsp.h" #include "main.h" @@ -292,12 +294,108 @@ void initPirSensor(){ static void periodic_timer_callback(void* arg) { int64_t time_since_boot = esp_timer_get_time(); - ESP_LOGI(TAG, "Periodic timer called, time since boot: %lld us", time_since_boot); - for (int i = 100; i >= 0; i--) - { - bsp_display_brightness_set(i); - vTaskDelay(20/portTICK_PERIOD_MS); - } + if(bsp_display_lock(0)){ + for (int i = 100; i >= 0; i--) + { + bsp_display_brightness_set(i); + vTaskDelay(20/portTICK_PERIOD_MS); + } + bsp_display_unlock(); + } + ecranEteint=true; +} + +static esp_err_t download_get_handler(httpd_req_t *req) { + httpd_resp_set_type(req, "application/octet-stream"); + httpd_resp_set_hdr(req, "Content-Disposition", + "attachment;filename=core.bin"); + + esp_partition_iterator_t partition_iterator = esp_partition_find( + ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_COREDUMP, "coredump"); + + const esp_partition_t *partition = esp_partition_get(partition_iterator); + + int file_size = 65536; + int chunk_size = 1024; + int i = 0; + for (i = 0; i < (file_size / chunk_size); i++) { + char store_data[chunk_size]; + ESP_ERROR_CHECK( + esp_partition_read(partition, i * chunk_size, store_data, chunk_size)); + httpd_resp_send_chunk(req, store_data, chunk_size); + } + uint16_t pending_size = file_size - (i * chunk_size); + char pending_data[pending_size]; + if (pending_size > 0) { + ESP_ERROR_CHECK(esp_partition_read(partition, i * chunk_size, pending_data, + pending_size)); + httpd_resp_send_chunk(req, pending_data, pending_size); + } + httpd_resp_send_chunk(req, NULL, 0); + return ESP_OK; +} + + +extern const unsigned char index_start[] asm("_binary_index_html_start"); +extern const unsigned char index_end[] asm("_binary_index_html_end"); + +static esp_err_t crash_get_handler(httpd_req_t *req) { + const size_t index_size = (index_end - index_start); + httpd_resp_set_type(req, "text/html"); + httpd_resp_send_chunk(req, (const char *)index_start, index_size); + httpd_resp_send_chunk(req, NULL, 0); + assert(0); + return ESP_OK; +} + +static const httpd_uri_t download = { + .uri = "/download", + .method = HTTP_GET, + .handler = download_get_handler, + .user_ctx = NULL, +}; + +static const httpd_uri_t crash = { + .uri = "/crash", + .method = HTTP_GET, + .handler = crash_get_handler, + .user_ctx = NULL, +}; +static esp_err_t root_get_handler(httpd_req_t *req) { + const size_t index_size = (index_end - index_start); + httpd_resp_set_type(req, "text/html"); + httpd_resp_send_chunk(req, (const char *)index_start, index_size); + httpd_resp_send_chunk(req, NULL, 0); + return ESP_OK; +} +static const httpd_uri_t root = { + .uri = "/", + .method = HTTP_GET, + .handler = root_get_handler, + .user_ctx = NULL, +}; + + + +static httpd_handle_t start_webserver(void) { + httpd_handle_t server = NULL; + httpd_config_t config = HTTPD_DEFAULT_CONFIG(); + config.max_resp_headers = 1024; + config.lru_purge_enable = true; + + // Start the httpd server + ESP_LOGI(TAG, "Starting server on port: '%d'", config.server_port); + if (httpd_start(&server, &config) == ESP_OK) { + // Set URI handlers + ESP_LOGI(TAG, "Registering URI handlers"); + httpd_register_uri_handler(server, &root); + httpd_register_uri_handler(server, &download); + httpd_register_uri_handler(server, &crash); + return server; + } + + ESP_LOGI(TAG, "Error starting server!"); + return NULL; } void app_main(void) @@ -451,6 +549,11 @@ void app_main(void) } mqtt_app_start(); + while(!mainState.wifi_init){ + vTaskDelay(pdTICKS_TO_MS(10)); + } + start_webserver(); + /* // Configuration de la sonde Temp/Humid. diff --git a/partitions.csv b/partitions.csv index b37897a..7d99991 100644 --- a/partitions.csv +++ b/partitions.csv @@ -7,3 +7,4 @@ factory,app,factory,,3M,, ota_0,app,ota_0,,3M,, ota_1,app,ota_1,,3M,, littlefs,data,littlefs,,1M,, +coredump, data, coredump,,64K,, diff --git a/sdkconfig b/sdkconfig index a9e9305..b8d0b71 100644 --- a/sdkconfig +++ b/sdkconfig @@ -687,24 +687,12 @@ CONFIG_PARTITION_TABLE_MD5=y # end of Partition Table # -# Example Configuration +# Domotic Configuration # CONFIG_ESP_WIFI_SSID="myssid" CONFIG_ESP_WIFI_PASSWORD="mypassword" -# CONFIG_ESP_WPA3_SAE_PWE_HUNT_AND_PECK is not set -# CONFIG_ESP_WPA3_SAE_PWE_HASH_TO_ELEMENT is not set -CONFIG_ESP_WPA3_SAE_PWE_BOTH=y -CONFIG_ESP_WIFI_PW_ID="" -CONFIG_ESP_MAXIMUM_RETRY=5 -# CONFIG_ESP_WIFI_AUTH_OPEN is not set -# CONFIG_ESP_WIFI_AUTH_WEP is not set -# CONFIG_ESP_WIFI_AUTH_WPA_PSK is not set -CONFIG_ESP_WIFI_AUTH_WPA2_PSK=y -# CONFIG_ESP_WIFI_AUTH_WPA_WPA2_PSK is not set -# CONFIG_ESP_WIFI_AUTH_WPA3_PSK is not set -# CONFIG_ESP_WIFI_AUTH_WPA2_WPA3_PSK is not set -# CONFIG_ESP_WIFI_AUTH_WAPI_PSK is not set -# end of Example Configuration +CONFIG_GPIO_INPUT_CAPTEUR_PIR=4 +# end of Domotic Configuration # # Example Connection Configuration @@ -1037,6 +1025,19 @@ CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y CONFIG_ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT=2000 # end of ESP HTTP client +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=512 +CONFIG_HTTPD_MAX_URI_LEN=512 +CONFIG_HTTPD_ERR_RESP_NO_DELAY=y +CONFIG_HTTPD_PURGE_BUF_LEN=32 +# CONFIG_HTTPD_LOG_PURGE_DATA is not set +# CONFIG_HTTPD_WS_SUPPORT is not set +# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set +CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT=2000 +# end of HTTP Server + # # ESP HTTPS OTA # @@ -1228,10 +1229,7 @@ CONFIG_SPIRAM_MODE_HEX=y CONFIG_SPIRAM_SPEED_200M=y # CONFIG_SPIRAM_SPEED_20M is not set CONFIG_SPIRAM_SPEED=200 -CONFIG_SPIRAM_FETCH_INSTRUCTIONS=y -CONFIG_SPIRAM_RODATA=y -CONFIG_SPIRAM_XIP_FROM_PSRAM=y -CONFIG_SPIRAM_FLASH_LOAD_TO_PSRAM=y +# CONFIG_SPIRAM_XIP_FROM_PSRAM is not set # CONFIG_SPIRAM_ECC_ENABLE is not set CONFIG_SPIRAM_BOOT_INIT=y # CONFIG_SPIRAM_IGNORE_NOTFOUND is not set @@ -1400,6 +1398,26 @@ CONFIG_ESP_WIFI_TX_HETB_QUEUE_NUM=3 CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y # end of Wi-Fi +# +# Core dump +# +CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y +# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set +# CONFIG_ESP_COREDUMP_ENABLE_TO_NONE is not set +# CONFIG_ESP_COREDUMP_DATA_FORMAT_BIN is not set +CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y +CONFIG_ESP_COREDUMP_CHECKSUM_CRC32=y +# CONFIG_ESP_COREDUMP_CHECKSUM_SHA256 is not set +# CONFIG_ESP_COREDUMP_CAPTURE_DRAM is not set +CONFIG_ESP_COREDUMP_CHECK_BOOT=y +CONFIG_ESP_COREDUMP_ENABLE=y +CONFIG_ESP_COREDUMP_LOGS=y +CONFIG_ESP_COREDUMP_MAX_TASKS_NUM=64 +# CONFIG_ESP_COREDUMP_FLASH_NO_OVERWRITE is not set +CONFIG_ESP_COREDUMP_STACK_SIZE=0 +CONFIG_ESP_COREDUMP_SUMMARY_STACKDUMP_SIZE=1024 +# end of Core dump + # # FAT Filesystem support # @@ -1491,12 +1509,13 @@ CONFIG_FREERTOS_RUN_TIME_COUNTER_TYPE_U32=y # # Port # +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y # CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y # CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set # CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y -CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_ISR_STACKSIZE=2096 CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y @@ -2969,6 +2988,16 @@ CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y CONFIG_WPA_MBEDTLS_CRYPTO=y CONFIG_WPA_MBEDTLS_TLS_CLIENT=y +CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH=y +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE is not set +# CONFIG_ESP32_COREDUMP_DATA_FORMAT_BIN is not set +CONFIG_ESP32_COREDUMP_DATA_FORMAT_ELF=y +CONFIG_ESP32_COREDUMP_CHECKSUM_CRC32=y +# CONFIG_ESP32_COREDUMP_CHECKSUM_SHA256 is not set +CONFIG_ESP32_ENABLE_COREDUMP=y +CONFIG_ESP32_CORE_DUMP_MAX_TASKS_NUM=64 +CONFIG_ESP32_CORE_DUMP_STACK_SIZE=0 CONFIG_TIMER_TASK_PRIORITY=1 CONFIG_TIMER_TASK_STACK_DEPTH=2048 CONFIG_TIMER_QUEUE_LENGTH=10