VarTabDumpObserver/VarTabDumpObserver.c

244 lines
8.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Created by cfif on 19.12.22.
//
#include <CmsisRtosThreadUtils.h>
#include "VarsTabDumpObserver.h"
#include "SystemDelayInterface.h"
#include "string.h"
#define LOGGER env->logger
#define LOG_SIGN "Хран.Наб."
void VarsTabDumpObserver_Init(
tVarsTabDumpObserver *env,
tStorageInterface *storageCalibInterface,
tStorageInterface *storageParamInterface,
uint32_t delay,
void *dataCalib,
void *dataParam,
size_t sizeCalib,
size_t sizeParam,
uint8_t *trackableVarsTab,
uint32_t trackableGroup,
tLoggerInterface *logger
) {
env->logger = logger;
env->interfaceCalib = storageCalibInterface;
env->interfaceParam = storageParamInterface;
env->trackableVarsTab = trackableVarsTab;
env->trackableGroup = trackableGroup;
env->dataCalib = dataCalib;
env->sizeCalib = sizeCalib;
env->dataParam = dataParam;
env->sizeParam = sizeParam;
env->delay = delay;
env->dumpAfter = 0;
env->access = osMutexNew(NULL);
env->accessDumper = osMutexNew(NULL);
InitThreadAtrStatic(&env->thread.attr, "Data", env->thread.controlBlock, env->thread.stack, osPriorityNormal);
env->thread.id = 0;
}
bool VarsTabDumpObserverCalib_Load(tVarsTabDumpObserver *env) {
if (osMutexAcquire(env->accessDumper, 100) == osOK) {
eStorageStatus dumpStatus = StorageLoad(env->interfaceCalib, env->dataCalib, env->sizeCalib);
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 VarsTabDumpObserverParam_Load(tVarsTabDumpObserver *env) {
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) {
env->logger->logging(
env->logger->env, "Калибровки. Хран.Наб.",
sizeof("Калибровки. Хран.Наб.") - 1,
LOGLEVEL_INFO,
"Калибровки. Запись в ПЗУ...",
sizeof("Калибровки. Запись в ПЗУ...") - 1, true
);
}
if (osMutexAcquire(env->accessDumper, 100) == osOK) {
eStorageStatus result = StorageDump(env->interfaceCalib, env->dataCalib, env->sizeCalib);
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;
}
}
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;
}
}
static bool VarsTabDumpObserver_IsNowDumpRequired(tVarsTabDumpObserver *env) {
return env->dumpAfter < SystemGetMs();
}
void VarsTabDumpObserver_RequireDump(tVarsTabDumpObserver *env) {
if (osMutexAcquire(env->access, 1) == osOK) {
env->dumpAfter = SystemGetMs() + env->delay;
osMutexRelease(env->access);
}
}
void DeviceStorageProcessing(tVarsTabDumpObserver *env) {
if (env->trackableVarsTab) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Обнаружены изменения в параметрах, необходима запись в ПЗУ")
VarsTabDumpObserver_RequireDump(env);
}
if (env->dumpAfter && VarsTabDumpObserver_IsNowDumpRequired(env)) {
if (osMutexAcquire(env->access, 1) == osOK) {
if (VarsTabDumpObserver_IsNowDumpRequired(env)) {
VarsTabDumpObserverParam_Dump(env);
env->dumpAfter = 0;
}
osMutexRelease(env->access);
}
}
}
static _Noreturn void VarsTabDumpObserver_Thread(tVarsTabDumpObserver *env) {
for (;;) {
DeviceStorageProcessing(env);
SystemDelayMs(100);
}
}
void VarsTabDumpObserver_StartThread(tVarsTabDumpObserver *env) {
ThreadBlock_Start(env->thread, env, VarsTabDumpObserver_Thread);
}
void VarsTabDumpObserver_StopThread(tVarsTabDumpObserver *env) {
ThreadBlock_Stop(env->thread);
}
void VarsTabDumpObserver_Flush(tVarsTabDumpObserver *env) {
if (env->dumpAfter) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Есть изменения, записываем в ПЗУ")
if (osMutexAcquire(env->access, 10000) == osOK) {
VarsTabDumpObserverParam_Dump(env);
env->dumpAfter = 0;
osMutexRelease(env->access);
}
}
}