diff --git a/main/self_test/self_test.c b/main/self_test/self_test.c index 076513ac..aa15606c 100644 --- a/main/self_test/self_test.c +++ b/main/self_test/self_test.c @@ -14,10 +14,27 @@ static const char * TAG = "self_test"; -static bool fan_sense_pass(GlobalState * global_state) +static void display_msg(char * msg, GlobalState * GLOBAL_STATE) { + SystemModule * module = &GLOBAL_STATE->SYSTEM_MODULE; + + switch (GLOBAL_STATE->device_model) { + case DEVICE_MAX: + case DEVICE_ULTRA: + case DEVICE_SUPRA: + if (OLED_status()) { + memset(module->oled_buf, 0, 20); + snprintf(module->oled_buf, 20, msg); + OLED_writeString(0, 2, module->oled_buf); + } + break; + default: + } +} + +static bool fan_sense_pass(GlobalState * GLOBAL_STATE) { uint16_t fan_speed = 0; - switch (global_state->device_model) { + switch (GLOBAL_STATE->device_model) { case DEVICE_MAX: case DEVICE_ULTRA: case DEVICE_SUPRA: @@ -42,9 +59,9 @@ static bool power_consumption_pass() return false; } -static bool core_voltage_pass(GlobalState * global_state) +static bool core_voltage_pass(GlobalState * GLOBAL_STATE) { - uint16_t core_voltage = VCORE_get_voltage_mv(global_state); + uint16_t core_voltage = VCORE_get_voltage_mv(GLOBAL_STATE); ESP_LOGI(TAG, "Voltage: %u", core_voltage); if (core_voltage > 1100 && core_voltage < 1300) { @@ -57,7 +74,6 @@ void self_test(void * pvParameters) { GlobalState * GLOBAL_STATE = (GlobalState *) pvParameters; - SystemModule * module = &GLOBAL_STATE->SYSTEM_MODULE; GLOBAL_STATE->ASIC_TASK_MODULE.active_jobs = malloc(sizeof(bm_job *) * 128); GLOBAL_STATE->valid_jobs = malloc(sizeof(uint8_t) * 128); @@ -68,9 +84,16 @@ void self_test(void * pvParameters) GLOBAL_STATE->valid_jobs[i] = 0; } - // turn ASIC on - gpio_set_direction(GPIO_NUM_10, GPIO_MODE_OUTPUT); - gpio_set_level(GPIO_NUM_10, 0); + switch (GLOBAL_STATE->device_model) { + case DEVICE_MAX: + case DEVICE_ULTRA: + case DEVICE_SUPRA: + // turn ASIC on + gpio_set_direction(GPIO_NUM_10, GPIO_MODE_OUTPUT); + gpio_set_level(GPIO_NUM_10, 0); + break; + default: + } // Init I2C ESP_ERROR_CHECK(i2c_master_init()); @@ -79,30 +102,44 @@ void self_test(void * pvParameters) VCORE_init(GLOBAL_STATE); VCORE_set_voltage(nvs_config_get_u16(NVS_CONFIG_ASIC_VOLTAGE, CONFIG_ASIC_VOLTAGE) / 1000.0, GLOBAL_STATE); - EMC2101_init(nvs_config_get_u16(NVS_CONFIG_INVERT_FAN_POLARITY, 1)); - EMC2101_set_fan_speed(1); - - // oled - if (!OLED_init()) { - ESP_LOGI(TAG, "OLED init failed!"); - } else { - ESP_LOGI(TAG, "OLED init success!"); - // clear the oled screen - OLED_fill(0); + switch (GLOBAL_STATE->device_model) { + case DEVICE_MAX: + case DEVICE_ULTRA: + case DEVICE_SUPRA: + EMC2101_init(nvs_config_get_u16(NVS_CONFIG_INVERT_FAN_POLARITY, 1)); + EMC2101_set_fan_speed(1); + break; + default: } - if (OLED_status()) { - memset(module->oled_buf, 0, 20); - snprintf(module->oled_buf, 20, "SELF TEST..."); - OLED_writeString(0, 0, module->oled_buf); + // Display testing + switch (GLOBAL_STATE->device_model) { + case DEVICE_MAX: + case DEVICE_ULTRA: + case DEVICE_SUPRA: + if (!OLED_init()) { + ESP_LOGE(TAG, "OLED init failed!"); + } else { + ESP_LOGI(TAG, "OLED init success!"); + // clear the oled screen + OLED_fill(0); + display_msg("SELF TEST...", GLOBAL_STATE); + } + break; + default: } - if(!DS4432U_test()){ - if (OLED_status()) { - memset(module->oled_buf, 0, 20); - snprintf(module->oled_buf, 20, "DS4432U:FAIL"); - OLED_writeString(0, 2, module->oled_buf); - } + // VCore regulator testing + switch (GLOBAL_STATE->device_model) { + case DEVICE_MAX: + case DEVICE_ULTRA: + case DEVICE_SUPRA: + if(!DS4432U_test()){ + ESP_LOGE(TAG, "DS4432 test failed!"); + display_msg("DS4432U:FAIL", GLOBAL_STATE); + } + break; + default: } @@ -177,11 +214,7 @@ void self_test(void * pvParameters) if (chips_detected < 1) { ESP_LOGE(TAG, "SELF TEST FAIL, NO CHIPS DETECTED"); // ESP_LOGE(TAG, "SELF TEST FAIL, INCORRECT NONCE DIFF"); - if (OLED_status()) { - memset(module->oled_buf, 0, 20); - snprintf(module->oled_buf, 20, "ASIC:FAIL NO CHIPS"); - OLED_writeString(0, 2, module->oled_buf); - } + display_msg("ASIC:FAIL NO CHIPS", GLOBAL_STATE); return; } @@ -189,33 +222,30 @@ void self_test(void * pvParameters) free(GLOBAL_STATE->valid_jobs); if (!core_voltage_pass(GLOBAL_STATE)) { - if (OLED_status()) { - memset(module->oled_buf, 0, 20); - snprintf(module->oled_buf, 20, "POWER: FAIL"); - OLED_writeString(0, 2, module->oled_buf); - } + ESP_LOGE(TAG, "SELF TEST FAIL, NO CHIPS DETECTED"); + display_msg("POWER: FAIL", GLOBAL_STATE); return; } - if (INA260_installed() && !power_consumption_pass()) { - if (OLED_status()) { - memset(module->oled_buf, 0, 20); - snprintf(module->oled_buf, 20, "POWER: FAIL"); - OLED_writeString(0, 2, module->oled_buf); - } - return; + switch (GLOBAL_STATE->device_model) { + case DEVICE_MAX: + case DEVICE_ULTRA: + case DEVICE_SUPRA: + if (INA260_installed() && !power_consumption_pass()) { + ESP_LOGE(TAG, "INA260 test failed!"); + display_msg("MONITOR: FAIL", GLOBAL_STATE); + return; + } + break; + default: } if (!fan_sense_pass(GLOBAL_STATE)) { - memset(module->oled_buf, 0, 20); - snprintf(module->oled_buf, 20, "FAN: WARN"); - OLED_writeString(0, 1, module->oled_buf); + ESP_LOGE(TAG, "FAN test failed!"); + display_msg("FAN: WARN", GLOBAL_STATE); } - memset(module->oled_buf, 0, 20); - snprintf(module->oled_buf, 20, " PASS"); - OLED_writeString(0, 2, module->oled_buf); + display_msg(" PASS", GLOBAL_STATE); nvs_config_set_u16(NVS_CONFIG_SELF_TEST, 0); - }