From cdc6ef6bb1397fac2a3df8cbdfa95c1a3e568215 Mon Sep 17 00:00:00 2001 From: cfif Date: Fri, 30 Jan 2026 17:14:14 +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 --- CanSpamTransmitter.c | 57 +++++++++++++++++++++++++------------------- CanSpamTransmitter.h | 3 +++ 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/CanSpamTransmitter.c b/CanSpamTransmitter.c index 38ab0ff..323cfaa 100644 --- a/CanSpamTransmitter.c +++ b/CanSpamTransmitter.c @@ -5,6 +5,7 @@ #include "CanSpamTransmitter.h" #include "CmsisRtosThreadUtils.h" #include "CanPorts.h" +#include "memory.h" void CanSpamTransmitter_Init(tCanSpamTransmitter *env, tSerialPortFrameIO *ioCanFrame) { @@ -198,89 +199,89 @@ static void CCU_Msg3(tCanSpamTransmitter *env) { _m->CCU_MSG3_CS = d0 ^ d1 ^ d2 ^ d3; } -static void CCU_Errors(tCanSpamTransmitter *env) { +static void CCU_Errors(tCanSpamTransmitter *env) { CCU_Errors_t *_m = &ccu_candb_tx.CCU_Errors; // Incar temperature sensors for front zone error status // 1 : "Error" // 0 : "No error" - _m->CCU_IncarTempErrF_Stat = 0; // Bits= 1 + _m->CCU_IncarTempErrF_Stat = env->CCU_Errors.CCU_IncarTempErrF_Stat; // Bits= 1 // Incar temperature sensors for rear zone error status // 1 : "Error" // 0 : "No error" - _m->CCU_IncarTempErrR_Stat = 0; // Bits= 1 + _m->CCU_IncarTempErrR_Stat = env->CCU_Errors.CCU_IncarTempErrR_Stat; // Bits= 1 // Duct temperature sensors for front zone error status // 1 : "Error" // 0 : "No error" - _m->CCU_DuctTempSenErrF_Stat = 0; // Bits= 1 + _m->CCU_DuctTempSenErrF_Stat = env->CCU_Errors.CCU_DuctTempSenErrF_Stat; // Bits= 1 // Duct temperature sensors for rear zone error status // 1 : "Error" // 0 : "No error" - _m->CCU_DuctTempSenErrR_Stat = 0; // Bits= 1 + _m->CCU_DuctTempSenErrR_Stat = env->CCU_Errors.CCU_DuctTempSenErrR_Stat; // Bits= 1 // Evaporator temperature sensor for front zone error status // 1 : "Error" // 0 : "No error" - _m->CCU_EvaTempSenErrF_Stat = 0; // Bits= 1 + _m->CCU_EvaTempSenErrF_Stat = env->CCU_Errors.CCU_EvaTempSenErrF_Stat; // Bits= 1 // Evaporator temperature sensor for rear zone error status // 1 : "Error" // 0 : "No error" - _m->CCU_EvaTempSenErrR_Stat = 0; // Bits= 1 + _m->CCU_EvaTempSenErrR_Stat = env->CCU_Errors.CCU_EvaTempSenErrR_Stat; // Bits= 1 // Deflectors for front zone error status // 1 : "Error" // 0 : "No error" - _m->CCU_DeflectorSwErrF_Stat = 0; // Bits= 1 + _m->CCU_DeflectorSwErrF_Stat = env->CCU_Errors.CCU_DeflectorSwErrF_Stat; // Bits= 1 // Deflectors for rear zone error status // 1 : "Error" // 0 : "No error" - _m->CCU_DeflectorSwErrR_Stat = 0; // Bits= 1 + _m->CCU_DeflectorSwErrR_Stat = env->CCU_Errors.CCU_DeflectorSwErrR_Stat; // Bits= 1 // Pressure sensors error status // 1 : "Error" // 0 : "No error" - _m->CCU_PressSenErr_Stat = 0; // Bits= 1 + _m->CCU_PressSenErr_Stat = env->CCU_Errors.CCU_PressSenErr_Stat; // Bits= 1 // Ambient temperature sensor error status // 1 : "Error" // 0 : "No error" - _m->CCU_AmbienTemptSenErr_Stat = 0; // Bits= 1 + _m->CCU_AmbienTemptSenErr_Stat = env->CCU_Errors.CCU_AmbienTemptSenErr_Stat; // Bits= 1 // Sealing valve error status // 1 : "Error" // 0 : "No error" - _m->CCU_SealingValveErr_Stat = 0; // Bits= 1 + _m->CCU_SealingValveErr_Stat = env->CCU_Errors.CCU_SealingValveErr_Stat; // Bits= 1 // ETXV error status // 1 : "Error" // 0 : "No error" - _m->CCU_ETXVerr_Stat = 0; // Bits= 1 + _m->CCU_ETXVerr_Stat = env->CCU_Errors.CCU_ETXVerr_Stat; // Bits= 1 // HVAC fan or TXV for front zone error status // 1 : "Error" // 0 : "No error" - _m->CCU_HVACfanOrTXVerrF_Stat = 0; // Bits= 1 + _m->CCU_HVACfanOrTXVerrF_Stat = env->CCU_Errors.CCU_HVACfanOrTXVerrF_Stat; // Bits= 1 // HVAC fan or TXV for rear zone error status // 1 : "Error" // 0 : "No error" - _m->CCU_HVACfanOrTXVerrR_Stat = 0; // Bits= 1 + _m->CCU_HVACfanOrTXVerrR_Stat = env->CCU_Errors.CCU_HVACfanOrTXVerrR_Stat; // Bits= 1 // Actuators for front zone error status // 1 : "Error" // 0 : "No error" - _m->CCU_ActuatorErrF_Stat = 0; // Bits= 1 + _m->CCU_ActuatorErrF_Stat = env->CCU_Errors.CCU_ActuatorErrF_Stat; // Bits= 1 // Actuators for rear zone error status // 1 : "Error" // 0 : "No error" - _m->CCU_ActuatorErrR_Stat = 0; // Bits= 1 + _m->CCU_ActuatorErrR_Stat = env->CCU_Errors.CCU_ActuatorErrR_Stat; // Bits= 1 // Ultraviolet system error status // 3 : "Component malfunction" @@ -289,12 +290,12 @@ static void CCU_Errors(tCanSpamTransmitter *env) { // 1 : "Supply chain break // 0 : "No error" - _m->CCU_UltravioletErr_Stat = 0; // Bits= 2 + _m->CCU_UltravioletErr_Stat = env->CCU_Errors.CCU_UltravioletErr_Stat; // Bits= 2 // CCU VIN record error status // 1 : "Error" // 0 : "No error" - _m->CCU_VinRecordErr_Stat = 0; // Bits= 1 + _m->CCU_VinRecordErr_Stat = env->CCU_Errors.CCU_VinRecordErr_Stat; // Bits= 1 // Air quality sensor error status // 4 : "Component malfunction" @@ -302,17 +303,17 @@ static void CCU_Errors(tCanSpamTransmitter *env) { // 2 : "Supply chain short circuit" // 1 : "Supply chain break" // 0 : "No error" - _m->CCU_AirQualSenErr_Stat = 0; // Bits= 3 + _m->CCU_AirQualSenErr_Stat = env->CCU_Errors.CCU_AirQualSenErr_Stat; // Bits= 3 // CCU communication error status // 1 : "Error" // 0 : "No error" - _m->CCU_CommErr_Stat = 0; // Bits= 1 + _m->CCU_CommErr_Stat = env->CCU_Errors.CCU_CommErr_Stat; // Bits= 1 // Two-way valve error status // 1 : "Error" // 0 : "No error" - _m->CCU_TWVerr_Stat = 0; // Bits= 1 + _m->CCU_TWVerr_Stat = env->CCU_Errors.CCU_TWVerr_Stat; // Bits= 1 // Ionization system error status // 4 : "Component malfunction" @@ -323,7 +324,7 @@ static void CCU_Errors(tCanSpamTransmitter *env) { // 1 : "Supply chain break // 0 : "No error" - _m->CCU_IonizationErr_Stat = 0; // Bits= 3 + _m->CCU_IonizationErr_Stat = env->CCU_Errors.CCU_IonizationErr_Stat; // Bits= 3 // Aromatization system error status // 4 : "Component malfunction" @@ -334,7 +335,7 @@ static void CCU_Errors(tCanSpamTransmitter *env) { // 1 : "Supply chain break // 0 : "No error" - _m->CCU_AromaErr_Stat = 0; // Bits= 3 + _m->CCU_AromaErr_Stat = env->CCU_Errors.CCU_AromaErr_Stat; // Bits= 3 } static void sendEventToCan(tCanSpamTransmitter *env) { @@ -486,10 +487,16 @@ static eTimeEventTransmit isEventTransmitter(tCanSpamTransmitter *env) { return event_CCU_none; } +void set_CCU_Errors(tCanSpamTransmitter *env, CCU_Errors_t *CCU_Errors) { + if (osMutexAcquire(env->access, 1000) == osOK) { + memcpy(&env->CCU_Errors, CCU_Errors, sizeof(CCU_Errors_t)); + osMutexRelease(env->access); + } +} static _Noreturn void CanSpamTransmitter_Thread(tCanSpamTransmitter *env) { for (;;) { - if (osMutexAcquire(env->access, 100) == osOK) { + if (osMutexAcquire(env->access, 1000) == osOK) { env->timeMs = GetSystemTick(); diff --git a/CanSpamTransmitter.h b/CanSpamTransmitter.h index d7dea66..7f14b76 100644 --- a/CanSpamTransmitter.h +++ b/CanSpamTransmitter.h @@ -46,6 +46,8 @@ typedef struct { uint32_t time_CCU_Msg3; uint32_t time_CCU_AC_Ctrl; + CCU_Errors_t CCU_Errors; + struct { osThreadId_t id; uint32_t stack[512]; @@ -59,5 +61,6 @@ void CanSpamTransmitter_Init(tCanSpamTransmitter *env, tSerialPortFrameIO *ioCan void CanSpamTransmitter_StartThread(tCanSpamTransmitter *env); +void set_CCU_Errors(tCanSpamTransmitter *env, CCU_Errors_t *CCU_Errors); #endif //HVAC_M7_CANSPAMTRANSMITTER_H