diff --git a/main/global_state.h b/main/global_state.h index 4e57109a6..cf1984cda 100644 --- a/main/global_state.h +++ b/main/global_state.h @@ -101,6 +101,7 @@ typedef struct char *message; char *result; char *finished; + esp_err_t system_init_ret; } SelfTestModule; typedef struct diff --git a/main/main.c b/main/main.c index 91c4a1502..1e7b46079 100644 --- a/main/main.c +++ b/main/main.c @@ -86,16 +86,22 @@ void app_main(void) wifi_init(&GLOBAL_STATE); } - SYSTEM_init_peripherals(&GLOBAL_STATE); - - if (xTaskCreate(POWER_MANAGEMENT_task, "power management", 8192, (void *) &GLOBAL_STATE, 10, NULL) != pdPASS) { - ESP_LOGE(TAG, "Error creating power management task"); + esp_err_t system_init_ret = SYSTEM_init_peripherals(&GLOBAL_STATE); + + if (system_init_ret == ESP_OK) { + if (xTaskCreate(POWER_MANAGEMENT_task, "power management", 8192, (void *) &GLOBAL_STATE, 10, NULL) != pdPASS) { + ESP_LOGE(TAG, "Error creating power management task"); + } + if (!GLOBAL_STATE.SELF_TEST_MODULE.is_active) { + if (xTaskCreate(FAN_CONTROLLER_task, "fan_controller", 8192, (void *) &GLOBAL_STATE, 5, NULL) != pdPASS) { + ESP_LOGE(TAG, "Error creating fan controller task"); + } + } + } else { + ESP_LOGE(TAG, "Critical peripheral initialization failure (%s). Entering degraded mode.", esp_err_to_name(GLOBAL_STATE.SELF_TEST_MODULE.system_init_ret)); } - + if (!GLOBAL_STATE.SELF_TEST_MODULE.is_active) { - if (xTaskCreate(FAN_CONTROLLER_task, "fan_controller", 8192, (void *) &GLOBAL_STATE, 5, NULL) != pdPASS) { - ESP_LOGE(TAG, "Error creating fan controller task"); - } // start the API for AxeOS start_rest_server((void *) &GLOBAL_STATE); } @@ -116,32 +122,37 @@ void app_main(void) queue_init(&GLOBAL_STATE.stratum_queue); - if (asic_initialize(&GLOBAL_STATE, ASIC_INIT_COLD_BOOT, 0) == 0) { - return; - } + if (system_init_ret == ESP_OK) { + if (asic_initialize(&GLOBAL_STATE, ASIC_INIT_COLD_BOOT, 0) == 0) { + return; + } - if (xTaskCreate(create_jobs_task, "stratum miner", 8192, (void *) &GLOBAL_STATE, 20, NULL) != pdPASS) { - ESP_LOGE(TAG, "Error creating stratum miner task"); - } - if (xTaskCreate(ASIC_result_task, "asic result", 8192, (void *) &GLOBAL_STATE, 15, NULL) != pdPASS) { - ESP_LOGE(TAG, "Error creating asic result task"); - } + if (xTaskCreate(create_jobs_task, "stratum miner", 8192, (void *) &GLOBAL_STATE, 20, NULL) != pdPASS) { + ESP_LOGE(TAG, "Error creating stratum miner task"); + } + if (xTaskCreate(ASIC_result_task, "asic result", 8192, (void *) &GLOBAL_STATE, 15, NULL) != pdPASS) { + ESP_LOGE(TAG, "Error creating asic result task"); + } - if (!GLOBAL_STATE.SELF_TEST_MODULE.is_active) { - if (xTaskCreate(stratum_task, "stratum admin", 8192, (void *) &GLOBAL_STATE, 5, NULL) != pdPASS) { - ESP_LOGE(TAG, "Error creating stratum admin task"); + if (!GLOBAL_STATE.SELF_TEST_MODULE.is_active) { + if (xTaskCreate(stratum_task, "stratum admin", 8192, (void *) &GLOBAL_STATE, 5, NULL) != pdPASS) { + ESP_LOGE(TAG, "Error creating stratum admin task"); + } } - } else { - if (xTaskCreate(self_test_task, "self_test", 8192, (void *) &GLOBAL_STATE, 10, NULL) != pdPASS) { - ESP_LOGE(TAG, "Error creating self test task"); + + if (xTaskCreateWithCaps(hashrate_monitor_task, "hashrate monitor", 8192, (void *) &GLOBAL_STATE, 5, NULL, MALLOC_CAP_SPIRAM) != + pdPASS) { + ESP_LOGE(TAG, "Error creating hashrate monitor task"); + } + if (xTaskCreateWithCaps(statistics_task, "statistics", 8192, (void *) &GLOBAL_STATE, 3, NULL, MALLOC_CAP_SPIRAM) != pdPASS) { + ESP_LOGE(TAG, "Error creating statistics task"); } } - if (xTaskCreateWithCaps(hashrate_monitor_task, "hashrate monitor", 8192, (void *) &GLOBAL_STATE, 5, NULL, MALLOC_CAP_SPIRAM) != - pdPASS) { - ESP_LOGE(TAG, "Error creating hashrate monitor task"); - } - if (xTaskCreateWithCaps(statistics_task, "statistics", 8192, (void *) &GLOBAL_STATE, 3, NULL, MALLOC_CAP_SPIRAM) != pdPASS) { - ESP_LOGE(TAG, "Error creating statistics task"); + if (GLOBAL_STATE.SELF_TEST_MODULE.is_active) { + GLOBAL_STATE.SELF_TEST_MODULE.system_init_ret = system_init_ret; + if (xTaskCreate(self_test_task, "self_test", 8192, (void *) &GLOBAL_STATE, 10, NULL) != pdPASS) { + ESP_LOGE(TAG, "Error creating self test task"); + } } } diff --git a/main/screen.c b/main/screen.c index 3f27d42a7..d28bb6fec 100644 --- a/main/screen.c +++ b/main/screen.c @@ -105,8 +105,6 @@ static uint64_t current_work_received; static int8_t current_rssi_value; static int current_block_height; -static bool self_test_finished; - static screen_t get_current_screen() { lv_obj_t * active_screen = lv_screen_active(); for (screen_t scr = 0; scr < MAX_SCREENS; scr++) { @@ -134,10 +132,7 @@ static lv_obj_t * create_scr_self_test() { self_test_message_label = lv_label_create(scr); self_test_result_label = lv_label_create(scr); - self_test_finished_label = lv_label_create(scr); - lv_obj_set_width(self_test_finished_label, LV_HOR_RES); - lv_label_set_long_mode(self_test_finished_label, LV_LABEL_LONG_SCROLL_CIRCULAR); return scr; } @@ -449,8 +444,7 @@ static void screen_update_cb(lv_timer_t * timer) lv_label_set_text(self_test_message_label, self_test->message); - if (self_test->is_finished && !self_test_finished) { - self_test_finished = true; + if (self_test->is_finished) { lv_label_set_text(self_test_result_label, self_test->result); lv_label_set_text(self_test_finished_label, self_test->finished); } diff --git a/main/self_test/self_test.c b/main/self_test/self_test.c index c4e82ceec..98ce4e5b2 100644 --- a/main/self_test/self_test.c +++ b/main/self_test/self_test.c @@ -1,13 +1,8 @@ #include - -// #include "freertos/event_groups.h" -// #include "freertos/timers.h" #include "driver/gpio.h" - #include "esp_log.h" #include "esp_timer.h" #include "esp_check.h" -#include "esp_psram.h" #include "DS4432U.h" #include "thermal.h" @@ -15,8 +10,6 @@ #include "power.h" #include "nvs_config.h" #include "global_state.h" - -#include "asic.h" #include "asic_reset.h" #include "device_config.h" #include "hashrate_monitor_task.h" @@ -219,7 +212,7 @@ void self_test_task(void * pvParameters) if (!GLOBAL_STATE->SELF_TEST_MODULE.is_active) return; // Check if we already have an error message from peripheral initialization - if (GLOBAL_STATE->SELF_TEST_MODULE.message != NULL && strlen(GLOBAL_STATE->SELF_TEST_MODULE.message) > 0) { + if (GLOBAL_STATE->SELF_TEST_MODULE.system_init_ret != ESP_OK) { ESP_LOGE(TAG, "Aborting self-test due to initialization failure: %s", GLOBAL_STATE->SELF_TEST_MODULE.message); tests_done(GLOBAL_STATE, false); } @@ -422,8 +415,12 @@ static void tests_done(GlobalState * GLOBAL_STATE, bool isTestPassed) } ESP_LOGI(TAG, "SELF-TEST PASS! -- Restarting in 10 seconds."); GLOBAL_STATE->SELF_TEST_MODULE.result = "SELF-TEST PASS!"; - GLOBAL_STATE->SELF_TEST_MODULE.finished = "Restarting in 10 seconds."; - vTaskDelay(10000 / portTICK_PERIOD_MS); + char logString[21]; + for (int i = 10; i > 0; i--) { + snprintf(logString, sizeof(logString), "Restarting in %d...", i); + GLOBAL_STATE->SELF_TEST_MODULE.finished = logString; + vTaskDelay(1000 / portTICK_PERIOD_MS); + } esp_restart(); } else { // isTestFailed diff --git a/main/system.c b/main/system.c index ddc91b4a6..a5bea2922 100644 --- a/main/system.c +++ b/main/system.c @@ -208,7 +208,9 @@ esp_err_t SYSTEM_init_peripherals(GlobalState * GLOBAL_STATE) { if (ret != ESP_OK) { self_test_show_message(GLOBAL_STATE, "FILESYS:FAIL"); ESP_LOGE(TAG, "Filesystem init failed"); - return ret; + if (GLOBAL_STATE->SELF_TEST_MODULE.is_active) { + return ret; + } } // Initialize the core voltage regulator