commit eaa28ca1bc3425a8fa345dd7b0944e478a69ff16 Author: cfif Date: Tue Apr 28 14:35:06 2026 +0300 Обновление diff --git a/CanSpamDebugTransmitter.c b/CanSpamDebugTransmitter.c new file mode 100644 index 0000000..567474a --- /dev/null +++ b/CanSpamDebugTransmitter.c @@ -0,0 +1,360 @@ +// +// Created by cfif on 05.12.2025. +// +#include +#include "CanSpamDebugTransmitter.h" +#include "CmsisRtosThreadUtils.h" +#include "CanPorts.h" +#include "memory.h" + +#define LOG_SIGN "CAN_DEBUG_TRANSMITTER" +#define LOGGER env->logger + +void CanSpamDebugTransmitter_Init(tCanSpamDebugTransmitter *env, + tSerialPortFrameIO *ioCanFrame, + tLoggerInterface *logger) { + + env->ioCanFrame = ioCanFrame; + env->logger = logger; + env->access = osMutexNew(NULL); + + InitThreadAtrStatic(&env->thread.attr, "CanSpamDebugTrans", env->thread.controlBlock, env->thread.stack, + osPriorityNormal); +} + + +static void sendEventToCan(tCanSpamDebugTransmitter *env) { + 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; + } + + env->ioCanFrame->transmit(env->ioCanFrame->env, (uint8_t *) &env->canFrame.data, env->canFrame.dlc, + env->can_id, env->canFrame.id_type, 100); +} + +static eTimeEventDbgTransmit isEventTransmitter(tCanSpamDebugTransmitter *env) { + +#if (dbg_Act0_SEND == 1) + 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); + + return event_dbg_Act0_CYC; + } +#endif + +#if (dbg_Act1_SEND == 1) + 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); + + return event_dbg_Act1_CYC; + } +#endif + +#if (dbg_Act2_SEND == 1) + 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); + + return event_dbg_Act2_CYC; + } +#endif + + +#if (dbg_Auto_AF_SEND == 1) + if (env->time_dbg_Auto_AF_CYC < env->timeMs) { + env->time_dbg_Auto_AF_CYC = env->timeMs + dbg_Auto_AF_CYC; + + env->can_id = Pack_dbg_Auto_AF_candb_dbg(&ccu_candb_dbg_tx.dbg_Auto_AF, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Auto_AF_CYC; + } +#endif + +#if (dbg_Auto_Duct_SEND == 1) + if (env->time_dbg_Auto_Duct_CYC < env->timeMs) { + env->time_dbg_Auto_Duct_CYC = env->timeMs + dbg_Auto_Duct_CYC; + + env->can_id = Pack_dbg_Auto_Duct_candb_dbg(&ccu_candb_dbg_tx.dbg_Auto_Duct, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Auto_Duct_CYC; + } +#endif + +#if (dbg_Auto_Valve_Plus_SEND == 1) + if (env->time_dbg_Auto_Valve_Plus_CYC < env->timeMs) { + env->time_dbg_Auto_Valve_Plus_CYC = env->timeMs + dbg_Auto_Valve_Plus_CYC; + + env->can_id = Pack_dbg_Auto_Valve_Plus_candb_dbg(&ccu_candb_dbg_tx.dbg_Auto_Valve_Plus, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Auto_Valve_Plus_CYC; + } +#endif + +#if (dbg_CCU_Info_SEND == 1) + if (env->time_dbg_CCU_Info_CYC < env->timeMs) { + env->time_dbg_CCU_Info_CYC = env->timeMs + dbg_CCU_Info_CYC; + + env->can_id = Pack_dbg_CCU_Info_candb_dbg(&ccu_candb_dbg_tx.dbg_CCU_Info, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_CCU_Info_CYC; + } +#endif + +#if (dbg_CCU_IO_SEND == 1) + if (env->time_dbg_CCU_IO_CYC < env->timeMs) { + env->time_dbg_CCU_IO_CYC = env->timeMs + dbg_CCU_IO_CYC; + + env->can_id = Pack_dbg_CCU_IO_candb_dbg(&ccu_candb_dbg_tx.dbg_CCU_IO, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_CCU_IO_CYC; + } +#endif + +#if (dbg_DiffBlr_ValveOpen_SEND == 1) + if (env->time_dbg_DiffBlr_ValveOpen_CYC < env->timeMs) { + env->time_dbg_DiffBlr_ValveOpen_CYC = env->timeMs + dbg_DiffBlr_ValveOpen_CYC; + + env->can_id = Pack_dbg_DiffBlr_ValveOpen_candb_dbg(&ccu_candb_dbg_tx.dbg_DiffBlr_ValveOpen, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_DiffBlr_ValveOpen_CYC; + } +#endif + + +#if (dbg_Drs_SEND == 1) + if (env->time_dbg_Drs_CYC < env->timeMs) { + env->time_dbg_Drs_CYC = env->timeMs + dbg_Drs_CYC; + + env->can_id = Pack_dbg_Drs_candb_dbg(&ccu_candb_dbg_tx.dbg_Drs, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Drs_CYC; + } +#endif + +#if (dbg_Info_Act1_SEND == 1) + if (env->time_dbg_Info_Act1_CYC < env->timeMs) { + env->time_dbg_Info_Act1_CYC = env->timeMs + dbg_Info_Act1_CYC; + + env->can_id = Pack_dbg_Info_Act1_candb_dbg(&ccu_candb_dbg_tx.dbg_Info_Act1, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Info_Act1_CYC; + } +#endif + +#if (dbg_Info_Act2_SEND == 1) + if (env->time_dbg_Info_Act2_CYC < env->timeMs) { + env->time_dbg_Info_Act2_CYC = env->timeMs + dbg_Info_Act2_CYC; + + env->can_id = Pack_dbg_Info_Act2_candb_dbg(&ccu_candb_dbg_tx.dbg_Info_Act2, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Info_Act2_CYC; + } +#endif + +#if (dbg_LIN_AirQS_Stat_SEND == 1) + if (env->time_dbg_LIN_AirQS_Stat_CYC < env->timeMs) { + env->time_dbg_LIN_AirQS_Stat_CYC = env->timeMs + dbg_LIN_AirQS_Stat_CYC; + + env->can_id = Pack_dbg_LIN_AirQS_Stat_candb_dbg(&ccu_candb_dbg_tx.dbg_LIN_AirQS_Stat, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_LIN_AirQS_Stat_CYC; + } +#endif + +#if (dbg_LIN_Aroma_Stat_SEND == 1) + if (env->time_dbg_LIN_Aroma_Stat_CYC < env->timeMs) { + env->time_dbg_LIN_Aroma_Stat_CYC = env->timeMs + dbg_LIN_Aroma_Stat_CYC; + + env->can_id = Pack_dbg_LIN_Aroma_Stat_candb_dbg(&ccu_candb_dbg_tx.dbg_LIN_Aroma_Stat, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_LIN_Aroma_Stat_CYC; + } +#endif + +#if (dbg_LIN_DRS_Stat_SEND == 1) + if (env->time_dbg_LIN_DRS_Stat_CYC < env->timeMs) { + env->time_dbg_LIN_DRS_Stat_CYC = env->timeMs + dbg_LIN_DRS_Stat_CYC; + + env->can_id = Pack_dbg_LIN_DRS_Stat_candb_dbg(&ccu_candb_dbg_tx.dbg_LIN_DRS_Stat, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_LIN_DRS_Stat_CYC; + } +#endif + +#if (dbg_LIN_eTXV_Stat_SEND == 1) + if (env->time_dbg_LIN_eTXV_Stat_CYC < env->timeMs) { + env->time_dbg_LIN_eTXV_Stat_CYC = env->timeMs + dbg_LIN_eTXV_Stat_CYC; + + env->can_id = Pack_dbg_LIN_eTXV_Stat_candb_dbg(&ccu_candb_dbg_tx.dbg_LIN_eTXV_Stat, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_LIN_eTXV_Stat_CYC; + } +#endif + +#if (dbg_LIN_Ionizer_Stat_SEND == 1) + if (env->time_dbg_LIN_Ionizer_Stat_CYC < env->timeMs) { + env->time_dbg_LIN_Ionizer_Stat_CYC = env->timeMs + dbg_LIN_Ionizer_Stat_CYC; + + env->can_id = Pack_dbg_LIN_Ionizer_Stat_candb_dbg(&ccu_candb_dbg_tx.dbg_LIN_Ionizer_Stat, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_LIN_Ionizer_Stat_CYC; + } +#endif + +#if (dbg_Logic_Ac_SEND == 1) + if (env->time_dbg_Logic_Ac_CYC < env->timeMs) { + env->time_dbg_Logic_Ac_CYC = env->timeMs + dbg_Logic_Ac_CYC; + + env->can_id = Pack_dbg_Logic_Ac_candb_dbg(&ccu_candb_dbg_tx.dbg_Logic_Ac, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Logic_Ac_CYC; + } +#endif + +#if (dbg_Logic_Blower_SEND == 1) + if (env->time_dbg_Logic_Blower_CYC < env->timeMs) { + env->time_dbg_Logic_Blower_CYC = env->timeMs + dbg_Logic_Blower_CYC; + + env->can_id = Pack_dbg_Logic_Blower_candb_dbg(&ccu_candb_dbg_tx.dbg_Logic_Blower, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Logic_Blower_CYC; + } +#endif + +#if (dbg_Logic_KM_Status_SEND == 1) + if (env->time_dbg_Logic_KM_Status_CYC < env->timeMs) { + env->time_dbg_Logic_KM_Status_CYC = env->timeMs + dbg_Logic_KM_Status_CYC; + + env->can_id = Pack_dbg_Logic_KM_Status_candb_dbg(&ccu_candb_dbg_tx.dbg_Logic_KM_Status, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Logic_KM_Status_CYC; + } +#endif + +#if (dbg_Logic_Rec_SEND == 1) + if (env->time_dbg_Logic_Rec_CYC < env->timeMs) { + env->time_dbg_Logic_Rec_CYC = env->timeMs + dbg_Logic_Rec_CYC; + + env->can_id = Pack_dbg_Logic_Rec_candb_dbg(&ccu_candb_dbg_tx.dbg_Logic_Rec, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Logic_Rec_CYC; + } +#endif + +#if (dbg_Logic_State_SEND == 1) + if (env->time_dbg_Logic_State_CYC < env->timeMs) { + env->time_dbg_Logic_State_CYC = env->timeMs + dbg_Logic_State_CYC; + + env->can_id = Pack_dbg_Logic_State_candb_dbg(&ccu_candb_dbg_tx.dbg_Logic_State, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Logic_State_CYC; + } +#endif + +#if (dbg_Logic_Valve_SEND == 1) + if (env->time_dbg_Logic_Valve_CYC < env->timeMs) { + env->time_dbg_Logic_Valve_CYC = env->timeMs + dbg_Logic_Valve_CYC; + + env->can_id = Pack_dbg_Logic_Valve_candb_dbg(&ccu_candb_dbg_tx.dbg_Logic_Valve, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Logic_Valve_CYC; + } +#endif + +#if (dbg_Sen_0_SEND == 1) + if (env->time_dbg_Sen_0_CYC < env->timeMs) { + env->time_dbg_Sen_0_CYC = env->timeMs + dbg_Sen_0_CYC; + + env->can_id = Pack_dbg_Sen_0_candb_dbg(&ccu_candb_dbg_tx.dbg_Sen_0, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Sen_0_CYC; + } +#endif + +#if (dbg_Sen_Amb_SEND == 1) + if (env->time_dbg_Sen_Amb_CYC < env->timeMs) { + env->time_dbg_Sen_Amb_CYC = env->timeMs + dbg_Sen_Amb_CYC; + + env->can_id = Pack_dbg_Sen_Amb_candb_dbg(&ccu_candb_dbg_tx.dbg_Sen_Amb, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Sen_Amb_CYC; + } +#endif + +#if (dbg_Sen_Demist_SEND == 1) + if (env->time_dbg_Sen_Demist_CYC < env->timeMs) { + env->time_dbg_Sen_Demist_CYC = env->timeMs + dbg_Sen_Demist_CYC; + + env->can_id = Pack_dbg_Sen_Demist_candb_dbg(&ccu_candb_dbg_tx.dbg_Sen_Demist, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Sen_Demist_CYC; + } +#endif + +#if (dbg_Sen_Duct_SEND == 1) + 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); + + return event_dbg_Sen_Duct_CYC; + } +#endif + +#if (dbg_Sen_Eva_SEND == 1) + 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); + + return event_dbg_Sen_Eva_CYC; + } +#endif + +#if (dbg_Sen_Incar_SEND == 1) + if (env->time_dbg_Sen_Incar_CYC < env->timeMs) { + env->time_dbg_Sen_Incar_CYC = env->timeMs + dbg_Sen_Incar_CYC; + + env->can_id = Pack_dbg_Sen_Incar_candb_dbg(&ccu_candb_dbg_tx.dbg_Sen_Incar, env->canFrame.data, &env->canFrame.dlc, &env->ide); + + return event_dbg_Sen_Incar_CYC; + } +#endif + + return event_dbg_none; +} + + +static _Noreturn void CanSpamDebugTransmitter_Thread(tCanSpamDebugTransmitter *env) { + for (;;) { + if (osMutexAcquire(env->access, 5000) == osOK) { + + env->timeMs = GetSystemTick(); + + while (isEventTransmitter(env) != event_dbg_none) { + sendEventToCan(env); + } + + osMutexRelease(env->access); + } else { + LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error CanSpamDebugTransmitter_Thread"); + } + SystemDelayMs(1); + } +} + +void CanSpamDebugTransmitter_StartThread(tCanSpamDebugTransmitter *env) { + if (!env->thread.id) { + env->thread.id = osThreadNew((osThreadFunc_t) (CanSpamDebugTransmitter_Thread), (void *) (env), + &env->thread.attr); + } +} \ No newline at end of file diff --git a/CanSpamDebugTransmitter.h b/CanSpamDebugTransmitter.h new file mode 100644 index 0000000..f38b106 --- /dev/null +++ b/CanSpamDebugTransmitter.h @@ -0,0 +1,158 @@ +// +// Created by cfif on 05.12.2025. +// + +#ifndef HVAC_M7_CANSPAMDEBUGTRANSMITTER_H +#define HVAC_M7_CANSPAMDEBUGTRANSMITTER_H + +#include +#include "CanSerialPortFrame.h" +#include "ccu_candb_dbg-binutil.h" +#include "LoggerInterface.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_Sen_Duct_SEND 1 +#define dbg_Sen_Eva_SEND 1 +#define dbg_Sen_Incar_SEND 1 + + +#define dbg_Act0_CYC 100 +#define dbg_Act1_CYC 100 +#define dbg_Act2_CYC 100 +#define dbg_Auto_Valve_Plus_CYC 100 +#define dbg_CCU_IO_CYC 100 +#define dbg_Drs_CYC 100 +#define dbg_Info_Act1_CYC 100 +#define dbg_Info_Act2_CYC 100 +#define dbg_LIN_AirQS_Stat_CYC 100 +#define dbg_LIN_Aroma_Stat_CYC 100 +#define dbg_LIN_DRS_Stat_CYC 100 +#define dbg_LIN_eTXV_Stat_CYC 100 +#define dbg_LIN_Ionizer_Stat_CYC 100 +#define dbg_Logic_Ac_CYC 100 +#define dbg_Logic_Blower_CYC 100 +#define dbg_Logic_KM_Status_CYC 100 +#define dbg_Logic_Rec_CYC 100 +#define dbg_Logic_State_CYC 100 +#define dbg_Logic_Valve_CYC 100 +#define dbg_Sen_Amb_CYC 100 +#define dbg_Sen_Demist_CYC 100 +#define dbg_Sen_Eva_CYC 100 + +typedef enum { + event_dbg_none = 0x00, + event_dbg_Act0_CYC = 0x01, + event_dbg_Act1_CYC = 0x02, + event_dbg_Act2_CYC = 0x03, + event_dbg_Auto_AF_CYC = 0x4, + event_dbg_Auto_Duct_CYC = 0x5, + event_dbg_Auto_Valve_Plus_CYC = 0x6, + event_dbg_CCU_Info_CYC = 0x7, + event_dbg_CCU_IO_CYC = 0x8, + event_dbg_DiffBlr_ValveOpen_CYC = 0x9, + event_dbg_Drs_CYC = 0xA, + event_dbg_Info_Act1_CYC = 0xB, + event_dbg_Info_Act2_CYC = 0xC, + event_dbg_LIN_AirQS_Stat_CYC = 0xD, + event_dbg_LIN_Aroma_Stat_CYC = 0xE, + event_dbg_LIN_DRS_Stat_CYC = 0xF, + event_dbg_LIN_eTXV_Stat_CYC = 0x10, + event_dbg_LIN_Ionizer_Stat_CYC = 0x11, + event_dbg_Logic_Ac_CYC = 0x12, + event_dbg_Logic_Blower_CYC = 0x13, + event_dbg_Logic_KM_Status_CYC = 0x14, + event_dbg_Logic_Rec_CYC = 0x15, + event_dbg_Logic_State_CYC = 0x16, + event_dbg_Logic_Valve_CYC = 0x17, + event_dbg_Sen_0_CYC = 0x18, + event_dbg_Sen_Amb_CYC = 0x19, + event_dbg_Sen_Demist_CYC = 0x1A, + event_dbg_Sen_Duct_CYC = 0x1B, + event_dbg_Sen_Eva_CYC = 0x1C, + event_dbg_Sen_Incar_CYC = 0x1D + +} eTimeEventDbgTransmit; + +typedef struct { + + tSerialPortFrameIO *ioCanFrame; + osMutexId_t access; + can_rx_message_type canFrame; + + uint32_t can_id; + uint32_t timeMs; + uint8_t ide; + + uint32_t time_dbg_Act0_CYC; + uint32_t time_dbg_Act1_CYC; + uint32_t time_dbg_Act2_CYC; + uint32_t time_dbg_Auto_AF_CYC; + uint32_t time_dbg_Auto_Duct_CYC; + uint32_t time_dbg_Auto_Valve_Plus_CYC; + uint32_t time_dbg_CCU_Info_CYC; + uint32_t time_dbg_CCU_IO_CYC; + uint32_t time_dbg_DiffBlr_ValveOpen_CYC; + uint32_t time_dbg_Drs_CYC; + uint32_t time_dbg_Info_Act1_CYC; + uint32_t time_dbg_Info_Act2_CYC; + uint32_t time_dbg_LIN_AirQS_Stat_CYC; + uint32_t time_dbg_LIN_Aroma_Stat_CYC; + uint32_t time_dbg_LIN_DRS_Stat_CYC; + uint32_t time_dbg_LIN_eTXV_Stat_CYC; + uint32_t time_dbg_LIN_Ionizer_Stat_CYC; + uint32_t time_dbg_Logic_Ac_CYC; + uint32_t time_dbg_Logic_Blower_CYC; + uint32_t time_dbg_Logic_KM_Status_CYC; + uint32_t time_dbg_Logic_Rec_CYC; + uint32_t time_dbg_Logic_State_CYC; + uint32_t time_dbg_Logic_Valve_CYC; + uint32_t time_dbg_Sen_0_CYC; + uint32_t time_dbg_Sen_Amb_CYC; + uint32_t time_dbg_Sen_Demist_CYC; + uint32_t time_dbg_Sen_Duct_CYC; + uint32_t time_dbg_Sen_Eva_CYC; + uint32_t time_dbg_Sen_Incar_CYC; + + tLoggerInterface *logger; + + struct { + osThreadId_t id; + uint32_t stack[384]; + StaticTask_t controlBlock; + osThreadAttr_t attr; + } thread; + +} tCanSpamDebugTransmitter; + +void +CanSpamDebugTransmitter_Init(tCanSpamDebugTransmitter *env, tSerialPortFrameIO *ioCanFrame, tLoggerInterface *logger); + +void CanSpamDebugTransmitter_StartThread(tCanSpamDebugTransmitter *env); + + +#endif //HVAC_M7_CANSPAMDEBUGTRANSMITTER_H diff --git a/modular.json b/modular.json new file mode 100755 index 0000000..99df025 --- /dev/null +++ b/modular.json @@ -0,0 +1,10 @@ +{ + "cmake": { + "inc_dirs": [ + "./" + ], + "srcs": [ + "./**.c" + ] + } +}