diff --git a/CanSpamDebugReceiver.c b/CanSpamDebugReceiver.c new file mode 100644 index 0000000..28c7f81 --- /dev/null +++ b/CanSpamDebugReceiver.c @@ -0,0 +1,76 @@ +// +// Created by cfif on 05.04.2024. +// +#include +#include "CanSpamDebugReceiver.h" +#include "CmsisRtosThreadUtils.h" +#include "CanPorts.h" +#include "string.h" +#include "HVAC_model.h" + +#define LOG_SIGN "CAN_DEBUG_RECEIVED" +#define LOGGER env->logger + +void CanSpamDebugReceiver_Init(tCanSpamDebugReceiver *env, + tSerialPortFrameIO *ioCanFrame, + tLoggerInterface *logger) { + + env->ioCanFrame = ioCanFrame; + env->logger = logger; + env->access = osMutexNew(NULL); + + InitThreadAtrStatic(&env->thread.attr, "CanSpamDebugRec", env->thread.controlBlock, env->thread.stack, + osPriorityNormal); +} + +static void ListenCanSpamDebugReceiver(tCanSpamDebugReceiver *env) { + + uint16_t recv = env->ioCanFrame->receive(env->ioCanFrame->env, PROTOCOL_CAN_RAW, (uint8_t *) &env->canFrame, 1, + 1000); + + if (recv == 0) + return; + + if (osMutexAcquire(env->access, 5000) == osOK) { + + uint32_t id = env->canFrame.standard_id; + + if (env->canFrame.id_type == FLEXCAN_ID_EXT) { + id = env->canFrame.extended_id; + } + + uint32_t result = ccu_candb_dbg_Receive(&ccu_candb_dbg_rx, env->canFrame.data, id, env->canFrame.dlc); + + osMutexRelease(env->access); + } else { + LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error ListenCanSpamDebugReceiver"); + } + +} + +uint8_t get_CanSpamDebugReceiverMultiIndex(tCanSpamDebugReceiver *env) { + uint8_t index = 0; + + if (osMutexAcquire(env->access, 5000) == osOK) { + + index = ccu_candb_dbg_rx.dbg_Cmd_Act_Information.Cmd_Target_Act_Index; + + osMutexRelease(env->access); + } else { + LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error get_CanSpamDebugReceiver"); + } + + return index; +} + +static _Noreturn void CanSpamDebugReceiver_Thread(tCanSpamDebugReceiver *env) { + for (;;) { + ListenCanSpamDebugReceiver(env); + } +} + +void CanSpamDebugReceiver_StartThread(tCanSpamDebugReceiver *env) { + if (!env->thread.id) { + env->thread.id = osThreadNew((osThreadFunc_t) (CanSpamDebugReceiver_Thread), (void *) (env), &env->thread.attr); + } +} \ No newline at end of file diff --git a/CanSpamDebugReceiver.h b/CanSpamDebugReceiver.h new file mode 100644 index 0000000..d00cb53 --- /dev/null +++ b/CanSpamDebugReceiver.h @@ -0,0 +1,37 @@ +// +// Created by cfif on 05.04.2024. +// + +#ifndef HVAC_CAN_SPAM_DEBUG_RECEIVER_H +#define HVAC_CAN_SPAM_DEBUG_RECEIVER_H + +#include +#include "CanSerialPortFrame.h" +#include "ccu_candb_dbg-binutil.h" +#include "LoggerInterface.h" + + +typedef struct { + + tSerialPortFrameIO *ioCanFrame; + osMutexId_t access; + can_rx_message_type canFrame; + + tLoggerInterface *logger; + + struct { + osThreadId_t id; + uint32_t stack[384]; + StaticTask_t controlBlock; + osThreadAttr_t attr; + } thread; + +} tCanSpamDebugReceiver; + +void CanSpamDebugReceiver_Init(tCanSpamDebugReceiver *env, tSerialPortFrameIO *ioCanFrame, tLoggerInterface *logger); + +void CanSpamDebugReceiver_StartThread(tCanSpamDebugReceiver *env); + +uint8_t get_CanSpamDebugReceiverMultiIndex(tCanSpamDebugReceiver *env); + +#endif //HVAC_CAN_SPAM_DEBUG_RECEIVER_H diff --git a/CanSpamDebugTransmitter.c b/CanSpamDebugTransmitter.c index 567474a..342bed5 100644 --- a/CanSpamDebugTransmitter.c +++ b/CanSpamDebugTransmitter.c @@ -6,16 +6,19 @@ #include "CmsisRtosThreadUtils.h" #include "CanPorts.h" #include "memory.h" +#include "HVAC_model.h" #define LOG_SIGN "CAN_DEBUG_TRANSMITTER" #define LOGGER env->logger void CanSpamDebugTransmitter_Init(tCanSpamDebugTransmitter *env, tSerialPortFrameIO *ioCanFrame, + tCanSpamDebugReceiver *canSpamDebugReceiver, tLoggerInterface *logger) { env->ioCanFrame = ioCanFrame; env->logger = logger; + env->canSpamDebugReceiver = canSpamDebugReceiver; env->access = osMutexNew(NULL); InitThreadAtrStatic(&env->thread.attr, "CanSpamDebugTrans", env->thread.controlBlock, env->thread.stack, @@ -42,7 +45,8 @@ static eTimeEventDbgTransmit isEventTransmitter(tCanSpamDebugTransmitter *env) { if (env->time_dbg_Act0_CYC < env->timeMs) { env->time_dbg_Act0_CYC = env->timeMs + dbg_Act0_CYC; - env->can_id = Pack_dbg_Act0_candb_dbg(&ccu_candb_dbg_tx.dbg_Act0, env->canFrame.data, &env->canFrame.dlc, &env->ide); + env->can_id = Pack_dbg_Act0_candb_dbg(&ccu_candb_dbg_tx.dbg_Act0, env->canFrame.data, &env->canFrame.dlc, + &env->ide); return event_dbg_Act0_CYC; } @@ -52,7 +56,8 @@ static eTimeEventDbgTransmit isEventTransmitter(tCanSpamDebugTransmitter *env) { if (env->time_dbg_Act1_CYC < env->timeMs) { env->time_dbg_Act1_CYC = env->timeMs + dbg_Act1_CYC; - env->can_id = Pack_dbg_Act1_candb_dbg(&ccu_candb_dbg_tx.dbg_Act1, env->canFrame.data, &env->canFrame.dlc, &env->ide); + env->can_id = Pack_dbg_Act1_candb_dbg(&ccu_candb_dbg_tx.dbg_Act1, env->canFrame.data, &env->canFrame.dlc, + &env->ide); return event_dbg_Act1_CYC; } @@ -62,7 +67,8 @@ static eTimeEventDbgTransmit isEventTransmitter(tCanSpamDebugTransmitter *env) { if (env->time_dbg_Act2_CYC < env->timeMs) { env->time_dbg_Act2_CYC = env->timeMs + dbg_Act2_CYC; - env->can_id = Pack_dbg_Act2_candb_dbg(&ccu_candb_dbg_tx.dbg_Act2, env->canFrame.data, &env->canFrame.dlc, &env->ide); + env->can_id = Pack_dbg_Act2_candb_dbg(&ccu_candb_dbg_tx.dbg_Act2, env->canFrame.data, &env->canFrame.dlc, + &env->ide); return event_dbg_Act2_CYC; } @@ -304,7 +310,17 @@ static eTimeEventDbgTransmit isEventTransmitter(tCanSpamDebugTransmitter *env) { if (env->time_dbg_Sen_Duct_CYC < env->timeMs) { env->time_dbg_Sen_Duct_CYC = env->timeMs + dbg_Sen_Duct_CYC; - env->can_id = Pack_dbg_Sen_Duct_candb_dbg(&ccu_candb_dbg_tx.dbg_Sen_Duct, env->canFrame.data, &env->canFrame.dlc, &env->ide); + ccu_candb_dbg_tx.dbg_Sen_Duct.dbg_Sen_Duct_MultMsg_Idx = env->dbg_Sen_Duct_MultMsg_Idx; + + env->can_id = Pack_dbg_Sen_Duct_candb_dbg(&ccu_candb_dbg_tx.dbg_Sen_Duct, env->canFrame.data, + &env->canFrame.dlc, &env->ide); + + ++env->dbg_Sen_Duct_MultMsg_Idx; + if (env->dbg_Sen_Duct_MultMsg_Idx > 3) { + env->dbg_Sen_Duct_MultMsg_Idx = 0; + } + + return event_dbg_Sen_Duct_CYC; } @@ -314,7 +330,8 @@ static eTimeEventDbgTransmit isEventTransmitter(tCanSpamDebugTransmitter *env) { if (env->time_dbg_Sen_Eva_CYC < env->timeMs) { env->time_dbg_Sen_Eva_CYC = env->timeMs + dbg_Sen_Eva_CYC; - env->can_id = Pack_dbg_Sen_Eva_candb_dbg(&ccu_candb_dbg_tx.dbg_Sen_Eva, env->canFrame.data, &env->canFrame.dlc, &env->ide); + env->can_id = Pack_dbg_Sen_Eva_candb_dbg(&ccu_candb_dbg_tx.dbg_Sen_Eva, env->canFrame.data, &env->canFrame.dlc, + &env->ide); return event_dbg_Sen_Eva_CYC; } @@ -333,6 +350,21 @@ static eTimeEventDbgTransmit isEventTransmitter(tCanSpamDebugTransmitter *env) { return event_dbg_none; } +void set_CanDebugSpamTransmitter(tCanSpamDebugTransmitter *env) { + if (osMutexAcquire(env->access, 5000) == osOK) { + memcpy(&ccu_candb_dbg_tx.dbg_Act0, &rtY.dbgCAN_dbg_Act0_model, sizeof(ccu_candb_dbg_tx.dbg_Act0)); + memcpy(&ccu_candb_dbg_tx.dbg_Act1, &rtY.dbgCAN_dbg_Act1_model, sizeof(ccu_candb_dbg_tx.dbg_Act1)); + memcpy(&ccu_candb_dbg_tx.dbg_Act2, &rtY.dbgCAN_dbg_Act2_model, sizeof(ccu_candb_dbg_tx.dbg_Act2)); + + memcpy(&ccu_candb_dbg_tx.dbg_Sen_Duct, &rtY.dbgCAN_dbg_Sen_Duct_model, sizeof(ccu_candb_dbg_tx.dbg_Sen_Duct)); + memcpy(&ccu_candb_dbg_tx.dbg_Sen_Eva, &rtY.dbgCAN_dbg_Sen_Eva_model, sizeof(ccu_candb_dbg_tx.dbg_Sen_Eva)); + + osMutexRelease(env->access); + } else { + LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error set_CanDebugSpamTransmitter"); + } +} + static _Noreturn void CanSpamDebugTransmitter_Thread(tCanSpamDebugTransmitter *env) { for (;;) { diff --git a/CanSpamDebugTransmitter.h b/CanSpamDebugTransmitter.h index f38b106..2477951 100644 --- a/CanSpamDebugTransmitter.h +++ b/CanSpamDebugTransmitter.h @@ -9,36 +9,37 @@ #include "CanSerialPortFrame.h" #include "ccu_candb_dbg-binutil.h" #include "LoggerInterface.h" +#include "CanSpamDebugReceiver.h" #define dbg_Act0_SEND 1 #define dbg_Act1_SEND 1 #define dbg_Act2_SEND 1 -#define dbg_Auto_AF_SEND 1 -#define dbg_Auto_Duct_SEND 1 -#define dbg_Auto_Valve_Plus_SEND 1 -#define dbg_CCU_Info_SEND 1 -#define dbg_CCU_IO_SEND 1 -#define dbg_DiffBlr_ValveOpen_SEND 1 -#define dbg_Drs_SEND 1 -#define dbg_Info_Act1_SEND 1 -#define dbg_Info_Act2_SEND 1 -#define dbg_LIN_AirQS_Stat_SEND 1 -#define dbg_LIN_Aroma_Stat_SEND 1 -#define dbg_LIN_DRS_Stat_SEND 1 -#define dbg_LIN_eTXV_Stat_SEND 1 -#define dbg_LIN_Ionizer_Stat_SEND 1 -#define dbg_Logic_Ac_SEND 1 -#define dbg_Logic_Blower_SEND 1 -#define dbg_Logic_KM_Status_SEND 1 -#define dbg_Logic_Rec_SEND 1 -#define dbg_Logic_State_SEND 1 -#define dbg_Logic_Valve_SEND 1 -#define dbg_Sen_0_SEND 1 -#define dbg_Sen_Amb_SEND 1 -#define dbg_Sen_Demist_SEND 1 +#define dbg_Auto_AF_SEND 0 +#define dbg_Auto_Duct_SEND 0 +#define dbg_Auto_Valve_Plus_SEND 0 +#define dbg_CCU_Info_SEND 0 +#define dbg_CCU_IO_SEND 0 +#define dbg_DiffBlr_ValveOpen_SEND 0 +#define dbg_Drs_SEND 0 +#define dbg_Info_Act1_SEND 0 +#define dbg_Info_Act2_SEND 0 +#define dbg_LIN_AirQS_Stat_SEND 0 +#define dbg_LIN_Aroma_Stat_SEND 0 +#define dbg_LIN_DRS_Stat_SEND 0 +#define dbg_LIN_eTXV_Stat_SEND 0 +#define dbg_LIN_Ionizer_Stat_SEND 0 +#define dbg_Logic_Ac_SEND 0 +#define dbg_Logic_Blower_SEND 0 +#define dbg_Logic_KM_Status_SEND 0 +#define dbg_Logic_Rec_SEND 0 +#define dbg_Logic_State_SEND 0 +#define dbg_Logic_Valve_SEND 0 +#define dbg_Sen_0_SEND 0 +#define dbg_Sen_Amb_SEND 0 +#define dbg_Sen_Demist_SEND 0 #define dbg_Sen_Duct_SEND 1 #define dbg_Sen_Eva_SEND 1 -#define dbg_Sen_Incar_SEND 1 +#define dbg_Sen_Incar_SEND 0 #define dbg_Act0_CYC 100 @@ -104,6 +105,8 @@ typedef struct { osMutexId_t access; can_rx_message_type canFrame; + tCanSpamDebugReceiver *canSpamDebugReceiver; + uint32_t can_id; uint32_t timeMs; uint8_t ide; @@ -140,6 +143,8 @@ typedef struct { tLoggerInterface *logger; + uint8_t dbg_Sen_Duct_MultMsg_Idx; + struct { osThreadId_t id; uint32_t stack[384]; @@ -150,9 +155,11 @@ typedef struct { } tCanSpamDebugTransmitter; void -CanSpamDebugTransmitter_Init(tCanSpamDebugTransmitter *env, tSerialPortFrameIO *ioCanFrame, tLoggerInterface *logger); +CanSpamDebugTransmitter_Init(tCanSpamDebugTransmitter *env, tSerialPortFrameIO *ioCanFrame, + tCanSpamDebugReceiver *canSpamDebugReceiver, tLoggerInterface *logger); void CanSpamDebugTransmitter_StartThread(tCanSpamDebugTransmitter *env); +void set_CanDebugSpamTransmitter(tCanSpamDebugTransmitter *env); #endif //HVAC_M7_CANSPAMDEBUGTRANSMITTER_H