Remove exception throwing

This commit is contained in:
GW_MC
2026-01-20 20:15:05 +08:00
parent a1404a196e
commit e163392532

View File

@@ -14,6 +14,7 @@
#include "esp_chip_info.h" #include "esp_chip_info.h"
#include "esp_flash.h" #include "esp_flash.h"
#include "esp_system.h" #include "esp_system.h"
#include "esp_log.h"
// //
#include "common/constants.h" #include "common/constants.h"
@@ -40,148 +41,131 @@ void init_queues(
void app_main(void) { void app_main(void) {
display_chip_info(); display_chip_info();
try { QueueHandle_t touch_event_queue = NULL;
QueueHandle_t touch_event_queue = NULL; EventGroupHandle_t system_event_group = NULL, system_lifecycle_event_group = NULL;
EventGroupHandle_t system_event_group = NULL, system_lifecycle_event_group = NULL;
init_queues(touch_event_queue, system_event_group, system_lifecycle_event_group); init_queues(touch_event_queue, system_event_group, system_lifecycle_event_group);
if (touch_event_queue == NULL || system_event_group == NULL || system_lifecycle_event_group == NULL) { if (touch_event_queue == NULL || system_event_group == NULL || system_lifecycle_event_group == NULL) {
throw std::runtime_error("Failed to create one or more queues/event groups"); ESP_LOGE("Main", "Failed to create one or more queues/event groups");
} vTaskDelay(5000 / portTICK_PERIOD_MS);
printf("Queues initialized.\n"); return esp_restart();
SemaphoreHandle_t lvgl_mutex = xSemaphoreCreateMutex(); }
if (lvgl_mutex == NULL) { printf("Queues initialized.\n");
throw std::runtime_error("Failed to create LVGL mutex"); SemaphoreHandle_t lvgl_mutex = xSemaphoreCreateMutex();
} if (lvgl_mutex == NULL) {
// ESP_LOGE("Main", "Failed to create LVGL mutex");
WifiHandler wifi_handler( vTaskDelay(5000 / portTICK_PERIOD_MS);
new NVSStorageHandler(WIFI_CREDENTIALS_STORAGE_NAMESPACE) return esp_restart();
); }
NetworkHandler* network_handler = new NetworkHandler(std::move(wifi_handler)); //
KVStorageHandler* kv_storage_handler = new NVSStorageHandler( WifiHandler wifi_handler(
DEFAULT_STORAGE_NAMESPACE new NVSStorageHandler(WIFI_CREDENTIALS_STORAGE_NAMESPACE)
); );
DisplayHandler* display_handler = new EInkDisplayHandler(touch_event_queue, lvgl_mutex); NetworkHandler* network_handler = new NetworkHandler(std::move(wifi_handler));
TouchHandler* touch_handler = new EInkTouchHandler(touch_event_queue); KVStorageHandler* kv_storage_handler = new NVSStorageHandler(
// DEFAULT_STORAGE_NAMESPACE
network_handler->init(system_event_group); );
kv_storage_handler->init(system_event_group); DisplayHandler* display_handler = new EInkDisplayHandler(touch_event_queue, lvgl_mutex);
display_handler->init(system_event_group); TouchHandler* touch_handler = new EInkTouchHandler(touch_event_queue);
touch_handler->init(system_event_group); //
// network_handler->init(system_event_group);
// LVGL tick timer kv_storage_handler->init(system_event_group);
auto lvgl_tick_timer_callback = [](TimerHandle_t xTimer) { display_handler->init(system_event_group);
lv_tick_inc(5); touch_handler->init(system_event_group);
}; //
TimerHandle_t lvgl_tick_timer = xTimerCreate( // LVGL tick timer
"lvgl_tick_timer", auto lvgl_tick_timer_callback = [](TimerHandle_t xTimer) {
pdMS_TO_TICKS(5), lv_tick_inc(5);
pdTRUE, };
NULL, TimerHandle_t lvgl_tick_timer = xTimerCreate(
lvgl_tick_timer_callback "lvgl_tick_timer",
); pdMS_TO_TICKS(5),
if (lvgl_tick_timer == NULL) { pdTRUE,
throw std::runtime_error("Failed to create LVGL tick timer"); NULL,
} lvgl_tick_timer_callback
xTimerStart(lvgl_tick_timer, 0); );
if (lvgl_tick_timer == NULL) {
ESP_LOGE("Main", "Failed to create LVGL tick timer");
vTaskDelay(5000 / portTICK_PERIOD_MS);
return esp_restart();
}
xTimerStart(lvgl_tick_timer, 0);
// //
printf("Waiting for system to be ready...\n"); printf("Waiting for system to be ready...\n");
xEventGroupWaitBits( xEventGroupWaitBits(
system_event_group, system_event_group,
DISPLAY_READY_BIT | TOUCH_CALIBRATED_BIT | STORAGE_READY_BIT | NETWORK_READY_BIT, DISPLAY_READY_BIT | TOUCH_CALIBRATED_BIT | STORAGE_READY_BIT | NETWORK_READY_BIT,
// do not clear on exit, require explicit reset // do not clear on exit, require explicit reset
pdFALSE, pdFALSE,
pdTRUE, pdTRUE,
portMAX_DELAY portMAX_DELAY
); );
printf("System is ready. Starting main application...\n"); printf("System is ready. Starting main application...\n");
// starting event loops // starting event loops
display_handler->start_event_loop(); display_handler->start_event_loop();
touch_handler->start_event_loop(); touch_handler->start_event_loop();
// wait for shutdown signal // wait for shutdown signal
EventBits_t bits = xEventGroupWaitBits(
system_lifecycle_event_group,
SYSTEM_SHUTDOWN_BIT | SYSTEM_RESTART_BIT,
// do not clear on exit, require explicit reset
pdFALSE,
pdFALSE,
portMAX_DELAY
);
printf("Shutdown signal received. Cleaning up...\n");
// cleanup
shutdown_display_handlerFunc shutdown_display_handler = display_handler->get_shutdown_display_handler();
restart_display_handlerFunc restart_display_handler = display_handler->get_restart_display_handler();
delete display_handler;
delete touch_handler;
vSemaphoreDelete(lvgl_mutex);
vEventGroupDelete(system_event_group);
vQueueDelete(touch_event_queue);
printf("Cleanup complete.\n");
// handle shutdown or restart
if (bits & SYSTEM_SHUTDOWN_BIT) {
if (shutdown_display_handler != nullptr) {
printf("Calling display shutdown handler...\n");
shutdown_display_handler();
} else {
printf("No display shutdown handler to call.\n");
}
printf("System is shutting down.\n");
fflush(stdout);
// wait for start bit to be set again if future restart is desired, else expect manual power cycle
EventBits_t bits = xEventGroupWaitBits( EventBits_t bits = xEventGroupWaitBits(
system_lifecycle_event_group, system_lifecycle_event_group,
SYSTEM_SHUTDOWN_BIT | SYSTEM_RESTART_BIT, SYSTEM_START_BIT,
// do not clear on exit, require explicit reset
pdFALSE, pdFALSE,
pdFALSE, pdFALSE,
portMAX_DELAY portMAX_DELAY
); );
printf("Shutdown signal received. Cleaning up...\n"); if (bits & SYSTEM_START_BIT) {
printf("SYSTEM_START_BIT received, restarting system.\n");
// cleanup
shutdown_display_handlerFunc shutdown_display_handler = display_handler->get_shutdown_display_handler();
restart_display_handlerFunc restart_display_handler = display_handler->get_restart_display_handler();
delete display_handler;
delete touch_handler;
vSemaphoreDelete(lvgl_mutex);
vEventGroupDelete(system_event_group);
vQueueDelete(touch_event_queue);
printf("Cleanup complete.\n");
// handle shutdown or restart
if (bits & SYSTEM_SHUTDOWN_BIT) {
if (shutdown_display_handler != nullptr) {
printf("Calling display shutdown handler...\n");
shutdown_display_handler();
} else {
printf("No display shutdown handler to call.\n");
}
printf("System is shutting down.\n");
fflush(stdout);
// wait for start bit to be set again if future restart is desired, else expect manual power cycle
EventBits_t bits = xEventGroupWaitBits(
system_lifecycle_event_group,
SYSTEM_START_BIT,
pdFALSE,
pdFALSE,
portMAX_DELAY
);
if (bits & SYSTEM_START_BIT) {
printf("SYSTEM_START_BIT received, restarting system.\n");
} else {
printf("No restart signal received, waiting for manual power cycle.\n");
while (true) {
vTaskDelay(portMAX_DELAY);
}
}
} else if (bits & SYSTEM_RESTART_BIT) {
if (restart_display_handler != nullptr) {
printf("Calling display restart handler...\n");
restart_display_handler();
} else {
printf("No display restart handler to call.\n");
}
printf("System is restarting.\n");
fflush(stdout);
} else { } else {
printf("Unknown shutdown signal received. Restarting by default.\n"); printf("No restart signal received, waiting for manual power cycle.\n");
fflush(stdout); while (true) {
vTaskDelay(portMAX_DELAY);
}
} }
} else if (bits & SYSTEM_RESTART_BIT) {
return esp_restart(); if (restart_display_handler != nullptr) {
} printf("Calling display restart handler...\n");
catch (const std::exception& e) { restart_display_handler();
printf("Exception occurred during initialization: %s\n", e.what()); } else {
printf("System will restart due to the error.\n"); printf("No display restart handler to call.\n");
for (int i = 5; i >= 0; --i) {
printf("Restarting in %d seconds...\n", i);
vTaskDelay(1000 / portTICK_PERIOD_MS);
} }
printf("Restarting now.\n"); printf("System is restarting.\n");
fflush(stdout);
} else {
printf("Unknown shutdown signal received. Restarting by default.\n");
fflush(stdout); fflush(stdout);
return esp_restart();
} }
printf("Reached end of app_main unexpectedly.\n");
printf("System will restart in 10 seconds...\n");
for (int i = 10; i >= 0; --i) {
printf("Restarting in %d seconds...\n", i);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
printf("Restarting now.\n");
fflush(stdout);
return esp_restart(); return esp_restart();
} }