From d766493725d7651b69a0e0398c256349cf80fa60 Mon Sep 17 00:00:00 2001 From: mutatrum Date: Thu, 27 Mar 2025 20:12:32 +0200 Subject: [PATCH] Add asic failure status screen (#777) * Add an asic-status screen and graceful continuation Fixes #311 * Remove asic_state when model_name is unknown --- components/asic/asic.c | 8 -------- main/global_state.h | 2 +- main/main.c | 35 ++++++++++++++++++++++------------- main/nvs_device.c | 3 --- main/screen.c | 24 ++++++++++++------------ main/screen.h | 2 +- 6 files changed, 36 insertions(+), 38 deletions(-) diff --git a/components/asic/asic.c b/components/asic/asic.c index b2124205..2e00bae2 100644 --- a/components/asic/asic.c +++ b/components/asic/asic.c @@ -204,7 +204,6 @@ esp_err_t ASIC_set_device_model(GlobalState * GLOBAL_STATE) { if (strcmp(GLOBAL_STATE->device_model_str, "max") == 0) { GLOBAL_STATE->asic_model = ASIC_BM1397; - GLOBAL_STATE->valid_model = true; GLOBAL_STATE->asic_job_frequency_ms = (NONCE_SPACE / (double) (GLOBAL_STATE->POWER_MANAGEMENT_MODULE.frequency_value * BM1397_SMALL_CORE_COUNT * 1000)) / (double) ASIC_get_asic_count(GLOBAL_STATE); // no version-rolling so same Nonce Space is splitted between Small Cores GLOBAL_STATE->ASIC_difficulty = BM1397_ASIC_DIFFICULTY; ESP_LOGI(TAG, "DEVICE: bitaxeMax"); @@ -213,7 +212,6 @@ esp_err_t ASIC_set_device_model(GlobalState * GLOBAL_STATE) { } else if (strcmp(GLOBAL_STATE->device_model_str, "ultra") == 0) { GLOBAL_STATE->asic_model = ASIC_BM1366; - GLOBAL_STATE->valid_model = true; //GLOBAL_STATE.asic_job_frequency_ms = (NONCE_SPACE / (double) (GLOBAL_STATE.POWER_MANAGEMENT_MODULE.frequency_value * BM1366_CORE_COUNT * 1000)) / (double) BITAXE_ULTRA_ASIC_COUNT; // version-rolling so Small Cores have different Nonce Space GLOBAL_STATE->asic_job_frequency_ms = 2000; //ms GLOBAL_STATE->ASIC_difficulty = BM1366_ASIC_DIFFICULTY; @@ -223,7 +221,6 @@ esp_err_t ASIC_set_device_model(GlobalState * GLOBAL_STATE) { } else if (strcmp(GLOBAL_STATE->device_model_str, "supra") == 0) { GLOBAL_STATE->asic_model = ASIC_BM1368; - GLOBAL_STATE->valid_model = true; //GLOBAL_STATE.asic_job_frequency_ms = (NONCE_SPACE / (double) (GLOBAL_STATE.POWER_MANAGEMENT_MODULE.frequency_value * BM1368_CORE_COUNT * 1000)) / (double) BITAXE_SUPRA_ASIC_COUNT; // version-rolling so Small Cores have different Nonce Space GLOBAL_STATE->asic_job_frequency_ms = 500; //ms GLOBAL_STATE->ASIC_difficulty = BM1368_ASIC_DIFFICULTY; @@ -233,7 +230,6 @@ esp_err_t ASIC_set_device_model(GlobalState * GLOBAL_STATE) { } else if (strcmp(GLOBAL_STATE->device_model_str, "gamma") == 0) { GLOBAL_STATE->asic_model = ASIC_BM1370; - GLOBAL_STATE->valid_model = true; //GLOBAL_STATE.asic_job_frequency_ms = (NONCE_SPACE / (double) (GLOBAL_STATE.POWER_MANAGEMENT_MODULE.frequency_value * BM1370_CORE_COUNT * 1000)) / (double) BITAXE_GAMMA_ASIC_COUNT; // version-rolling so Small Cores have different Nonce Space GLOBAL_STATE->asic_job_frequency_ms = 500; //ms GLOBAL_STATE->ASIC_difficulty = BM1370_ASIC_DIFFICULTY; @@ -243,7 +239,6 @@ esp_err_t ASIC_set_device_model(GlobalState * GLOBAL_STATE) { } else if (strcmp(GLOBAL_STATE->device_model_str, "gammaturbo") == 0) { GLOBAL_STATE->asic_model = ASIC_BM1370; - GLOBAL_STATE->valid_model = true; //GLOBAL_STATE.asic_job_frequency_ms = (NONCE_SPACE / (double) (GLOBAL_STATE.POWER_MANAGEMENT_MODULE.frequency_value * BM1370_CORE_COUNT * 1000)) / (double) BITAXE_GAMMATURBO_ASIC_COUNT; // version-rolling so Small Cores have different Nonce Space GLOBAL_STATE->asic_job_frequency_ms = 500; //ms GLOBAL_STATE->ASIC_difficulty = BM1370_ASIC_DIFFICULTY; @@ -253,10 +248,7 @@ esp_err_t ASIC_set_device_model(GlobalState * GLOBAL_STATE) { } else { ESP_LOGE(TAG, "Invalid DEVICE model"); - // maybe should return here to now execute anything with a faulty device parameter ! - // this stops crashes/reboots and allows dev testing without an asic GLOBAL_STATE->device_model = DEVICE_UNKNOWN; - GLOBAL_STATE->valid_model = false; return ESP_FAIL; } return ESP_OK; diff --git a/main/global_state.h b/main/global_state.h index 27518ba0..c5fd877d 100644 --- a/main/global_state.h +++ b/main/global_state.h @@ -94,6 +94,7 @@ typedef struct bool is_firmware_update; char firmware_update_filename[20]; char firmware_update_status[20]; + char * asic_status; } SystemModule; typedef struct @@ -110,7 +111,6 @@ typedef struct char * device_model_str; int board_version; AsicModel asic_model; - bool valid_model; char * asic_model_str; double asic_job_frequency_ms; uint32_t ASIC_difficulty; diff --git a/main/main.c b/main/main.c index 16496093..091ea376 100644 --- a/main/main.c +++ b/main/main.c @@ -65,6 +65,11 @@ void app_main(void) return; } + if (ASIC_set_device_model(&GLOBAL_STATE) != ESP_OK) { + ESP_LOGE(TAG, "Error setting ASIC model"); + return; + } + // Optionally hold the boot button bool pressed = gpio_get_level(CONFIG_GPIO_BUTTON_BOOT) == 0; // LOW when pressed //should we run the self test? @@ -127,22 +132,26 @@ void app_main(void) wifi_softap_off(); - if (GLOBAL_STATE.valid_model) { - queue_init(&GLOBAL_STATE.stratum_queue); - queue_init(&GLOBAL_STATE.ASIC_jobs_queue); + queue_init(&GLOBAL_STATE.stratum_queue); + queue_init(&GLOBAL_STATE.ASIC_jobs_queue); - SERIAL_init(); - ASIC_init(&GLOBAL_STATE); - SERIAL_set_baud(ASIC_set_max_baud(&GLOBAL_STATE)); - SERIAL_clear_buffer(); + SERIAL_init(); - GLOBAL_STATE.ASIC_initalized = true; - - xTaskCreate(stratum_task, "stratum admin", 8192, (void *) &GLOBAL_STATE, 5, NULL); - xTaskCreate(create_jobs_task, "stratum miner", 8192, (void *) &GLOBAL_STATE, 10, NULL); - xTaskCreate(ASIC_task, "asic", 8192, (void *) &GLOBAL_STATE, 10, NULL); - xTaskCreate(ASIC_result_task, "asic result", 8192, (void *) &GLOBAL_STATE, 15, NULL); + if (ASIC_init(&GLOBAL_STATE) == 0) { + GLOBAL_STATE.SYSTEM_MODULE.asic_status = "Chip count 0"; + ESP_LOGE(TAG, "Chip count 0"); + return; } + + SERIAL_set_baud(ASIC_set_max_baud(&GLOBAL_STATE)); + SERIAL_clear_buffer(); + + GLOBAL_STATE.ASIC_initalized = true; + + xTaskCreate(stratum_task, "stratum admin", 8192, (void *) &GLOBAL_STATE, 5, NULL); + xTaskCreate(create_jobs_task, "stratum miner", 8192, (void *) &GLOBAL_STATE, 10, NULL); + xTaskCreate(ASIC_task, "asic", 8192, (void *) &GLOBAL_STATE, 10, NULL); + xTaskCreate(ASIC_result_task, "asic result", 8192, (void *) &GLOBAL_STATE, 15, NULL); } void MINER_set_wifi_status(wifi_status_t status, int retry_count, int reason) diff --git a/main/nvs_device.c b/main/nvs_device.c index 88ec9dab..e8a09d78 100644 --- a/main/nvs_device.c +++ b/main/nvs_device.c @@ -9,7 +9,6 @@ #include "connect.h" #include "global_state.h" -#include "asic.h" static const char * TAG = "nvs_device"; @@ -48,7 +47,5 @@ esp_err_t NVSDevice_parse_config(GlobalState * GLOBAL_STATE) { ESP_LOGI(TAG, "Found Device Model: %s", GLOBAL_STATE->device_model_str); ESP_LOGI(TAG, "Found Board Version: %d", GLOBAL_STATE->board_version); - ESP_RETURN_ON_ERROR(ASIC_set_device_model(GLOBAL_STATE), TAG, "Failed to get device model"); - return ESP_OK; } \ No newline at end of file diff --git a/main/screen.c b/main/screen.c index c9352f13..291368cc 100644 --- a/main/screen.c +++ b/main/screen.c @@ -18,6 +18,8 @@ static TickType_t current_screen_counter; static GlobalState * GLOBAL_STATE; +static lv_obj_t *asic_status_label; + static lv_obj_t *hashrate_label; static lv_obj_t *efficiency_label; static lv_obj_t *difficulty_label; @@ -95,20 +97,17 @@ static lv_obj_t * create_scr_overheat(SystemModule * module) { return scr; } -static lv_obj_t * create_scr_invalid_asic(SystemModule * module) { +static lv_obj_t * create_scr_asic_status(SystemModule * module) { lv_obj_t * scr = lv_obj_create(NULL); lv_obj_set_flex_flow(scr, LV_FLEX_FLOW_COLUMN); lv_obj_set_flex_align(scr, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_START); lv_obj_t *label1 = lv_label_create(scr); - lv_label_set_text(label1, "ASIC MODEL INVALID"); + lv_label_set_text(label1, "ASIC STATUS:"); - lv_obj_t *label2 = lv_label_create(scr); - lv_label_set_text(label2, "Wi-Fi (for setup):"); - - lv_obj_t *label3 = lv_label_create(scr); - lv_label_set_text(label3, module->ap_ssid); + asic_status_label = lv_label_create(scr); + lv_label_set_long_mode(asic_status_label, LV_LABEL_LONG_SCROLL_CIRCULAR); return scr; } @@ -280,13 +279,14 @@ static void screen_update_cb(lv_timer_t * timer) return; } - if (GLOBAL_STATE->valid_model == false) { - screen_show(SCR_INVALID_ASIC); + SystemModule * module = &GLOBAL_STATE->SYSTEM_MODULE; + + if (module->asic_status) { + lv_label_set_text(asic_status_label, module->asic_status); + screen_show(SCR_ASIC_STATUS); return; } - SystemModule * module = &GLOBAL_STATE->SYSTEM_MODULE; - if (module->overheat_mode == 1) { if (strcmp(module->ip_addr_str, lv_label_get_text(ip_addr_scr_overheat_label)) != 0) { lv_label_set_text(ip_addr_scr_overheat_label, module->ip_addr_str); @@ -395,7 +395,7 @@ esp_err_t screen_start(void * pvParameters) screens[SCR_SELF_TEST] = create_scr_self_test(); screens[SCR_OVERHEAT] = create_scr_overheat(module); - screens[SCR_INVALID_ASIC] = create_scr_invalid_asic(module); + screens[SCR_ASIC_STATUS] = create_scr_asic_status(module); screens[SCR_CONFIGURE] = create_scr_configure(module); screens[SCR_FIRMWARE_UPDATE] = create_scr_ota(module); screens[SCR_CONNECTION] = create_scr_connection(module); diff --git a/main/screen.h b/main/screen.h index 38cf7964..d10f0e29 100644 --- a/main/screen.h +++ b/main/screen.h @@ -4,7 +4,7 @@ typedef enum { SCR_SELF_TEST, SCR_OVERHEAT, - SCR_INVALID_ASIC, + SCR_ASIC_STATUS, SCR_CONFIGURE, SCR_FIRMWARE_UPDATE, SCR_CONNECTION,