From 5a831f8e292588fd87584a39ad7f32ab46932bb6 Mon Sep 17 00:00:00 2001 From: cfif Date: Fri, 24 Jan 2025 13:22:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BD=D0=BE=D0=B2=D1=83=D1=8E=20=D0=BE=D1=80?= =?UTF-8?q?=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8E=20GONEC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inc/DeviceStorageIni.h | 45 +++++++ Src/DeviceStorageIni.c | 297 +++++++++++++++++++++++++++++++++++++++++ modular.json | 23 ++++ 3 files changed, 365 insertions(+) create mode 100644 Inc/DeviceStorageIni.h create mode 100644 Src/DeviceStorageIni.c create mode 100644 modular.json diff --git a/Inc/DeviceStorageIni.h b/Inc/DeviceStorageIni.h new file mode 100644 index 0000000..6e6ea31 --- /dev/null +++ b/Inc/DeviceStorageIni.h @@ -0,0 +1,45 @@ +// +// Created by cfif on 18.04.23. +// + +#ifndef GONEC_GSM_DEVICESTORAGEINI_H +#define GONEC_GSM_DEVICESTORAGEINI_H + +#include "DeviceDataNonVolatile.h" +#include "DeviceDataRuntime.h" +//#include "JSONSettings.h" +#include "minIni.h" +#include "fs_interface.h" +#include "Settings.h" + +typedef struct { + tLoggerInterface *logger; + tDeviceDataRuntime runtime; + tDeviceDataNonVolatile nvm; + + int settingsCount; + const tSettings *settings; + osMutexId_t writeAccess; + tFs *fs; + const TCHAR *file_name_setup; + const TCHAR *file_name_counter; + +} tDeviceStorageIni; + +void DeviceStorageIni_Init(tDeviceStorageIni *env, const TCHAR *file_setup, const TCHAR *file_counter, tFs *fs, const tSettings *Settings, int SettingsCount); + +void DeviceStorageSetupIni_Dump(tDeviceStorageIni *env); +void DeviceStorageSetupIni_Load(tDeviceStorageIni *env); + +void DeviceStorageCounterIni_Dump(tDeviceStorageIni *env); +void DeviceStorageCounterIni_DumpRouting(tDeviceStorageIni *env); +void DeviceStorageCounterIni_DumpDist(tDeviceStorageIni *env); +void DeviceStorageCounterIni_DumpSos(tDeviceStorageIni *env); +void DeviceStorageCounterIni_Load(tDeviceStorageIni *env); + +// Сохранение настроек во временные +void Nvm_To_RuntimeSettings(tDeviceStorageIni *env); +// Загрузка настроек из временных +void Runtime_To_NvmSettings(tDeviceStorageIni *env); + +#endif //GONEC_GSM_DEVICESTORAGEINI_H diff --git a/Src/DeviceStorageIni.c b/Src/DeviceStorageIni.c new file mode 100644 index 0000000..407ff5b --- /dev/null +++ b/Src/DeviceStorageIni.c @@ -0,0 +1,297 @@ +// +// 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); + +} \ No newline at end of file diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..d556d08 --- /dev/null +++ b/modular.json @@ -0,0 +1,23 @@ +{ + "dep": [ + { + "type": "git", + "provider": "GONEC", + "repo": "GONEC_ARTERY_DataNonVolatile" + }, + { + "type": "git", + "provider": "GONEC", + "repo": "GONEC_ARTERY_DataRuntime" + } + ], + "cmake": { + "inc_dirs": [ + "Inc/" + ], + "srcs": [ + "Src/**.c", + "Src_InitDefaults/**.c" + ] + } +} \ No newline at end of file