Обновление

This commit is contained in:
cfif 2025-10-29 11:17:05 +03:00
parent 476236a246
commit f2e6d6bee1
2 changed files with 121 additions and 37 deletions

View File

@ -1,5 +1,5 @@
// //
// Created by xemon on 19.12.22. // Created by cfif on 19.12.22.
// //
#include <CmsisRtosThreadUtils.h> #include <CmsisRtosThreadUtils.h>
@ -13,19 +13,27 @@
void VarsTabDumpObserver_Init( void VarsTabDumpObserver_Init(
tVarsTabDumpObserver *env, tVarsTabDumpObserver *env,
tStorageInterface *interface, tStorageInterface *storageCalibInterface,
tStorageInterface *storageParamInterface,
uint32_t delay, uint32_t delay,
void *data, void *dataCalib,
size_t size, void *dataParam,
size_t sizeCalib,
size_t sizeParam,
tVariablesTable *VarsTab, tVariablesTable *VarsTab,
uint32_t trackableGroup uint32_t trackableGroup
) { ) {
env->interface = interface; env->interfaceCalib = storageCalibInterface;
env->interfaceParam = storageParamInterface;
env->trackableVarsTab = VarsTab; env->trackableVarsTab = VarsTab;
env->trackableGroup = trackableGroup; env->trackableGroup = trackableGroup;
env->data = data; env->dataCalib = dataCalib;
env->size = size; env->sizeCalib = sizeCalib;
env->dataParam = dataParam;
env->sizeParam = sizeParam;
env->delay = delay; env->delay = delay;
env->dumpAfter = 0; env->dumpAfter = 0;
@ -37,69 +45,137 @@ void VarsTabDumpObserver_Init(
} }
bool VarsTabDumpObserver_Load(tVarsTabDumpObserver *env) { bool VarsTabDumpObserverCalib_Load(tVarsTabDumpObserver *env) {
if (osMutexAcquire(env->accessDumper, 100) == osOK) { if (osMutexAcquire(env->accessDumper, 100) == osOK) {
eStorageStatus dumpStatus = StorageLoad(env->interface, env->data, env->size); eStorageStatus dumpStatus = StorageLoad(env->interfaceCalib, env->dataCalib, env->sizeCalib);
osMutexRelease(env->accessDumper); osMutexRelease(env->accessDumper);
if (dumpStatus == STORAGE_ERR_DEVICE) { if (dumpStatus == STORAGE_ERR_DEVICE) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка ПЗУ") LoggerInfoStatic(LOGGER, LOG_SIGN, "Калибровка. Ошибка ПЗУ")
env->health = false; env->health = false;
return false; return false;
} else if (dumpStatus == STORAGE_OK) { } else if (dumpStatus == STORAGE_OK) {
env->health = true; env->health = true;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Данные успешно загружены из ПЗУ") LoggerInfoStatic(LOGGER, LOG_SIGN, "Калибровка. Данные успешно загружены из ПЗУ")
return true; return true;
} }
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка данных при загрузке из ПЗУ") LoggerInfoStatic(LOGGER, LOG_SIGN, "Калибровка. Ошибка данных при загрузке из ПЗУ")
return false; return false;
} else { } else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Ошибка чтения ПЗУ!!!") LoggerErrorStatic(LOGGER, LOG_SIGN, "Калибровка. Ошибка чтения ПЗУ!!!")
LoggerErrorStatic(LOGGER, LOG_SIGN, "Ошибка параллельного доступа") LoggerErrorStatic(LOGGER, LOG_SIGN, "Калибровка. Ошибка параллельного доступа")
return false; return false;
} }
} }
bool VarsTabDumpObserver_Dump(tVarsTabDumpObserver *env) { bool VarsTabDumpObserverParam_Load(tVarsTabDumpObserver *env) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Попытка записи в ПЗУ...")
if (osMutexAcquire(env->accessDumper, 100) == osOK) {
eStorageStatus dumpStatus = StorageLoad(env->interfaceParam, env->dataParam, env->sizeParam);
osMutexRelease(env->accessDumper);
if (dumpStatus == STORAGE_ERR_DEVICE) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Параметры. Ошибка ПЗУ")
env->health = false;
return false;
} else if (dumpStatus == STORAGE_OK) {
env->health = true;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Параметры. Данные успешно загружены из ПЗУ")
return true;
}
LoggerInfoStatic(LOGGER, LOG_SIGN, "Параметры. Ошибка данных при загрузке из ПЗУ")
return false;
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Параметры. Ошибка чтения ПЗУ!!!")
LoggerErrorStatic(LOGGER, LOG_SIGN, "Параметры. Ошибка параллельного доступа")
return false;
}
}
bool VarsTabDumpObserverCalib_Dump(tVarsTabDumpObserver *env) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Калибровка. Попытка записи в ПЗУ...")
if (env->logger) { if (env->logger) {
env->logger->logging( env->logger->logging(
env->logger->env, "Хран.Наб.", env->logger->env, "Калибровка. Хран.Наб.",
sizeof("Хран.Наб.") - 1, sizeof("Калибровка. Хран.Наб.") - 1,
LOGLEVEL_INFO, LOGLEVEL_INFO,
"Запись в ПЗУ...", "Калибровка. Запись в ПЗУ...",
sizeof("Запись в ПЗУ...") - 1, true sizeof("Калибровка. Запись в ПЗУ...") - 1, true
); );
} }
if (osMutexAcquire(env->accessDumper, 100) == osOK) { if (osMutexAcquire(env->accessDumper, 100) == osOK) {
eStorageStatus result = StorageDump(env->interface, env->data, env->size); eStorageStatus result = StorageDump(env->interfaceCalib, env->dataCalib, env->sizeCalib);
osMutexRelease(env->accessDumper); osMutexRelease(env->accessDumper);
env->health = (result == STORAGE_OK); env->health = (result == STORAGE_OK);
if (env->health) { if (env->health) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Успешно записано в ПЗУ") LoggerInfoStatic(LOGGER, LOG_SIGN, "Калибровка. Успешно записано в ПЗУ")
return true; return true;
} else { } else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Ошибка записи в ПЗУ!!!") LoggerErrorStatic(LOGGER, LOG_SIGN, "Калибровка. Ошибка записи в ПЗУ!!!")
if (result == STORAGE_ERR_DATA) { if (result == STORAGE_ERR_DATA) {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Ошибка контрольной суммы") LoggerErrorStatic(LOGGER, LOG_SIGN, "Калибровка. Ошибка контрольной суммы")
} else { } else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Ошибка ПЗУ") LoggerErrorStatic(LOGGER, LOG_SIGN, "Калибровка. Ошибка ПЗУ")
} }
return false; return false;
} }
} else { } else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Ошибка записи в ПЗУ!!!") LoggerErrorStatic(LOGGER, LOG_SIGN, "Калибровка. Ошибка записи в ПЗУ!!!")
LoggerErrorStatic(LOGGER, LOG_SIGN, "Ошибка параллельного доступа") LoggerErrorStatic(LOGGER, LOG_SIGN, "Калибровка. Ошибка параллельного доступа")
return false;
}
}
bool VarsTabDumpObserverParam_Dump(tVarsTabDumpObserver *env) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Парамеры. Попытка записи в ПЗУ...")
if (env->logger) {
env->logger->logging(
env->logger->env, "Парамеры. Хран.Наб.",
sizeof("Парамеры. Хран.Наб.") - 1,
LOGLEVEL_INFO,
"Парамеры. Запись в ПЗУ...",
sizeof("Парамеры. Запись в ПЗУ...") - 1, true
);
}
if (osMutexAcquire(env->accessDumper, 100) == osOK) {
eStorageStatus result = StorageDump(env->interfaceParam, env->dataParam, env->sizeParam);
osMutexRelease(env->accessDumper);
env->health = (result == STORAGE_OK);
if (env->health) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Парамеры. Успешно записано в ПЗУ")
return true;
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Парамеры. Ошибка записи в ПЗУ!!!")
if (result == STORAGE_ERR_DATA) {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Парамеры. Ошибка контрольной суммы")
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Парамеры. Ошибка ПЗУ")
}
return false;
}
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Парамеры. Ошибка записи в ПЗУ!!!")
LoggerErrorStatic(LOGGER, LOG_SIGN, "Парамеры. Ошибка параллельного доступа")
return false; return false;
} }
} }
@ -125,7 +201,7 @@ void DeviceStorageProcessing(tVarsTabDumpObserver *env) {
if (env->dumpAfter && VarsTabDumpObserver_IsNowDumpRequired(env)) { if (env->dumpAfter && VarsTabDumpObserver_IsNowDumpRequired(env)) {
if (osMutexAcquire(env->access, 1) == osOK) { if (osMutexAcquire(env->access, 1) == osOK) {
if (VarsTabDumpObserver_IsNowDumpRequired(env)) { if (VarsTabDumpObserver_IsNowDumpRequired(env)) {
VarsTabDumpObserver_Dump(env); VarsTabDumpObserverParam_Dump(env);
env->dumpAfter = 0; env->dumpAfter = 0;
} }
osMutexRelease(env->access); osMutexRelease(env->access);
@ -153,7 +229,7 @@ void VarsTabDumpObserver_Flush(tVarsTabDumpObserver *env) {
if (env->dumpAfter) { if (env->dumpAfter) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Есть изменения, записываем в ПЗУ") LoggerInfoStatic(LOGGER, LOG_SIGN, "Есть изменения, записываем в ПЗУ")
if (osMutexAcquire(env->access, 10000) == osOK) { if (osMutexAcquire(env->access, 10000) == osOK) {
VarsTabDumpObserver_Dump(env); VarsTabDumpObserverParam_Dump(env);
env->dumpAfter = 0; env->dumpAfter = 0;
osMutexRelease(env->access); osMutexRelease(env->access);
} }

View File

@ -11,11 +11,14 @@
typedef struct { typedef struct {
tLoggerInterface *logger; tLoggerInterface *logger;
tStorageInterface *interface; tStorageInterface *interfaceCalib;
tStorageInterface *interfaceParam;
tVariablesTable *trackableVarsTab; tVariablesTable *trackableVarsTab;
uint32_t trackableGroup; uint32_t trackableGroup;
void *data; void *dataCalib;
size_t size; void *dataParam;
size_t sizeCalib;
size_t sizeParam;
bool health; bool health;
@ -34,17 +37,22 @@ typedef struct {
void VarsTabDumpObserver_Init( void VarsTabDumpObserver_Init(
tVarsTabDumpObserver *env, tVarsTabDumpObserver *env,
tStorageInterface *interface, tStorageInterface *storageCalibInterface,
tStorageInterface *storageParamInterface,
uint32_t delay, uint32_t delay,
void *data, void *dataCalib,
size_t size, void *dataParam,
size_t sizeCalib,
size_t sizeParam,
tVariablesTable *VarsTab, tVariablesTable *VarsTab,
uint32_t trackableGroup uint32_t trackableGroup
); );
bool VarsTabDumpObserver_Load(tVarsTabDumpObserver *env); bool VarsTabDumpObserverCalib_Load(tVarsTabDumpObserver *env);
bool VarsTabDumpObserverParam_Load(tVarsTabDumpObserver *env);
bool VarsTabDumpObserver_Dump(tVarsTabDumpObserver *env); bool VarsTabDumpObserverCalib_Dump(tVarsTabDumpObserver *env);
bool VarsTabDumpObserverParam_Dump(tVarsTabDumpObserver *env);
void VarsTabDumpObserver_RequireDump(tVarsTabDumpObserver *env); void VarsTabDumpObserver_RequireDump(tVarsTabDumpObserver *env);