void Config_Read(void) { char buf[80]; size_t len; char *name; char *result; int32_t val; int32_t dz_elev = 0; FRESULT res; res = f_open(&Main_file, "config.txt", FA_READ); if (res != FR_OK) { res = f_open(&Main_file, "config.txt", FA_WRITE | FA_CREATE_ALWAYS); if (res != FR_OK) { Main_activeLED = LEDS_RED; LEDs_ChangeLEDs(LEDS_ALL_LEDS, Main_activeLED); return ; } Config_WriteString_P(Config_default, &Main_file); f_close(&Main_file); res = f_open(&Main_file, "config.txt", FA_READ); if (res != FR_OK) { Main_activeLED = LEDS_RED; LEDs_ChangeLEDs(LEDS_ALL_LEDS, Main_activeLED); return ; } } while (!f_eof(&Main_file)) { f_gets(buf, sizeof(buf), &Main_file); len = strcspn(buf, ";"); buf[len] = 0; name = strtok(buf, " \t:"); if (name == 0) continue ; result = strtok(0, " \t:"); if (result == 0) continue ; val = atol(result); #define HANDLE_VALUE(s,w,r,t) \ if ((t) && !strcmp_P(name, (s))) { (w) = (r); } HANDLE_VALUE(Config_Model, UBX_model, val, val >= 0 && val <= 8); HANDLE_VALUE(Config_Rate, UBX_rate, val, val >= 100); HANDLE_VALUE(Config_Mode, UBX_mode, val, val >= 0 && val <= 4); HANDLE_VALUE(Config_Min, UBX_min, val, TRUE); HANDLE_VALUE(Config_Max, UBX_max, val, TRUE); HANDLE_VALUE(Config_Limits, UBX_limits, val, val >= 0 && val <= 2); HANDLE_VALUE(Config_Volume, Tone_volume, 8 - val, val >= 0 && val <= 8); HANDLE_VALUE(Config_Mode_2, UBX_mode_2, val, (val >= 0 && val <= 4) || (val >= 8 && val <= 9)); HANDLE_VALUE(Config_Min_Val_2, UBX_min_2, val, TRUE); HANDLE_VALUE(Config_Max_Val_2, UBX_max_2, val, TRUE); HANDLE_VALUE(Config_Min_Rate, UBX_min_rate, val * TONE_RATE_ONE_HZ / 100, val >= 0); HANDLE_VALUE(Config_Max_Rate, UBX_max_rate, val * TONE_RATE_ONE_HZ / 100, val >= 0); HANDLE_VALUE(Config_Flatline, UBX_flatline, val, val == 0 || val == 1); HANDLE_VALUE(Config_Sp_Mode, UBX_sp_mode, val, val >= 0 && val <= 6); HANDLE_VALUE(Config_Sp_Units, UBX_sp_units, val, val >= 0 && val <= 1); HANDLE_VALUE(Config_Sp_Rate, UBX_sp_rate, val * 1000, val >= 0 && val <= 32); HANDLE_VALUE(Config_Sp_Dec, UBX_sp_decimals, val, val >= 0 && val <= 2); HANDLE_VALUE(Config_Sp_Volume, Tone_sp_volume, 8 - val, val >= 0 && val <= 8); HANDLE_VALUE(Config_V_Thresh, UBX_threshold, val, TRUE); HANDLE_VALUE(Config_H_Thresh, UBX_hThreshold, val, TRUE); HANDLE_VALUE(Config_Use_SAS, UBX_use_sas, val, val == 0 || val == 1); HANDLE_VALUE(Config_Window, UBX_alarm_window, val * 1000, TRUE); HANDLE_VALUE(Config_DZ_Elev, dz_elev, val * 1000, TRUE); HANDLE_VALUE(Config_TZ_Offset, Log_tz_offset, val, TRUE); HANDLE_VALUE(Config_Sp_Test, UBX_sp_test, val, val == 0 || val == 1); #undef HANDLE_VALUE if (!strcmp_P(name, Config_Alarm_Elev)) { UBX_alarms[UBX_num_alarms].elev = val * 1000 + dz_elev; } if (!strcmp_P(name, Config_Alarm_Type) && val != 0) { UBX_alarms[UBX_num_alarms].type = val; ++UBX_num_alarms; } } f_close(&Main_file); }
static FRESULT Config_ReadSingle( const char *dir, const char *filename) { size_t len; char *name; char *result; int32_t val; FRESULT res; res = f_chdir(dir); if (res != FR_OK) return res; res = f_open(&Main_file, filename, FA_READ); if (res != FR_OK) return res; while (!f_eof(&Main_file)) { f_gets(Config_buf, sizeof(Config_buf), &Main_file); len = strcspn(Config_buf, ";"); Config_buf[len] = 0; name = strtok(Config_buf, " \r\n\t:"); if (name == 0) continue ; result = strtok(0, " \r\n\t:"); if (result == 0) continue ; val = atol(result); #define HANDLE_VALUE(s,w,r,t) \ if ((t) && !strcmp_P(name, (s))) { (w) = (r); } HANDLE_VALUE(Config_Model, UBX_model, val, val >= 0 && val <= 8); HANDLE_VALUE(Config_Rate, UBX_rate, val, val >= 100); HANDLE_VALUE(Config_Mode, UBX_mode, val, val >= 0 && val <= 4); HANDLE_VALUE(Config_Min, UBX_min, val, TRUE); HANDLE_VALUE(Config_Max, UBX_max, val, TRUE); HANDLE_VALUE(Config_Limits, UBX_limits, val, val >= 0 && val <= 2); HANDLE_VALUE(Config_Volume, Tone_volume, 8 - val, val >= 0 && val <= 8); HANDLE_VALUE(Config_Mode_2, UBX_mode_2, val, (val >= 0 && val <= 4) || (val >= 8 && val <= 9)); HANDLE_VALUE(Config_Min_Val_2, UBX_min_2, val, TRUE); HANDLE_VALUE(Config_Max_Val_2, UBX_max_2, val, TRUE); HANDLE_VALUE(Config_Min_Rate, UBX_min_rate, val * TONE_RATE_ONE_HZ / 100, val >= 0); HANDLE_VALUE(Config_Max_Rate, UBX_max_rate, val * TONE_RATE_ONE_HZ / 100, val >= 0); HANDLE_VALUE(Config_Flatline, UBX_flatline, val, val == 0 || val == 1); HANDLE_VALUE(Config_Sp_Mode, UBX_sp_mode, val, val >= 0 && val <= 6); HANDLE_VALUE(Config_Sp_Units, UBX_sp_units, val, val >= 0 && val <= 1); HANDLE_VALUE(Config_Sp_Rate, UBX_sp_rate, val * 1000, val >= 0 && val <= 32); HANDLE_VALUE(Config_Sp_Dec, UBX_sp_decimals, val, val >= 0 && val <= 2); HANDLE_VALUE(Config_Sp_Volume, Tone_sp_volume, 8 - val, val >= 0 && val <= 8); HANDLE_VALUE(Config_V_Thresh, UBX_threshold, val, TRUE); HANDLE_VALUE(Config_H_Thresh, UBX_hThreshold, val, TRUE); HANDLE_VALUE(Config_Use_SAS, UBX_use_sas, val, val == 0 || val == 1); HANDLE_VALUE(Config_Window, UBX_alarm_window, val * 1000, TRUE); HANDLE_VALUE(Config_DZ_Elev, UBX_dz_elev, val * 1000, TRUE); HANDLE_VALUE(Config_TZ_Offset, Log_tz_offset, val, TRUE); HANDLE_VALUE(Config_Init_Mode, UBX_init_mode, val, val >= 0 && val <= 2); #undef HANDLE_VALUE if (!strcmp_P(name, Config_Init_File)) { result[8] = '\0'; strcpy(UBX_init_filename, result); } if (!strcmp_P(name, Config_Alarm_Elev) && UBX_num_alarms < UBX_MAX_ALARMS) { ++UBX_num_alarms; UBX_alarms[UBX_num_alarms - 1].elev = val * 1000 + UBX_dz_elev; UBX_alarms[UBX_num_alarms - 1].type = 0; UBX_alarms[UBX_num_alarms - 1].filename[0] = '\0'; } if (!strcmp_P(name, Config_Alarm_Type) && UBX_num_alarms <= UBX_MAX_ALARMS) { UBX_alarms[UBX_num_alarms - 1].type = val; } if (!strcmp_P(name, Config_Alarm_File) && UBX_num_alarms <= UBX_MAX_ALARMS) { result[8] = '\0'; strcpy(UBX_alarms[UBX_num_alarms - 1].filename, result); } if (!strcmp_P(name, Config_Win_Top) && UBX_num_windows < UBX_MAX_WINDOWS) { ++UBX_num_windows; UBX_windows[UBX_num_windows - 1].top = val * 1000 + UBX_dz_elev; } if (!strcmp_P(name, Config_Win_Bottom) && UBX_num_windows <= UBX_MAX_WINDOWS) { UBX_windows[UBX_num_windows - 1].bottom = val * 1000 + UBX_dz_elev; } } f_close(&Main_file); return FR_OK; }