// // Created by cfif on 18.04.23. // #include "DeviceStorageIni.h" #include "string.h" #include "base64_encode_decode.h" // Сохранение настроек во временные void Nvm_To_RuntimeSettings(tDeviceStorageIni *env) { memcpy(&env->runtime.Settings_General, &env->nvm.Settings_General, sizeof(env->nvm.Settings_General)); memcpy(&env->runtime.Settings_Basic_Access, &env->nvm.Settings_Basic_Access, sizeof(env->nvm.Settings_Basic_Access)); memcpy(&env->runtime.Settings_Frequency_Speed, &env->nvm.Settings_Frequency_Speed, sizeof(env->nvm.Settings_Frequency_Speed)); memcpy(&env->runtime.Settings_Network, &env->nvm.Settings_Network, sizeof(env->nvm.Settings_Network)); memcpy(&env->runtime.Settings_Tracert, &env->nvm.Settings_Tracert, sizeof(env->nvm.Settings_Tracert)); memcpy(&env->runtime.Settings_Transceiver, &env->nvm.Settings_Transceiver, sizeof(env->nvm.Settings_Transceiver)); memcpy(&env->runtime.Settings_GSM, &env->nvm.Settings_GSM, sizeof(env->nvm.Settings_GSM)); memcpy(&env->runtime.Settings_RS485_Bluetooth, &env->nvm.Settings_RS485_Bluetooth, sizeof(env->nvm.Settings_RS485_Bluetooth)); memcpy(&env->runtime.Settings_Transmitter, &env->nvm.Settings_Transmitter, sizeof(env->nvm.Settings_Transmitter)); memcpy(&env->runtime.Settings_Msd, &env->nvm.Settings_Msd, sizeof(env->nvm.Settings_Msd)); memcpy(&env->runtime.Settings_AmsRadar, &env->nvm.Settings_AmsRadar, sizeof(env->nvm.Settings_AmsRadar)); memcpy(&env->runtime.Settings_LoRaWan, &env->nvm.Settings_LoRaWan, sizeof(env->nvm.Settings_LoRaWan)); } // Загрузка настроек из временных void Runtime_To_NvmSettings(tDeviceStorageIni *env) { memcpy(&env->nvm.Settings_General, &env->runtime.Settings_General, sizeof(env->runtime.Settings_General)); memcpy(&env->nvm.Settings_Basic_Access, &env->runtime.Settings_Basic_Access, sizeof(env->runtime.Settings_Basic_Access)); memcpy(&env->nvm.Settings_Frequency_Speed, &env->runtime.Settings_Frequency_Speed, sizeof(env->runtime.Settings_Frequency_Speed)); memcpy(&env->nvm.Settings_Network, &env->runtime.Settings_Network, sizeof(env->runtime.Settings_Network)); memcpy(&env->nvm.Settings_Tracert, &env->runtime.Settings_Tracert, sizeof(env->runtime.Settings_Tracert)); memcpy(&env->nvm.Settings_Transceiver, &env->runtime.Settings_Transceiver, sizeof(env->runtime.Settings_Transceiver)); memcpy(&env->nvm.Settings_GSM, &env->runtime.Settings_GSM, sizeof(env->runtime.Settings_GSM)); memcpy(&env->nvm.Settings_RS485_Bluetooth, &env->runtime.Settings_RS485_Bluetooth, sizeof(env->runtime.Settings_RS485_Bluetooth)); memcpy(&env->nvm.Settings_Transmitter, &env->runtime.Settings_Transmitter, sizeof(env->runtime.Settings_Transmitter)); memcpy(&env->nvm.Settings_Msd, &env->runtime.Settings_Msd, sizeof(env->runtime.Settings_Msd)); memcpy(&env->nvm.Settings_AmsRadar, &env->runtime.Settings_AmsRadar, sizeof(env->runtime.Settings_AmsRadar)); memcpy(&env->nvm.Settings_LoRaWan, &env->runtime.Settings_LoRaWan, sizeof(env->runtime.Settings_LoRaWan)); } void DeviceDataNonVolatile_Setup_Init_Defaults(tDeviceDataNonVolatile *env) { vSettings_Basic_AccessInitDefaults(&env->Settings_Basic_Access); vSettings_Settings_Date_TimeInitDefaults(&env->Settings_Date_Time); vSettings_Frequency_SpeedInitDefaults(&env->Settings_Frequency_Speed); vSettings_GeneralInitDefaults(&env->Settings_General); vSettings_NetworkInitDefaults(&env->Settings_Network); vSettings_RS485_BluetoothInitDefaults(&env->Settings_RS485_Bluetooth); vSettings_TracertInitDefaults(&env->Settings_Tracert); vSettings_TransceiverInitDefaults(&env->Settings_Transceiver); vSettings_GSMInitDefaults(&env->Settings_GSM); vSettings_TransmitterInitDefaults(&env->Settings_Transmitter); vSettings_MsdInitDefaults(&env->Settings_Msd); vSettings_AmsRadarInitDefaults(&env->Settings_AmsRadar); vSettings_LoRaWanInitDefaults(&env->Settings_LoRaWan); } void DeviceDataNonVolatile_Counter_Init_Defaults(tDeviceDataNonVolatile *env) { env->maxId_OutBox = 0; env->maxId_InBox = 0; env->routing = 0; env->dist = 2000; env->timeZoneInSat = 5; env->flagSos = 0; } void DeviceStorageCounterIni_Dump(tDeviceStorageIni *env) { if (osMutexAcquire(env->writeAccess, 2000) == osOK) { int result = ini_putl("CounterId", "IdOutBox", env->nvm.maxId_OutBox, env->file_name_counter); result = ini_putl("CounterId", "IdInBox", env->nvm.maxId_InBox, env->file_name_counter); osMutexRelease(env->writeAccess); } } void DeviceStorageCounterIni_DumpDist(tDeviceStorageIni *env) { if (osMutexAcquire(env->writeAccess, 2000) == osOK) { int result = ini_putl("Alm", "dist", env->nvm.dist, env->file_name_counter); osMutexRelease(env->writeAccess); } } void DeviceStorageCounterIni_DumpRouting(tDeviceStorageIni *env) { if (osMutexAcquire(env->writeAccess, 2000) == osOK) { int result = ini_putl("Alm", "routing", env->nvm.routing, env->file_name_counter); result = ini_putl("Alm", "timeZoneInSat", env->nvm.timeZoneInSat, env->file_name_counter); osMutexRelease(env->writeAccess); } } void DeviceStorageCounterIni_DumpSos(tDeviceStorageIni *env) { if (osMutexAcquire(env->writeAccess, 2000) == osOK) { int result = ini_putl("Alm", "sos", env->nvm.flagSos, env->file_name_counter); osMutexRelease(env->writeAccess); } } void DeviceStorageCounterIni_Load(tDeviceStorageIni *env) { env->nvm.maxId_OutBox = ini_getl("CounterId", "IdOutBox", 0, env->file_name_counter); env->nvm.maxId_InBox = ini_getl("CounterId", "IdInBox", 0, env->file_name_counter); env->nvm.routing = ini_getl("Alm", "routing", 0, env->file_name_counter); env->nvm.dist = ini_getl("Alm", "dist", 2000, env->file_name_counter); env->nvm.timeZoneInSat = ini_getl("Alm", "timeZoneInSat", 5, env->file_name_counter); env->nvm.flagSos = ini_getl("Alm", "sos", 0, env->file_name_counter); } static void delCharNoChar(char *str) { uint8_t ch = '\n'; while ((ch == '\n') || (ch == '\r')) { if (strlen(str) == 0) break; if (strlen(str) >= 255) break; uint8_t index = strlen(str) - 1; ch = str[index]; if ((ch == '\n') || (ch == '\r')) { str[index] = 0; } } } void DeviceStorageSetupIni_Dump(tDeviceStorageIni *env) { if (osMutexAcquire(env->writeAccess, 2000) == osOK) { for (int i = 0; i < env->settingsCount; ++i) { if (strcmp(env->settings[i].typ, "dec") == 0) { int result = ini_putl(env->settings[i].section, env->settings[i].hlp, *(uint32_t *) env->settings[i].val, env->file_name_setup); } if (strcmp(env->settings[i].typ, "sel") == 0) { int result = ini_putl(env->settings[i].section, env->settings[i].hlp, *(uint8_t *) env->settings[i].cur, env->file_name_setup); } if (strcmp(env->settings[i].typ, "txt") == 0) { delCharNoChar(env->settings[i].val); int result = ini_puts(env->settings[i].section, env->settings[i].hlp, env->settings[i].val, env->file_name_setup); } if (strcmp(env->settings[i].typ, "psw") == 0) { delCharNoChar(env->settings[i].val); char pswBuf[128]; memset(pswBuf, 0, sizeof(pswBuf)); base64_encode(pswBuf, sizeof(pswBuf), env->settings[i].val, strlen(env->settings[i].val)); int result = ini_puts(env->settings[i].section, env->settings[i].hlp, pswBuf, env->file_name_setup); // int result = ini_puts(env->settings[i].section, env->settings[i].hlp, env->settings[i].val, // env->file_name_setup); } } osMutexRelease(env->writeAccess); } } void DeviceStorageSetupIni_Load(tDeviceStorageIni *env) { for (int i = 0; i < env->settingsCount; ++i) { if (strcmp(env->settings[i].typ, "dec") == 0) { *(uint32_t *) env->settings[i].val = ini_getl(env->settings[i].section, env->settings[i].hlp, 0, env->file_name_setup); } if (strcmp(env->settings[i].typ, "sel") == 0) { *(uint8_t *) env->settings[i].cur = ini_getl(env->settings[i].section, env->settings[i].hlp, 0, env->file_name_setup); } if (strcmp(env->settings[i].typ, "txt") == 0) { int result = ini_gets(env->settings[i].section, env->settings[i].hlp, "", env->settings[i].val, 128, env->file_name_setup); } if (strcmp(env->settings[i].typ, "psw") == 0) { char pswBuf[128]; memset(pswBuf, 0, sizeof(pswBuf)); int result = ini_gets(env->settings[i].section, env->settings[i].hlp, "", pswBuf, 128, env->file_name_setup); b64_decode(pswBuf, env->settings[i].val, 128); // int result = ini_gets(env->settings[i].section, env->settings[i].hlp, "", env->settings[i].val, 128, // env->file_name_setup); } } } void DeviceStorageIni_Init(tDeviceStorageIni *env, const TCHAR *file_name_setup, const TCHAR *file_name_counter, tFs *fs, const tSettings *Settings, int SettingsCount) { env->settings = Settings; env->settingsCount = SettingsCount; env->fs = fs; env->writeAccess = osMutexNew(NULL); env->file_name_setup = file_name_setup; env->file_name_counter = file_name_counter; // Если файл не найден, восстанавливаем данные по умолчанию FILINFO fnoInf; FRESULT frInf; frInf = f_stat(file_name_setup, &fnoInf); if (frInf) { DeviceDataNonVolatile_Setup_Init_Defaults(&env->nvm); Nvm_To_RuntimeSettings(env); DeviceStorageSetupIni_Dump(env); } else { DeviceStorageSetupIni_Load(env); Runtime_To_NvmSettings(env); } // Если файл не найден, восстанавливаем данные по умолчанию frInf = f_stat(file_name_counter, &fnoInf); if (frInf) { DeviceDataNonVolatile_Counter_Init_Defaults(&env->nvm); DeviceStorageCounterIni_Dump(env); DeviceStorageCounterIni_DumpRouting(env); DeviceStorageCounterIni_DumpDist(env); DeviceStorageCounterIni_DumpSos(env); } else { DeviceStorageCounterIni_Load(env); } //DeviceDataNonVolatile_Setup_Init_Defaults(&env->nvm); }