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