// // Created by cfif on 19.12.22. // #include #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); } } }