// // Created by cfif on 05.04.2024. // #include #include "CanSpamReceiver.h" #include "CmsisRtosThreadUtils.h" #include "CanPorts.h" #include "string.h" #include "HVAC_model.h" #define LOG_SIGN "CAN_RECEIVED" #define LOGGER env->logger void CanSpamReceiver_Init(tCanSpamReceiver *env, tSerialPortFrameIO *ioCanFrame, tLoggerInterface *logger) { env->ioCanFrame = ioCanFrame; env->logger = logger; env->access = osMutexNew(NULL); InitThreadAtrStatic(&env->thread.attr, "CanSpamRec", env->thread.controlBlock, env->thread.stack, osPriorityNormal); } static void ListenCanSpamReceiver(tCanSpamReceiver *env) { uint16_t recv = env->ioCanFrame->receive(env->ioCanFrame->env, PROTOCOL_CAN_RAW, (uint8_t *) &env->canFrame, 1, 1000); if (recv == 0) return; if (osMutexAcquire(env->access, 5000) == osOK) { uint32_t id = env->canFrame.standard_id; if (env->canFrame.id_type == FLEXCAN_ID_EXT) { id = env->canFrame.extended_id; } uint32_t result = ccu_candb_Receive(&ccu_candb_rx, env->canFrame.data, id, env->canFrame.dlc); osMutexRelease(env->access); } else { LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error ListenCanSpamReceiver"); } } void get_CanSpamReceiver(tCanSpamReceiver *env) { if (osMutexAcquire(env->access, 5000) == osOK) { memcpy(&rtDW.FIU_CCU1_MODEL, &ccu_candb_rx.FIU_CCU1, sizeof(rtDW.FIU_CCU1_MODEL)); memcpy(&rtDW.FIU_CCU2_MODEL, &ccu_candb_rx.FIU_CCU2, sizeof(rtDW.FIU_CCU2_MODEL)); memcpy(&rtDW.CCUCAN_BCM_Powertrain_model, &ccu_candb_rx.BCM_Powertrain, sizeof(rtDW.CCUCAN_BCM_Powertrain_model)); memcpy(&rtDW.CCUCAN_EMS_Veh_model, &ccu_candb_rx.EMS_Veh, sizeof(rtDW.CCUCAN_EMS_Veh_model)); memcpy(&rtDW.CCUCAN_ESC_04_model, &ccu_candb_rx.ESC_04, sizeof(rtDW.CCUCAN_ESC_04_model)); osMutexRelease(env->access); } else { LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error get_CanSpamReceiver"); } } static _Noreturn void CanSpamReceiver_Thread(tCanSpamReceiver *env) { for (;;) { ListenCanSpamReceiver(env); } } void CanSpamReceiver_StartThread(tCanSpamReceiver *env) { if (!env->thread.id) { env->thread.id = osThreadNew((osThreadFunc_t) (CanSpamReceiver_Thread), (void *) (env), &env->thread.attr); } }