From 1195367a28f0eb5869d496898f15384e538b4181 Mon Sep 17 00:00:00 2001
From: darya
Date: Tue, 23 Jun 2026 22:10: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=2023.06.2026?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CanSpamTransmitter.c | 170 ++++++++++++++++++++++++++++++++++++++++++-
CanSpamTransmitter.h | 55 ++++++++++++--
2 files changed, 216 insertions(+), 9 deletions(-)
diff --git a/CanSpamTransmitter.c b/CanSpamTransmitter.c
index 5d94d75..d359fed 100644
--- a/CanSpamTransmitter.c
+++ b/CanSpamTransmitter.c
@@ -26,6 +26,7 @@ void CanSpamTransmitter_Init(tCanSpamTransmitter *env,
}
+
static void sendEventToCan(tCanSpamTransmitter *env) {
if (env->ide) {
env->canFrame.id_type = FLEXCAN_ID_EXT;
@@ -72,6 +73,7 @@ static eTimeEventTransmit isEventTransmitter(tCanSpamTransmitter *env) {
}
#endif
+/*
#if (CCU_Errors_SEND == 1)
if (env->time_CCU_Errors_CYC <= env->timeMs) {
env->time_CCU_Errors_CYC = env->timeMs + CCU_Errors_CYC;
@@ -83,7 +85,7 @@ static eTimeEventTransmit isEventTransmitter(tCanSpamTransmitter *env) {
return event_CCU_Errors_CYC;
}
#endif
-
+*/
#if (CCU_Requests_SEND == 1)
if (env->time_CCU_Requests <= env->timeMs) {
@@ -217,6 +219,7 @@ static eTimeEventTransmit isEventTransmitter(tCanSpamTransmitter *env) {
// начало--------------------------------------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;
@@ -247,6 +250,7 @@ static eTimeEventTransmit isEventTransmitter(tCanSpamTransmitter *env) {
return event_CCU_Msg3;
}
#endif
+*/
// конец--------------------------------------0x501 CCU_Msg3-------------------------------------------------------
// конец--------------------------------------0x501 CCU_Msg3-------------------------------------------------------
// конец--------------------------------------0x501 CCU_Msg3-------------------------------------------------------
@@ -273,11 +277,11 @@ static eTimeEventTransmit isEventTransmitter(tCanSpamTransmitter *env) {
void set_CanSpamTransmitter(tCanSpamTransmitter *env) {
if (osMutexAcquire(env->access, 5000) == osOK) {
- memcpy(&ccu_candb_tx.CCU_Errors, &rtY.CCU_Errors_model, sizeof(ccu_candb_tx.CCU_Errors));
+// memcpy(&ccu_candb_tx.CCU_Errors, &rtY.CCU_Errors_model, sizeof(ccu_candb_tx.CCU_Errors));
memcpy(&ccu_candb_tx.CCU_Stat1, &rtY.CCU_Stat1_model, sizeof(ccu_candb_tx.CCU_Stat1));
memcpy(&ccu_candb_tx.CCU_Stat2, &rtY.CCU_Stat2_model, sizeof(ccu_candb_tx.CCU_Stat2));
memcpy(&ccu_candb_tx.CCU_HVC_Req_Msg, &rtY.CCUCAN_HVC_REQ_MSG_MODEL, sizeof(ccu_candb_tx.CCU_HVC_Req_Msg));
- memcpy(&ccu_candb_tx.CCU_Msg3, &rtY.CCU_Msg3_model, sizeof(ccu_candb_tx.CCU_Msg3));
+// memcpy(&ccu_candb_tx.CCU_Msg3, &rtY.CCU_Msg3_model, sizeof(ccu_candb_tx.CCU_Msg3));
osMutexRelease(env->access);
@@ -324,4 +328,162 @@ 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
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+void CanSpamSlowTransmitter_Init(tCanSpamSlowTransmitter *env,
+ tSerialPortFrameIO *ioCanFrame,
+ osMutexId_t modelTaskAccess,
+ tLoggerInterface *logger) {
+
+ env->ioCanFrame = ioCanFrame;
+ env->modelTaskAccess = modelTaskAccess;
+ env->logger = logger;
+ env->access = osMutexNew(NULL);
+
+ InitThreadAtrStatic(&env->thread.attr, "CanSpamSlowTrans", env->thread.controlBlock, env->thread.stack,
+ osPriorityNormal);
+}
+
+
+
+static void sendEventSlowToCan(tCanSpamSlowTransmitter *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, SPAM_SLOW_CAN_HANDLER);
+}
+
+void set_CanSpamSlowTransmitter(tCanSpamSlowTransmitter *env) {
+ if (osMutexAcquire(env->access, 5000) == osOK) {
+ memcpy(&ccu_candb_tx.CCU_Errors, &rtY.CCU_Errors_model, sizeof(ccu_candb_tx.CCU_Errors));
+ memcpy(&ccu_candb_tx.CCU_Msg3, &rtY.CCU_Msg3_model, sizeof(ccu_candb_tx.CCU_Msg3));
+ osMutexRelease(env->access);
+ } else {
+ LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error set_CanSpamTransmitter");
+ }
+}
+
+void set_CCU_Slow_Mute(tCanSpamSlowTransmitter *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 eTimeEventTransmit isEventSlowTransmitter(tCanSpamSlowTransmitter *env) {
+
+#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
+
+
+ // начало--------------------------------------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;
+
+ // Rolling Counter [0 - 15]
+ if (env->CCU_Msg3_CCU_MSG3_RC >= 15) {
+ env->CCU_Msg3_CCU_MSG3_RC = 0;
+ } else {
+ ++env->CCU_Msg3_CCU_MSG3_RC;
+ }
+
+ ccu_candb_tx.CCU_Msg3.CCU_MSG3_RC = env->CCU_Msg3_CCU_MSG3_RC;
+
+ // Checksum XOR8 of the data field this message
+ // Checksum computed as per XOR algorithm:
+ // Byte 1 XOR byte 2 .... XOR byte n-1. (n = packet length.)
+
+ uint8_t d0 = (uint8_t)((ccu_candb_tx.CCU_Msg3.CCU_FAN_Req & (0x7FU)));
+ uint8_t d1 = (uint8_t)((ccu_candb_tx.CCU_Msg3.CCU_RestMode_Stat & (0x03U)));
+ uint8_t d2 = (uint8_t)((ccu_candb_tx.CCU_Msg3.CCU_IncarTempSum_Val_ro & (0xFFU)));
+ uint8_t d3 = (uint8_t)((ccu_candb_tx.CCU_Msg3.CCU_MSG3_RC & (0x0FU)));
+
+ ccu_candb_tx.CCU_Msg3.CCU_MSG3_CS = d0 ^ d1 ^ d2 ^ d3;
+
+
+ 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-------------------------------------------------------
+
+ return event_CCU_none;
+}
+
+
+
+static _Noreturn void CanSpamSlowTransmitter_Thread(tCanSpamSlowTransmitter *env) {
+ for (;;) {
+
+ SystemDelayMs(500);
+
+ if (env->isMute == false) {
+
+ if (osMutexAcquire(env->access, 5000) == osOK) {
+
+ env->timeMs += 500;
+
+ while (isEventSlowTransmitter(env) != event_CCU_none) {
+ sendEventSlowToCan(env);
+ }
+
+
+ osMutexRelease(env->access);
+ } else {
+ LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error CanSpamSlowTransmitter_Thread");
+ }
+
+ }
+ }
+}
+
+void CanSpamSlowTransmitter_StartThread(tCanSpamSlowTransmitter *env) {
+ if (!env->thread.id) {
+ env->thread.id = osThreadNew((osThreadFunc_t) (CanSpamSlowTransmitter_Thread), (void *) (env), &env->thread.attr);
+ }
+}
+
diff --git a/CanSpamTransmitter.h b/CanSpamTransmitter.h
index a69d8b4..d40cde8 100644
--- a/CanSpamTransmitter.h
+++ b/CanSpamTransmitter.h
@@ -11,6 +11,7 @@
#include "LoggerInterface.h"
#define SPAM_CAN_HANDLER 0
+#define SPAM_SLOW_CAN_HANDLER 2
#define CCU_Stat1_SEND 1
#define CCU_Stat2_SEND 1
@@ -26,7 +27,6 @@
#define CU_AC_Ctrl_SEND 0
-
typedef enum {
event_CCU_none = 0x00,
event_CCU_Stat1_CYC = 0x01,
@@ -55,18 +55,18 @@ typedef struct {
uint32_t time_CCU_Stat1_CYC;
uint32_t time_CCU_Stat2_CYC;
uint32_t time_CCU_Stat3_CYC;
- uint32_t time_CCU_Errors_CYC;
+// uint32_t time_CCU_Errors_CYC;
uint32_t time_CCU_Requests;
uint32_t time_CCU_HVC_Req_Msg;
uint32_t time_CCU_VCU_Msg1;
uint32_t time_CCU_VCU_Msg2;
uint32_t time_CCU_Msg1;
- uint32_t time_CCU_Msg3;
+// uint32_t time_CCU_Msg3;
uint32_t time_CCU_AC_Ctrl;
uint8_t CCU_HVC_Req_Msg_CCU_HVC_Req_RC;
uint8_t CCU_Msg1_CCU_MSG1_RC;
- uint8_t CCU_Msg3_CCU_MSG3_RC;
+// uint8_t CCU_Msg3_CCU_MSG3_RC;
bool isMute;
@@ -83,7 +83,8 @@ typedef struct {
} tCanSpamTransmitter;
-void CanSpamTransmitter_Init(tCanSpamTransmitter *env, tSerialPortFrameIO *ioCanFrame, osMutexId_t modelTaskAccess, tLoggerInterface *logger);
+void CanSpamTransmitter_Init(tCanSpamTransmitter *env, tSerialPortFrameIO *ioCanFrame, osMutexId_t modelTaskAccess,
+ tLoggerInterface *logger);
void CanSpamTransmitter_StartThread(tCanSpamTransmitter *env);
@@ -91,4 +92,48 @@ void set_CanSpamTransmitter(tCanSpamTransmitter *env);
void set_CCU_Mute(tCanSpamTransmitter *env, bool mute);
+
+
+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_CCU_Errors_CYC;
+ uint32_t time_CCU_Msg3;
+
+ uint8_t CCU_Msg3_CCU_MSG3_RC;
+
+ bool isMute;
+
+ osMutexId_t modelTaskAccess;
+
+ tLoggerInterface *logger;
+
+ struct {
+ osThreadId_t id;
+ uint32_t stack[384];
+ StaticTask_t controlBlock;
+ osThreadAttr_t attr;
+ } thread;
+
+} tCanSpamSlowTransmitter;
+
+
+void CanSpamSlowTransmitter_Init(tCanSpamSlowTransmitter *env, tSerialPortFrameIO *ioCanFrame, osMutexId_t modelTaskAccess,
+ tLoggerInterface *logger);
+
+void CanSpamSlowTransmitter_StartThread(tCanSpamSlowTransmitter *env);
+
+void set_CanSpamSlowTransmitter(tCanSpamSlowTransmitter *env);
+
+void set_CCU_Slow_Mute(tCanSpamSlowTransmitter *env, bool mute);
+
+
#endif //HVAC_M7_CANSPAMTRANSMITTER_H