Add asic failure status screen (#777)

* Add an asic-status screen and graceful continuation

Fixes #311

* Remove asic_state when model_name is unknown
This commit is contained in:
mutatrum 2025-03-27 20:12:32 +02:00 committed by GitHub
parent 553c2c220b
commit d766493725
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 36 additions and 38 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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)

View File

@ -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;
}

View File

@ -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);

View File

@ -4,7 +4,7 @@
typedef enum {
SCR_SELF_TEST,
SCR_OVERHEAT,
SCR_INVALID_ASIC,
SCR_ASIC_STATUS,
SCR_CONFIGURE,
SCR_FIRMWARE_UPDATE,
SCR_CONNECTION,