refactor self_test to be modular for new hardware

This commit is contained in:
Georges Palauqui 2024-06-13 19:22:41 +02:00
parent 2070108814
commit 3d6619f534
No known key found for this signature in database
GPG Key ID: 1E45F544CE4D04A5

View File

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