HVAC_M7_CAN_SPAM/CanSpamTransmitter.c

243 lines
11 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Created by cfif on 05.12.2025.
//
#include <SystemDelayInterface.h>
#include "CanSpamTransmitter.h"
#include "CmsisRtosThreadUtils.h"
#include "CanPorts.h"
#include "memory.h"
#define LOG_SIGN "CAN_TRANSMITTER"
#define LOGGER env->logger
void CanSpamTransmitter_Init(tCanSpamTransmitter *env,
tSerialPortFrameIO *ioCanFrame,
tLoggerInterface *logger) {
env->ioCanFrame = ioCanFrame;
env->logger = logger;
env->access = osMutexNew(NULL);
InitThreadAtrStatic(&env->thread.attr, "CanSpamTrans", env->thread.controlBlock, env->thread.stack,
osPriorityNormal);
}
static void sendEventToCan(tCanSpamTransmitter *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 eTimeEventTransmit isEventTransmitter(tCanSpamTransmitter *env) {
#if (CCU_Stat1_SEND == 1)
if (env->time_CCU_Stat1_CYC < env->timeMs) {
env->time_CCU_Stat1_CYC = env->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 event_CCU_Stat1_CYC;
}
#endif
#if (CCU_Stat2_SEND == 1)
if (env->time_CCU_Stat2_CYC < env->timeMs) {
env->time_CCU_Stat2_CYC = env->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 event_CCU_Stat2_CYC;
}
#endif
#if (CCU_Stat3_SEND == 1)
if (env->time_CCU_Stat3_CYC < env->timeMs) {
env->time_CCU_Stat3_CYC = env->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 event_CCU_Stat3_CYC;
}
#endif
#if (CCU_Errors_SEND == 1)
if (env->time_CCU_Errors_CYC < env->timeMs) {
env->time_CCU_Errors_CYC = env->timeMs + CCU_Errors_CYC;
env->can_id = Pack_CCU_Errors_candb(&ccu_candb_tx.CCU_Errors, env->canFrame.data, &env->canFrame.dlc,
&env->ide);
return event_CCU_Errors_CYC;
}
#endif
#if (CCU_Requests_SEND == 1)
if (env->time_CCU_Requests < env->timeMs) {
env->time_CCU_Requests = env->timeMs + CCU_Requests_CYC;
env->can_id = Pack_CCU_Requests_candb(&ccu_candb_tx.CCU_Requests, env->canFrame.data, &env->canFrame.dlc,
&env->ide);
return event_CCU_Requests;
}
#endif
// начало--------------------------------------0x310 CCU_HVC_Req_Msg------------------------------------------------
// начало--------------------------------------0x310 CCU_HVC_Req_Msg------------------------------------------------
// начало--------------------------------------0x310 CCU_HVC_Req_Msg------------------------------------------------
#if (CCU_HVC_Req_Msg_SEND == 1)
if (env->time_CCU_HVC_Req_Msg < env->timeMs) {
env->time_CCU_HVC_Req_Msg = env->timeMs + CCU_HVC_Req_Msg_CYC;
env->can_id = Pack_CCU_HVC_Req_Msg_candb(&ccu_candb_tx.CCU_HVC_Req_Msg, env->canFrame.data, &env->canFrame.dlc,
&env->ide);
return event_CCU_HVC_Req_Msg;
}
#endif
// конец ---------------------------------------0x310 CCU_HVC_Req_Msg------------------------------------------------
// конец ---------------------------------------0x310 CCU_HVC_Req_Msg------------------------------------------------
// конец ---------------------------------------0x310 CCU_HVC_Req_Msg------------------------------------------------
// начало РЕЗЕРВ--------------------------------------0x315 CCU_VCU_Msg1---------------------------------------------------
// начало РЕЗЕРВ--------------------------------------0x315 CCU_VCU_Msg1---------------------------------------------------
// начало РЕЗЕРВ--------------------------------------0x315 CCU_VCU_Msg1---------------------------------------------------
#if (CCU_VCU_Msg1_SEND == 1)
if (env->time_CCU_VCU_Msg1 < env->timeMs) {
env->time_CCU_VCU_Msg1 = env->timeMs + CCU_VCU_Msg1_CYC;
env->can_id = Pack_CCU_VCU_Msg1_candb(&ccu_candb_tx.CCU_VCU_Msg1, env->canFrame.data, &env->canFrame.dlc,
&env->ide);
return event_CCU_VCU_Msg1;
}
#endif
// конец РЕЗЕРВ---------------------------------------0x315 CCU_VCU_Msg1---------------------------------------------------
// конец РЕЗЕРВ---------------------------------------0x315 CCU_VCU_Msg1---------------------------------------------------
// конец РЕЗЕРВ---------------------------------------0x315 CCU_VCU_Msg1---------------------------------------------------
// начало РЕЗЕРВ--------------------------------------0x316 CCU_VCU_Msg2---------------------------------------------------
// начало РЕЗЕРВ--------------------------------------0x316 CCU_VCU_Msg2---------------------------------------------------
// начало РЕЗЕРВ--------------------------------------0x316 CCU_VCU_Msg2---------------------------------------------------
#if (CCU_VCU_Msg2_SEND == 1)
if (env->time_CCU_VCU_Msg2 < env->timeMs) {
env->time_CCU_VCU_Msg2 = env->timeMs + CCU_VCU_Msg2_CYC;
env->can_id = Pack_CCU_VCU_Msg2_candb(&ccu_candb_tx.CCU_VCU_Msg2, env->canFrame.data, &env->canFrame.dlc,
&env->ide);
return event_CCU_VCU_Msg2;
}
#endif
// конец РЕЗЕРВ---------------------------------------0x316 CCU_VCU_Msg2---------------------------------------------------
// конец РЕЗЕРВ---------------------------------------0x316 CCU_VCU_Msg2---------------------------------------------------
// конец РЕЗЕРВ---------------------------------------0x316 CCU_VCU_Msg2---------------------------------------------------
// начало--------------------------------------0x380 CCU_Msg1-------------------------------------------------------
// начало--------------------------------------0x380 CCU_Msg1-------------------------------------------------------
// начало--------------------------------------0x380 CCU_Msg1-------------------------------------------------------
#if (CCU_Msg1_SEND == 1)
if (env->time_CCU_Msg1 < env->timeMs) {
env->time_CCU_Msg1 = env->timeMs + CCU_Msg1_CYC;
env->can_id = Pack_CCU_Msg1_candb(&ccu_candb_tx.CCU_Msg1, env->canFrame.data, &env->canFrame.dlc, &env->ide);
return event_CCU_Msg1;
}
#endif
// начало--------------------------------------0x380 CCU_Msg1-------------------------------------------------------
// начало--------------------------------------0x380 CCU_Msg1-------------------------------------------------------
// начало--------------------------------------0x380 CCU_Msg1-------------------------------------------------------
// начало--------------------------------------0x501 CCU_Msg3-------------------------------------------------------
// начало--------------------------------------0x501 CCU_Msg3-------------------------------------------------------
// начало--------------------------------------0x501 CCU_Msg3-------------------------------------------------------
#if (CCU_Msg3_SEND == 1)
if (env->time_CCU_Msg3 < env->timeMs) {
env->time_CCU_Msg3 = env->timeMs + CCU_Msg3_CYC;
env->can_id = Pack_CCU_Msg3_candb(&ccu_candb_tx.CCU_Msg3, env->canFrame.data, &env->canFrame.dlc, &env->ide);
return event_CCU_Msg3;
}
#endif
// конец--------------------------------------0x501 CCU_Msg3-------------------------------------------------------
// конец--------------------------------------0x501 CCU_Msg3-------------------------------------------------------
// конец--------------------------------------0x501 CCU_Msg3-------------------------------------------------------
// начало РЕЗЕРВ--------------------------------------0x18FFF200 CCU_AC_Ctrl -------------------------------------------------------
// начало РЕЗЕРВ--------------------------------------0x18FFF200 CCU_AC_Ctrl -------------------------------------------------------
// начало РЕЗЕРВ--------------------------------------0x18FFF200 CCU_AC_Ctrl -------------------------------------------------------
#if (CU_AC_Ctrl_SEND == 1)
if (env->time_CCU_AC_Ctrl < env->timeMs) {
env->time_CCU_AC_Ctrl = env->timeMs + CCU_AC_Ctrl_CYC;
env->can_id = Pack_CCU_AC_Ctrl_candb(&ccu_candb_tx.CCU_AC_Ctrl, env->canFrame.data, &env->canFrame.dlc,
&env->ide);
return event_CCU_AC_Ctrl;
}
#endif
// конец РЕЗЕРВ--------------------------------------0x18FFF200 CCU_AC_Ctrl -------------------------------------------------------
// конец РЕЗЕРВ--------------------------------------0x18FFF200 CCU_AC_Ctrl -------------------------------------------------------
// конец РЕЗЕРВ--------------------------------------0x18FFF200 CCU_AC_Ctrl -------------------------------------------------------
return event_CCU_none;
}
void set_CCU_Errors(tCanSpamTransmitter *env, CCU_Errors_t *CCU_Errors) {
if (osMutexAcquire(env->access, 5000) == osOK) {
memcpy(&ccu_candb_tx.CCU_Errors, CCU_Errors, sizeof(CCU_Errors_t));
osMutexRelease(env->access);
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error set_CCU_Errors");
}
}
void set_CCU_Mute(tCanSpamTransmitter *env, bool mute) {
if (osMutexAcquire(env->access, 5000) == osOK) {
env->isMute = mute;
osMutexRelease(env->access);
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error set_CCU_Mute");
}
}
static _Noreturn void CanSpamTransmitter_Thread(tCanSpamTransmitter *env) {
for (;;) {
if (osMutexAcquire(env->access, 5000) == osOK) {
if (env->isMute == false) {
env->timeMs = GetSystemTick();
while (isEventTransmitter(env) != event_CCU_none) {
sendEventToCan(env);
}
}
osMutexRelease(env->access);
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error CanSpamTransmitter_Thread");
}
SystemDelayMs(1);
}
}
void CanSpamTransmitter_StartThread(tCanSpamTransmitter *env) {
if (!env->thread.id) {
env->thread.id = osThreadNew((osThreadFunc_t) (CanSpamTransmitter_Thread), (void *) (env), &env->thread.attr);
}
}