// // Created by cfif on 19.12.2025. // #include "Model_Task.h" #include #include #include "HVAC_model.h" #include "memory.h" #define LOG_SIGN "Model" #define LOGGER env->logger void ModelTask_Init( tModelTask *env, tLinTaskActuator *linTaskActuator1, tLinTaskActuator *linTaskActuator2, tLinTaskActuator *linTaskActuator3, tLoggerInterface *logger ) { HVAC_model_initialize(); env->linTaskActuator1 = linTaskActuator1; env->linTaskActuator2 = linTaskActuator2; env->linTaskActuator3 = linTaskActuator3; env->access = osMutexNew(NULL); env->logger = logger; InitThreadAtrStatic(&env->thread.attr, "ModelTask", env->thread.controlBlock, env->thread.stack, osPriorityNormal); env->thread.id = 0; } static bool setActuatorBusy(tModelTask *env) { for (uint8_t i = 0; i < env->linTaskActuator1->LIN_ISSR_ALL; ++i) { if (Actuator_Ch0_Command_Model.COM[i] != 0) { env->triggerCommand1 = true; memcpy(&env->triggerActuatorCmdBus_1, &Actuator_Ch0_Command_Model, sizeof(ActuatorCmdBus)); rtDW.Actuator_Ch0_Status_Model.Busy = 1; return true; } } for (uint8_t i = 0; i < env->linTaskActuator2->LIN_ISSR_ALL; ++i) { if (Actuator_Ch1_Command_Model.COM[i] != 0) { env->triggerCommand2 = true; memcpy(&env->triggerActuatorCmdBus_2, &Actuator_Ch1_Command_Model, sizeof(ActuatorCmdBus)); rtDW.Actuator_Ch1_Status_Model.Busy = 1; return true; } } for (uint8_t i = 0; i < env->linTaskActuator3->LIN_ISSR_ALL; ++i) { if (Actuator_Ch2_Command_Model.COM[i] != 0) { env->triggerCommand3 = true; memcpy(&env->triggerActuatorCmdBus_3, &Actuator_Ch2_Command_Model, sizeof(ActuatorCmdBus)); rtDW.Actuator_Ch2_Status_Model.Busy = 1; return true; } } return false; } static _Noreturn void ModelTask_Thread(tModelTask *env) { for (;;) { if (osMutexAcquire(env->access, 1000) == osOK) { HVAC_model_step(); setActuatorBusy(env); env->isUpdate = true; osMutexRelease(env->access); } SystemDelayMs(1000); } } void ModelTask_StartThread(tModelTask *env) { if (!env->thread.id) { env->thread.id = osThreadNew((osThreadFunc_t) (ModelTask_Thread), (void *) (env), &env->thread.attr); } else { osThreadResume(env->thread.id); } } void ModelTask_StopThread(tModelTask *env) { if (env->thread.id) { osThreadSuspend(env->thread.id); } }