diff --git a/CanSpamReceiver.c b/CanSpamReceiver.c index af6e507..07c9155 100644 --- a/CanSpamReceiver.c +++ b/CanSpamReceiver.c @@ -17,7 +17,7 @@ void CanSpamReceiver_Init(tCanSpamReceiver *env, osPriorityNormal); } -void ListenCanSpamReceiver(tCanSpamReceiver *env) { +static void ListenCanSpamReceiver(tCanSpamReceiver *env) { uint16_t recv = env->ioCanFrame->receive(env->ioCanFrame->env, PROTOCOL_CAN_RAW, (uint8_t *) &env->canFrame, 1, 1000); diff --git a/CanSpamTransmitter.c b/CanSpamTransmitter.c new file mode 100644 index 0000000..30cbcbf --- /dev/null +++ b/CanSpamTransmitter.c @@ -0,0 +1,78 @@ +// +// Created by cfif on 05.12.2025. +// +#include +#include "CanSpamTransmitter.h" +#include "CmsisRtosThreadUtils.h" +#include "CanPorts.h" + +void CanSpamTransmitter_Init(tCanSpamTransmitter *env, + tSerialPortFrameIO *ioCanFrame) { + + env->ioCanFrame = ioCanFrame; + + env->access = osMutexNew(NULL); + + InitThreadAtrStatic(&env->thread.attr, "CanSpamReceiver", env->thread.controlBlock, env->thread.stack, + osPriorityNormal); +} + +static void TransCanSpamTransmitter(tCanSpamTransmitter *env) { + + uint32_t timeMs = GetSystemTick(); + + if (env->time_CCU_Stat1_CYC < timeMs) { + env->time_CCU_Stat1_CYC = timeMs + CCU_Stat1_CYC; + env->can_id = Pack_CCU_Stat1_candb(&ccu_candb_tx.CCU_Stat1, env->canFrame.data, &env->canFrame.dlc, &env->ide); + return; + } + + if (env->time_CCU_Stat2_CYC < timeMs) { + env->time_CCU_Stat2_CYC = timeMs + CCU_Stat2_CYC; + env->can_id = Pack_CCU_Stat2_candb(&ccu_candb_tx.CCU_Stat2, env->canFrame.data, &env->canFrame.dlc, &env->ide); + return; + } + + if (env->time_CCU_Stat3_CYC < timeMs) { + env->time_CCU_Stat3_CYC = timeMs + CCU_Stat3_CYC; + env->can_id = Pack_CCU_Stat3_candb(&ccu_candb_tx.CCU_Stat3, env->canFrame.data, &env->canFrame.dlc, &env->ide); + return; + } + +} + +static _Noreturn void CanSpamTransmitter_Thread(tCanSpamTransmitter *env) { + for (;;) { + if (osMutexAcquire(env->access, 100) == osOK) { + + env->can_id = 0; + + TransCanSpamTransmitter(env); + + if (env->can_id) { + + if (env->ide) { + env->canFrame.id_type = FLEXCAN_ID_EXT; + env->canFrame.extended_id = env->can_id; + } else { + env->canFrame.id_type = FLEXCAN_ID_STD; + env->canFrame.standard_id = env->can_id; + } + + osMutexRelease(env->access); + env->ioCanFrame->transmit(env->ioCanFrame->env, (uint8_t *) &env->canFrame, env->canFrame.dlc, 10); + } else { + osMutexRelease(env->access); + SystemDelayMs(10); + } + + + } + } +} + +void CanSpamTransmitter_StartThread(tCanSpamTransmitter *env) { + if (!env->thread.id) { + env->thread.id = osThreadNew((osThreadFunc_t) (CanSpamTransmitter_Thread), (void *) (env), &env->thread.attr); + } +} \ No newline at end of file diff --git a/CanSpamTransmitter.h b/CanSpamTransmitter.h new file mode 100644 index 0000000..b8059dd --- /dev/null +++ b/CanSpamTransmitter.h @@ -0,0 +1,39 @@ +// +// Created by cfif on 05.12.2025. +// + +#ifndef HVAC_M7_CANSPAMTRANSMITTER_H +#define HVAC_M7_CANSPAMTRANSMITTER_H + +#include +#include "CanSerialPortFrame.h" +#include "ccu_candb-binutil.h" + +typedef struct { + + tSerialPortFrameIO *ioCanFrame; + osMutexId_t access; + can_rx_message_type canFrame; + + uint32_t can_id; + uint8_t ide; + + uint32_t time_CCU_Stat1_CYC; + uint32_t time_CCU_Stat2_CYC; + uint32_t time_CCU_Stat3_CYC; + + struct { + osThreadId_t id; + uint32_t stack[512]; + StaticTask_t controlBlock; + osThreadAttr_t attr; + } thread; + +} tCanSpamTransmitter; + +void CanSpamTransmitter_Init(tCanSpamTransmitter *env, tSerialPortFrameIO *ioCanFrame); + +void CanSpamTransmitter_StartThread(tCanSpamTransmitter *env); + + +#endif //HVAC_M7_CANSPAMTRANSMITTER_H