GONEC_ARTERY_DeviceStorage/Src/DeviceStorageIni.c

297 lines
11 KiB
C

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