From 736db72a9717067d9aad442acdbee4b06a8c2ebd Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 20 Jan 2026 17:40:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LinActuatorWork.c | 92 ++++++++++++++++++++++++++++++++++++ LinActuatorWork.h | 12 +++++ MainModesArbiter.c | 83 -------------------------------- MainModesArbiter.h | 6 +++ MainModesArbiter_InitStage.c | 6 +++ 5 files changed, 116 insertions(+), 83 deletions(-) create mode 100644 LinActuatorWork.c create mode 100644 LinActuatorWork.h diff --git a/LinActuatorWork.c b/LinActuatorWork.c new file mode 100644 index 0000000..dddc57f --- /dev/null +++ b/LinActuatorWork.c @@ -0,0 +1,92 @@ +// +// Created by cfif on 20.01.2026. +// +#include "LinActuatorWork.h" + +void LinActuatorWork(tMma *env) { + + if (osMutexAcquire(env->linTaskActuator0.access, 5000) == osOK) { + + // Если актуатор не занят + if (env->linTaskActuator0.busy == false) { + + for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { + + env->linTaskActuator0.linCommandActuator[i].POS = env->rtY_local.Out1.POS[i]; + env->linTaskActuator0.linCommandActuator[i].BUS_ADR = env->rtY_local.Out1.BUS_ADR[i]; + env->linTaskActuator0.linCommandActuator[i].MODE = env->rtY_local.Out1.MODE[i]; + + // Если команда выполнена + if (env->linTaskActuator0.linCommandActuator[i].COM == LIN_ACT_CFR_SUCCESSFUL) { +#if (LOG_LIN_ACTUATOR == 1) + LoggerInfoStatic(LOGGER, LOG_TASK_ARB, "SUCCESSFUL COMMAND") +#endif + // Установка входной команды в LIN_ACT_CFR_NONE + env->rtY_local.Out1.COM[i] = LIN_ACT_CFR_NONE; + } + + env->linTaskActuator0.linCommandActuator[i].COM = env->rtY_local.Out1.COM[i]; + env->linTaskActuator0.linCommandActuator[i].Stall_SET = env->rtY_local.Out1.Stall_SET[i]; + env->linTaskActuator0.linCommandActuator[i].Lnoise_SET = env->rtY_local.Out1.Lnoise_SET[i]; + env->linTaskActuator0.linCommandActuator[i].Autos_SET = env->rtY_local.Out1.Autos_SET[i]; + env->linTaskActuator0.linCommandActuator[i].Speed_SET = env->rtY_local.Out1.Speed_SET[i]; + env->linTaskActuator0.linCommandActuator[i].Coils_Stop_SET = env->rtY_local.Out1.Coils_Stop_SET[i]; + + env->rtU_local.in_CPOS_ALL_Ch0[i] = (int16_t) env->linTaskActuator0.linStateActuator[i].CPOS_ALL; + env->rtU_local.in_Act_Emrf_Slave_Ch0[i] = (int8_t) env->linTaskActuator0.linStateActuator[i].Emrf_Slave; + env->rtU_local.in_Mode_Slave_Ch0[i] = (int8_t) env->linTaskActuator0.linStateActuator[i].Mode_Slave; + env->rtU_local.in_Act_Err1_Supply_Ch0[i] = (int8_t) env->linTaskActuator0.linStateActuator[i].Error1_Supply_Slave; + env->rtU_local.in_Act_Err2_Communication_Ch0[i] = (int8_t) env->linTaskActuator0.linStateActuator[i].Error2_Communication_Slave; + env->rtU_local.in_Act_Err3_Temperature_Ch0[i] = (int8_t) env->linTaskActuator0.linStateActuator[i].Error3_Temperature_Slave; + env->rtU_local.in_Act_Err4_Permanent_Electrical_Ch0[i] = (int8_t) env->linTaskActuator0.linStateActuator[i].Error4_Permanent_Electrical_Slave; + env->rtU_local.in_Act_Stall_Slave_Ch0[i] = env->linTaskActuator0.linStateActuator[i].Stall_Slave; + env->rtU_local.in_Act_Reset_Ch0[i] = env->linTaskActuator0.linStateActuator[i].Reset_Slave; + } + + env->isActuatorWorkBusy = setBusy(&env->linTaskActuator0); + + env->rtU_local.in_Error_Connect_Ch0 = env->linTaskActuator0.error_connect; + env->rtU_local.in_Busy_Ch0 = env->linTaskActuator0.busy; + } + + osMutexRelease(env->linTaskActuator0.access); + } + + + if (osMutexAcquire(env->ModelTask.access, 5000) == osOK) { + + // Если принята команда + if (env->ModelTask.triggerCommand == true) { +#if (LOG_LIN_ACTUATOR == 1) + LoggerInfoStatic(LOGGER, LOG_TASK_ARB, "DETECT COMMAND") +#endif + // + env->rtU_local.in_Busy_Ch0 = 1; + } + + // Если прията команда и актуатор не занят + if ((env->ModelTask.triggerCommand == true) && (env->isActuatorWorkBusy == false)) { + + env->ModelTask.triggerCommand = false; + env->isActuatorWorkBusy = true; + + // Сброс STALL в состоянии актуатор и локальном состоянии + resetStall(&env->linTaskActuator0, (uint8_t *) env->rtU_local.in_Act_Stall_Slave_Ch0); + + // Копирование команд + for (uint8_t i = 0; i < 9; ++i) { + rtY.Out1.COM[i] = env->ModelTask.numCommand[i]; + } + + // ВЫХОД МОДЕЛИ (АКТУАТОР) + memcpy(&env->rtY_local.Out1, &rtY.Out1, sizeof(rtY.Out1)); + } + + // ВХОДЫ МОДЕЛИ + memcpy(&rtU, &env->rtU_local, sizeof(ExtU)); + + osMutexRelease(env->ModelTask.access); + } + + +} \ No newline at end of file diff --git a/LinActuatorWork.h b/LinActuatorWork.h new file mode 100644 index 0000000..fc1f4b9 --- /dev/null +++ b/LinActuatorWork.h @@ -0,0 +1,12 @@ +// +// Created by cfif on 20.01.2026. +// + +#ifndef HVAC_M7_LINACTUATORWORK_H +#define HVAC_M7_LINACTUATORWORK_H + +#include "MainModesArbiter_Private.h" + +void LinActuatorWork(tMma *env); + +#endif //HVAC_M7_LINACTUATORWORK_H diff --git a/MainModesArbiter.c b/MainModesArbiter.c index 01adb9e..a07ecc1 100644 --- a/MainModesArbiter.c +++ b/MainModesArbiter.c @@ -61,7 +61,6 @@ static _Noreturn void Mma_Thread(tMma *env) { ModelTask_StartThread(&env->ModelTask); - bool isActuatorWorkBusy = false; /* for (;;) { @@ -88,88 +87,6 @@ static _Noreturn void Mma_Thread(tMma *env) { pwm = env->pwms->pwmCaptureIO.getPwm(env->pwms->pwmCaptureIO.env); //LoggerFormatInfo(LOGGER, LOG_TASK_ARB, "PWM = %d", pwm) - if (osMutexAcquire(env->linTaskActuator0.access, 5000) == osOK) { - - // Если актуатор не занят - if (env->linTaskActuator0.busy == false) { - - for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { - - env->linTaskActuator0.linCommandActuator[i].POS = env->rtY_local.Out1.POS[i]; - env->linTaskActuator0.linCommandActuator[i].BUS_ADR = env->rtY_local.Out1.BUS_ADR[i]; - env->linTaskActuator0.linCommandActuator[i].MODE = env->rtY_local.Out1.MODE[i]; - - // Если команда выполнена - if (env->linTaskActuator0.linCommandActuator[i].COM == LIN_ACT_CFR_SUCCESSFUL) { -#if (LOG_LIN_ACTUATOR == 1) - LoggerInfoStatic(LOGGER, LOG_TASK_ARB, "SUCCESSFUL COMMAND") -#endif - // Установка входной команды в LIN_ACT_CFR_NONE - env->rtY_local.Out1.COM[i] = LIN_ACT_CFR_NONE; - } - - env->linTaskActuator0.linCommandActuator[i].COM = env->rtY_local.Out1.COM[i]; - env->linTaskActuator0.linCommandActuator[i].Stall_SET = env->rtY_local.Out1.Stall_SET[i]; - env->linTaskActuator0.linCommandActuator[i].Lnoise_SET = env->rtY_local.Out1.Lnoise_SET[i]; - env->linTaskActuator0.linCommandActuator[i].Autos_SET = env->rtY_local.Out1.Autos_SET[i]; - env->linTaskActuator0.linCommandActuator[i].Speed_SET = env->rtY_local.Out1.Speed_SET[i]; - env->linTaskActuator0.linCommandActuator[i].Coils_Stop_SET = env->rtY_local.Out1.Coils_Stop_SET[i]; - - env->rtU_local.in_CPOS_ALL_Ch0[i] = (int16_t) env->linTaskActuator0.linStateActuator[i].CPOS_ALL; - env->rtU_local.in_Act_Emrf_Slave_Ch0[i] = (int8_t) env->linTaskActuator0.linStateActuator[i].Emrf_Slave; - env->rtU_local.in_Mode_Slave_Ch0[i] = (int8_t) env->linTaskActuator0.linStateActuator[i].Mode_Slave; - env->rtU_local.in_Act_Err1_Supply_Ch0[i] = (int8_t) env->linTaskActuator0.linStateActuator[i].Error1_Supply_Slave; - env->rtU_local.in_Act_Err2_Communication_Ch0[i] = (int8_t) env->linTaskActuator0.linStateActuator[i].Error2_Communication_Slave; - env->rtU_local.in_Act_Err3_Temperature_Ch0[i] = (int8_t) env->linTaskActuator0.linStateActuator[i].Error3_Temperature_Slave; - env->rtU_local.in_Act_Err4_Permanent_Electrical_Ch0[i] = (int8_t) env->linTaskActuator0.linStateActuator[i].Error4_Permanent_Electrical_Slave; - env->rtU_local.in_Act_Stall_Slave_Ch0[i] = env->linTaskActuator0.linStateActuator[i].Stall_Slave; - env->rtU_local.in_Act_Reset_Ch0[i] = env->linTaskActuator0.linStateActuator[i].Reset_Slave; - } - - isActuatorWorkBusy = setBusy(&env->linTaskActuator0); - - env->rtU_local.in_Error_Connect_Ch0 = env->linTaskActuator0.error_connect; - env->rtU_local.in_Busy_Ch0 = env->linTaskActuator0.busy; - } - - osMutexRelease(env->linTaskActuator0.access); - } - - - if (osMutexAcquire(env->ModelTask.access, 5000) == osOK) { - - // Если принята команда - if (env->ModelTask.triggerCommand == true) { -#if (LOG_LIN_ACTUATOR == 1) - LoggerInfoStatic(LOGGER, LOG_TASK_ARB, "DETECT COMMAND") -#endif - // - env->rtU_local.in_Busy_Ch0 = 1; - } - - // Если прията команда и актуатор не занят - if ((env->ModelTask.triggerCommand == true) && (isActuatorWorkBusy == false)) { - - env->ModelTask.triggerCommand = false; - isActuatorWorkBusy = true; - - // Сброс STALL в состоянии актуатор и локальном состоянии - resetStall(&env->linTaskActuator0, (uint8_t *) env->rtU_local.in_Act_Stall_Slave_Ch0); - - // Копирование команд - for (uint8_t i = 0; i < 9; ++i) { - rtY.Out1.COM[i] = env->ModelTask.numCommand[i]; - } - - // ВЫХОД МОДЕЛИ (АКТУАТОР) - memcpy(&env->rtY_local.Out1, &rtY.Out1, sizeof(rtY.Out1)); - } - - // ВХОДЫ МОДЕЛИ - memcpy(&rtU, &env->rtU_local, sizeof(ExtU)); - - osMutexRelease(env->ModelTask.access); - } diff --git a/MainModesArbiter.h b/MainModesArbiter.h index 2e45cb2..42f1f8b 100644 --- a/MainModesArbiter.h +++ b/MainModesArbiter.h @@ -27,6 +27,7 @@ #include "standby.h" #include "Model_Task.h" #include "Model_actuator.h" +#include "CanUds.h" typedef struct { @@ -39,6 +40,8 @@ typedef struct { tStorageOnFlash *flash; tPwms *pwms; + tCanUds canUds; + tRtcs *rtcs; tAdcs *adcs; @@ -73,6 +76,9 @@ typedef struct { ExtU rtU_local; ExtY rtY_local; + + bool isActuatorWorkBusy; + } tMma; void Mma_Init( diff --git a/MainModesArbiter_InitStage.c b/MainModesArbiter_InitStage.c index 3cacc5f..5f9040a 100644 --- a/MainModesArbiter_InitStage.c +++ b/MainModesArbiter_InitStage.c @@ -66,6 +66,12 @@ static void Mma_InitSubSystems(tMma *env) { CanXcpProcessing_Listener_Start(&env->CanSerialPortFrameXCP); + CanUds_Init( + &env->canUds, + &env->canPorts->Can0_IO, + &env->slog.logger); + + CanSerialPortCanUds_Start(&env->canUds); CanSpamReceiver_Init(&env->canSpamReceiver, &env->canPorts->Can0_IO); CanSpamReceiver_StartThread(&env->canSpamReceiver);