VarTabDumpObserver/VarTabDumpObserver.c

244 lines
7.8 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, "Calibration: ROM error")
env->health = false;
return false;
} else if (dumpStatus == STORAGE_OK) {
env->health = true;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Calibrations: Data successfully loaded from ROM")
return true;
}
LoggerInfoStatic(LOGGER, LOG_SIGN, "Calibration: Data error when loading from ROM")
return false;
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Calibration: ROM read error")
LoggerErrorStatic(LOGGER, LOG_SIGN, "Calibrations: Parallel access error")
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, "Parameters: ROM error")
env->health = false;
return false;
} else if (dumpStatus == STORAGE_OK) {
env->health = true;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Parameters: Data successfully loaded from ROM")
return true;
}
LoggerInfoStatic(LOGGER, LOG_SIGN, "Parameters: Data error while loading from ROM")
return false;
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Parameters: ROM read error.")
LoggerErrorStatic(LOGGER, LOG_SIGN, "Parameters: Concurrent access error")
return false;
}
}
bool VarsTabDumpObserverCalib_Dump(tVarsTabDumpObserver *env) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Calibrations: Attempting to write to ROM")
// 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, "Calibrations: Successfully written to ROM")
return true;
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Calibration: ROM write error")
if (result == STORAGE_ERR_DATA) {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Calibration: Checksum error")
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Calibration: ROM error")
}
return false;
}
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Calibration: ROM write error")
LoggerErrorStatic(LOGGER, LOG_SIGN, "Calibrations: Parallel access error")
return false;
}
}
bool VarsTabDumpObserverParam_Dump(tVarsTabDumpObserver *env) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Parameters. Attempting to write to ROM")
// 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, "Parameters: Successfully written to ROM")
return true;
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Parameters: Error writing to ROM")
if (result == STORAGE_ERR_DATA) {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Parameters: Checksum error")
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Parameters: ROM error")
}
return false;
}
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Parameters: Error writing to ROM")
LoggerErrorStatic(LOGGER, LOG_SIGN, "Parameters: Concurrency error")
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, "Changes in parameters detected, writing to ROM is required")
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, "There are changes, we write them to ROM")
if (osMutexAcquire(env->access, 10000) == osOK) {
VarsTabDumpObserverParam_Dump(env);
env->dumpAfter = 0;
osMutexRelease(env->access);
}
}
}