Добавлена работа с DTC и фильтрация CAN сообщений

This commit is contained in:
cfif 2026-10-01 16:02:08 +03:00
parent 24a5968d22
commit b24a008298
5 changed files with 139 additions and 95 deletions

View File

@ -63,12 +63,15 @@ typedef struct {
bool reInitOne; bool reInitOne;
uint8_t CountHardSoftFilter_RX; uint8_t CountHardFilter_RX;
uint8_t CountSoftFilter_RX;
FLEXCAN_BaudType canBaudRate; FLEXCAN_BaudType canBaudRate;
uint32_t g_u32RxDataIndex; uint32_t g_u32RxDataIndex;
FLEXCAN_RxMbFilterType pRxMbFilterSoftList[32];
FLEXCAN_RxMbFilterType pRxMbFilterList[32]; FLEXCAN_RxMbFilterType pRxMbFilterList[32];
FLEXCAN_RxMbFilterType pRxFilterFifoList[32]; FLEXCAN_RxMbFilterType pRxFilterFifoList[32];
@ -88,7 +91,8 @@ typedef struct {
uint8_t DMA_BUF_LEN_RX; uint8_t DMA_BUF_LEN_RX;
uint8_t pBufCounter; uint8_t pBufCounter;
FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX; FilterTo_FLEXCAN_RxMbFilterType *IdHardFilter_RX;
FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX;
can_rx_message_type rx_message_struct; can_rx_message_type rx_message_struct;
@ -115,8 +119,11 @@ bool vCanSerialPortFrameDMAInit(
const uint8_t *DMA_BUF_RX, const uint8_t *DMA_BUF_RX,
uint8_t DMA_BUF_LEN_RX, uint8_t DMA_BUF_LEN_RX,
const FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX, const FilterTo_FLEXCAN_RxMbFilterType *IdHardFilter_RX,
uint8_t CountHardSoftFilter_RX, uint8_t CountHardFilter_RX,
const FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX,
uint8_t CountSoftFilter_RX,
const FLEXCAN_RxMbFilterType *IdFilterFifo_RX, const FLEXCAN_RxMbFilterType *IdFilterFifo_RX,
uint8_t CountFilterFifo_RX, uint8_t CountFilterFifo_RX,
@ -144,8 +151,11 @@ bool vCanSerialPortFrameMbInit(
IRQn_Type IRQ_CAN, // FlexCAN0_IRQn ... FlexCAN3_IRQn IRQn_Type IRQ_CAN, // FlexCAN0_IRQn ... FlexCAN3_IRQn
uint8 CAN_PRIORITY, uint8 CAN_PRIORITY,
const FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX, const FilterTo_FLEXCAN_RxMbFilterType *IdHardFilter_RX,
uint8_t CountHardSoftFilter_RX, uint8_t CountHardFilter_RX,
const FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX,
uint8_t CountSoftFilter_RX,
FLEXCAN_BaudType canBaudRate, FLEXCAN_BaudType canBaudRate,
FLEXCAN_IdType canTypeFrame, FLEXCAN_IdType canTypeFrame,

View File

@ -80,8 +80,11 @@ bool vCanSerialPortFrameDMAInit(
const uint8_t *DMA_BUF_RX, const uint8_t *DMA_BUF_RX,
uint8_t DMA_BUF_LEN_RX, uint8_t DMA_BUF_LEN_RX,
const FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX, const FilterTo_FLEXCAN_RxMbFilterType *IdHardFilter_RX,
uint8_t CountHardSoftFilter_RX, uint8_t CountHardFilter_RX,
const FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX,
uint8_t CountSoftFilter_RX,
const FLEXCAN_RxMbFilterType *IdFilterFifo_RX, const FLEXCAN_RxMbFilterType *IdFilterFifo_RX,
uint8_t CountFilterFifo_RX, uint8_t CountFilterFifo_RX,
@ -105,8 +108,10 @@ bool vCanSerialPortFrameDMAInit(
env->can = CANx; env->can = CANx;
env->CAN_INDEX = CAN_INDEX; env->CAN_INDEX = CAN_INDEX;
env->DMA_BUF_LEN_RX = DMA_BUF_LEN_RX; env->DMA_BUF_LEN_RX = DMA_BUF_LEN_RX;
env->IdHardSoftFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *) IdHardSoftFilter_RX; env->IdHardFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *) IdHardFilter_RX;
env->CountHardSoftFilter_RX = CountHardSoftFilter_RX; env->IdSoftFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *) IdSoftFilter_RX;
env->CountHardFilter_RX = CountHardFilter_RX;
env->CountSoftFilter_RX = CountSoftFilter_RX;
env->canBaudRate = canBaudRate; env->canBaudRate = canBaudRate;
env->IRQ_CAN = IRQ_CAN; env->IRQ_CAN = IRQ_CAN;
@ -306,8 +311,11 @@ bool vCanSerialPortFrameMbInit(
IRQn_Type IRQ_CAN, // FlexCAN0_IRQn ... FlexCAN3_IRQn IRQn_Type IRQ_CAN, // FlexCAN0_IRQn ... FlexCAN3_IRQn
uint8 CAN_PRIORITY, uint8 CAN_PRIORITY,
const FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX, const FilterTo_FLEXCAN_RxMbFilterType *IdHardFilter_RX,
uint8_t CountHardSoftFilter_RX, uint8_t CountHardFilter_RX,
const FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX,
uint8_t CountSoftFilter_RX,
FLEXCAN_BaudType canBaudRate, FLEXCAN_BaudType canBaudRate,
FLEXCAN_IdType canTypeFrame, FLEXCAN_IdType canTypeFrame,
@ -323,8 +331,13 @@ bool vCanSerialPortFrameMbInit(
env->can = CANx; env->can = CANx;
env->CAN_INDEX = CAN_INDEX; env->CAN_INDEX = CAN_INDEX;
// env->DMA_BUF_LEN_RX = DMA_BUF_LEN_RX; // env->DMA_BUF_LEN_RX = DMA_BUF_LEN_RX;
env->IdHardSoftFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *) IdHardSoftFilter_RX;
env->CountHardSoftFilter_RX = CountHardSoftFilter_RX; env->IdHardFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *) IdHardFilter_RX;
env->IdSoftFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *) IdSoftFilter_RX;
env->CountHardFilter_RX = CountHardFilter_RX;
env->CountSoftFilter_RX = CountSoftFilter_RX;
env->canBaudRate = canBaudRate; env->canBaudRate = canBaudRate;
env->IRQ_CAN = IRQ_CAN; env->IRQ_CAN = IRQ_CAN;
@ -371,14 +384,14 @@ bool vCanSerialPortFrameMbInit(
if (tRetVal == FLEXCAN_ERROR_OK) { if (tRetVal == FLEXCAN_ERROR_OK) {
for (uint8_t i = 0; i < CountHardSoftFilter_RX; ++i) { for (uint8_t i = 0; i < CountHardFilter_RX; ++i) {
env->pRxMbFilterList[i].eRxFrameType = IdHardSoftFilter_RX[i].eRxFrameType; env->pRxMbFilterList[i].eRxFrameType = IdHardFilter_RX[i].eRxFrameType;
env->pRxMbFilterList[i].u32RxCanId = IdHardSoftFilter_RX[i].u32RxCanId; env->pRxMbFilterList[i].u32RxCanId = IdHardFilter_RX[i].u32RxCanId;
env->pRxMbFilterList[i].u32RxCanIdMask = IdHardSoftFilter_RX[i].u32RxCanIdMask; env->pRxMbFilterList[i].u32RxCanIdMask = IdHardFilter_RX[i].u32RxCanIdMask;
} }
env->tMbCfg.pRxFilterMBList = env->pRxMbFilterList; env->tMbCfg.pRxFilterMBList = env->pRxMbFilterList;
env->tMbCfg.u8RxFilterMBCnt = CountHardSoftFilter_RX; env->tMbCfg.u8RxFilterMBCnt = CountHardFilter_RX;
env->tMbCfg.pRxFilterFifoList = NULL; env->tMbCfg.pRxFilterFifoList = NULL;
env->tMbCfg.u8RxFilterFifoCnt = 0; env->tMbCfg.u8RxFilterFifoCnt = 0;
@ -489,15 +502,15 @@ bool vCanSerialPortSetMaskCount(tCanSerialPortFrameFlagchip *env, uint8_t maskCo
// Обновляем список фильтров в рабочем буфере (первые maskCount элементов) // Обновляем список фильтров в рабочем буфере (первые maskCount элементов)
for (i = 0; i < maskCount; i++) { for (i = 0; i < maskCount; i++) {
env->pRxMbFilterList[i].eRxFrameType = env->IdHardSoftFilter_RX[i].eRxFrameType; env->pRxMbFilterList[i].eRxFrameType = env->IdHardFilter_RX[i].eRxFrameType;
env->pRxMbFilterList[i].u32RxCanId = env->IdHardSoftFilter_RX[i].u32RxCanId; env->pRxMbFilterList[i].u32RxCanId = env->IdHardFilter_RX[i].u32RxCanId;
env->pRxMbFilterList[i].u32RxCanIdMask = env->IdHardSoftFilter_RX[i].u32RxCanIdMask; env->pRxMbFilterList[i].u32RxCanIdMask = env->IdHardFilter_RX[i].u32RxCanIdMask;
} }
for (i = maskCount; i < 32; i++) { for (i = maskCount; i < 32; i++) {
env->pRxMbFilterList[i].eRxFrameType = env->IdHardSoftFilter_RX[0].eRxFrameType; env->pRxMbFilterList[i].eRxFrameType = env->IdHardFilter_RX[0].eRxFrameType;
env->pRxMbFilterList[i].u32RxCanId = env->IdHardSoftFilter_RX[0].u32RxCanId; env->pRxMbFilterList[i].u32RxCanId = env->IdHardFilter_RX[0].u32RxCanId;
env->pRxMbFilterList[i].u32RxCanIdMask = env->IdHardSoftFilter_RX[0].u32RxCanIdMask; env->pRxMbFilterList[i].u32RxCanIdMask = env->IdHardFilter_RX[0].u32RxCanIdMask;
} }
@ -573,12 +586,12 @@ void CanSerialPortFrameIrqRxProcessingNO_DMA(tCanSerialPortFrameFlagchip *env, F
// Быстрый поиск по ID (можно использовать switch или бинарный поиск) // Быстрый поиск по ID (можно использовать switch или бинарный поиск)
uint8_t filter_index = 0xFF; uint8_t filter_index = 0xFF;
const uint8_t count = env->CountHardSoftFilter_RX; const uint8_t count = env->CountSoftFilter_RX;
// Линейный поиск ID // Линейный поиск ID
for (uint8_t i = 0; i < count; i++) { for (uint8_t i = 0; i < count; i++) {
if (rx_id == env->IdHardSoftFilter_RX[i].u32RxCanId) { if (rx_id == env->IdSoftFilter_RX[i].u32RxCanId) {
filter_index = env->IdHardSoftFilter_RX[i].filter; filter_index = env->IdSoftFilter_RX[i].filter;
pMsg->filter_index = filter_index; pMsg->filter_index = filter_index;
if (i > 2) { if (i > 2) {
@ -619,23 +632,23 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_
uint8_t index = 0xFF; uint8_t index = 0xFF;
for (uint8_t i = 0; i < env->CountHardSoftFilter_RX; ++i) { for (uint8_t i = 0; i < env->CountSoftFilter_RX; ++i) {
if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) &&
(env->IdHardSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) { (env->IdSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) {
if (env->rx_message_struct.standard_id == env->IdHardSoftFilter_RX[i].u32RxCanId) { if (env->rx_message_struct.standard_id == env->IdSoftFilter_RX[i].u32RxCanId) {
env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter; env->rx_message_struct.filter_index = env->IdSoftFilter_RX[i].filter;
index = i; index = i;
break; break;
} }
} else { } else {
if (env->rx_message_struct.extended_id == env->IdHardSoftFilter_RX[i].u32RxCanId) { if (env->rx_message_struct.extended_id == env->IdSoftFilter_RX[i].u32RxCanId) {
if (env->rx_message_struct.extended_id == env->IdHardSoftFilter_RX[i].u32RxCanId) { if (env->rx_message_struct.extended_id == env->IdSoftFilter_RX[i].u32RxCanId) {
env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter; env->rx_message_struct.filter_index = env->IdSoftFilter_RX[i].filter;
index = i; index = i;
break; break;
} }
@ -659,11 +672,11 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_
REV_BYTES_32(pSrc[u8Index], pDest[u8Index]); REV_BYTES_32(pSrc[u8Index], pDest[u8Index]);
} }
CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, env->IdHardSoftFilter_RX[index].filter); CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, env->IdSoftFilter_RX[index].filter);
} }
if (env->CountHardSoftFilter_RX == 0) { if (env->CountSoftFilter_RX == 0) {
// message buffer 3th word // message buffer 3th word
uint32_t *pSrc = (uint32_t * )FLEXCAN_MB_WORDN_ADDR(&pBuf[env->pBufCounter << 2], 0U, 8U, 8U); uint32_t *pSrc = (uint32_t * )FLEXCAN_MB_WORDN_ADDR(&pBuf[env->pBufCounter << 2], 0U, 8U, 8U);
uint32_t *pDest = (uint32_t * ) & env->rx_message_struct.data[0]; uint32_t *pDest = (uint32_t * ) & env->rx_message_struct.data[0];

View File

@ -2622,21 +2622,6 @@ static const eUds_com uds_com[256] = {
{NULL, "", false}, {NULL, "", false},
{NULL, "", false}, {NULL, "", false},
{NULL, "", false}, {NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{ControlDTCSetting_85, "ControlDTCSetting_85", true}, {ControlDTCSetting_85, "ControlDTCSetting_85", true},
{NULL, "", false}, {NULL, "", false},
{NULL, "", false}, {NULL, "", false},
@ -2735,6 +2720,21 @@ static const eUds_com uds_com[256] = {
{NULL, "", false}, {NULL, "", false},
{NULL, "", false}, {NULL, "", false},
{NULL, "", false}, {NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false},
{NULL, "", false} {NULL, "", false}
}; };

View File

@ -164,9 +164,9 @@ const FilterTo_FLEXCAN_RxMbFilterType IdCanHardSoftFilterCan0[countIdCanHardSoft
}; };
*/ */
/*
#define countIdCanHardSoftFilterCan0 (28) #define countIdCanSoftFilterCan0 (28)
const FilterTo_FLEXCAN_RxMbFilterType IdCanHardSoftFilterCan0[countIdCanHardSoftFilterCan0] = { const FilterTo_FLEXCAN_RxMbFilterType IdCanSoftFilterCan0[countIdCanSoftFilterCan0] = {
{FLEXCAN_ID_STD, Diag_To_CCU_CANID, 0x7FF, PROTOCOL_CAN_UDS}, {FLEXCAN_ID_STD, Diag_To_CCU_CANID, 0x7FF, PROTOCOL_CAN_UDS},
{FLEXCAN_ID_STD, Diag_Functional_CANID, 0x7FF, PROTOCOL_CAN_UDS}, {FLEXCAN_ID_STD, Diag_Functional_CANID, 0x7FF, PROTOCOL_CAN_UDS},
{FLEXCAN_ID_STD, EMS_Veh_CANID, 0x7FF, PROTOCOL_CAN_RAW}, {FLEXCAN_ID_STD, EMS_Veh_CANID, 0x7FF, PROTOCOL_CAN_RAW},
@ -200,11 +200,11 @@ const FilterTo_FLEXCAN_RxMbFilterType IdCanHardSoftFilterCan0[countIdCanHardSoft
{FLEXCAN_ID_STD, FIU_CCU3_CANID, 0x7FF, PROTOCOL_CAN_RAW}, {FLEXCAN_ID_STD, FIU_CCU3_CANID, 0x7FF, PROTOCOL_CAN_RAW},
{FLEXCAN_ID_STD, ESC_04_CANID, 0x7FF, PROTOCOL_CAN_RAW} {FLEXCAN_ID_STD, ESC_04_CANID, 0x7FF, PROTOCOL_CAN_RAW}
}; };
*/
#define countIdCanHardSoftFilterCan0 (22)
const FilterTo_FLEXCAN_RxMbFilterType IdCanHardSoftFilterCan0[countIdCanHardSoftFilterCan0] = { #define countIdCanHardFilterCan0 (22)
const FilterTo_FLEXCAN_RxMbFilterType IdCanHardFilterCan0[countIdCanHardFilterCan0] = {
// UDS диагностика // UDS диагностика
{FLEXCAN_ID_STD, Diag_To_CCU_CANID, 0x7FF, PROTOCOL_CAN_UDS}, {FLEXCAN_ID_STD, Diag_To_CCU_CANID, 0x7FF, PROTOCOL_CAN_UDS},
{FLEXCAN_ID_STD, Diag_Functional_CANID, 0x7FF, PROTOCOL_CAN_UDS}, {FLEXCAN_ID_STD, Diag_Functional_CANID, 0x7FF, PROTOCOL_CAN_UDS},
@ -260,13 +260,19 @@ const FLEXCAN_RxMbFilterType IdCanFilterFifoCan0[countIdCanFilterFifoCan0] = {
#endif #endif
*/ */
#define countIdCanHardSoftFilterCan1 2 #define countIdCanSoftFilterCan1 2
const FilterTo_FLEXCAN_RxMbFilterType IdCanHardSoftFilterCan1[countIdCanHardSoftFilterCan1] = { const FilterTo_FLEXCAN_RxMbFilterType IdCanSoftFilterCan1[countIdCanSoftFilterCan1] = {
{FLEXCAN_ID_STD, XCP_CCU_RX_CANID, 0x7FF, PROTOCOL_CAN_XCP}, {FLEXCAN_ID_STD, XCP_CCU_RX_CANID, 0x7FF, PROTOCOL_CAN_XCP},
{FLEXCAN_ID_STD, dbg_Cmd_Act_Information_CANID, 0x7FF, PROTOCOL_CAN_RAW} {FLEXCAN_ID_STD, dbg_Cmd_Act_Information_CANID, 0x7FF, PROTOCOL_CAN_RAW}
}; };
#define countIdCanHardFilterCan1 2
const FilterTo_FLEXCAN_RxMbFilterType IdCanHardFilterCan1[countIdCanHardFilterCan1] = {
{FLEXCAN_ID_STD, XCP_CCU_RX_CANID, 0x7FF, PROTOCOL_CAN_XCP},
{FLEXCAN_ID_STD, dbg_Cmd_Act_Information_CANID, 0x7FF, PROTOCOL_CAN_RAW}
};
#if (CAN_DMA_EN == 1) #if (CAN_DMA_EN == 1)
#define countIdCanFilterFifoCan1 1 #define countIdCanFilterFifoCan1 1
const FLEXCAN_RxMbFilterType IdCanFilterFifoCan1[countIdCanFilterFifoCan1] = { const FLEXCAN_RxMbFilterType IdCanFilterFifoCan1[countIdCanFilterFifoCan1] = {
@ -324,8 +330,11 @@ bool vCanPort_InitCan0() {
FlexCAN0_IRQn, // // FlexCAN0_IRQn ... FlexCAN3_IRQn FlexCAN0_IRQn, // // FlexCAN0_IRQn ... FlexCAN3_IRQn
0xFF, 0xFF,
IdCanHardSoftFilterCan0, IdCanHardFilterCan0,
countIdCanHardSoftFilterCan0, countIdCanHardFilterCan0,
IdCanSoftFilterCan0,
countIdCanSoftFilterCan0,
FLEXCAN_BAUD_500K, FLEXCAN_BAUD_500K,
@ -428,9 +437,11 @@ bool vCanPort_InitCan1() {
FlexCAN1_IRQn, // // FlexCAN0_IRQn ... FlexCAN3_IRQn FlexCAN1_IRQn, // // FlexCAN0_IRQn ... FlexCAN3_IRQn
0xFF, 0xFF,
IdCanHardSoftFilterCan1, IdCanHardFilterCan1,
countIdCanHardSoftFilterCan1, countIdCanHardFilterCan1,
IdCanSoftFilterCan1,
countIdCanSoftFilterCan1,
FLEXCAN_BAUD_500K, FLEXCAN_BAUD_500K,
FLEXCAN_ID_STD, FLEXCAN_ID_STD,

View File

@ -97,16 +97,16 @@ const char *DTC_Error_Code_Strings[COUNT_DTC_CODE_ERROR] = {
"DTC_SEALING_VALVE_GATE_POSITION_NOT_REACHED", // 0xA09204 "DTC_SEALING_VALVE_GATE_POSITION_NOT_REACHED", // 0xA09204
"DTC_BODY_CAN_BUS_OFF", // 0xC02888 "DTC_BODY_CAN_BUS_OFF", // 0xC02888
"DTC_HVAC_CAN_BUS_OFF", // 0xC03788 "DTC_HVAC_CAN_BUS_OFF", // 0xC03788
"DTC_LOST_COMM_ECM_PCM", // 0xC10087 "DTC_LOST_COMM_ECM_PCM (EMS/VCU)", // 0xC10087
"DTC_LOST_COMM_ESP", // 0xC12287 "DTC_LOST_COMM_ESP (ESP)", // 0xC12287
"DTC_LOST_COMM_BCM", // 0xC14187 "DTC_LOST_COMM_BCM (BCM)", // 0xC14187
"DTC_LOST_COMM_AC_COMPRESSOR", // 0xC16B87 "DTC_LOST_COMM_AC_COMPRESSOR (HVC)", // 0xC16B87
"DTC_LOST_COMM_DOOR_MODULE_A_DMFL", // 0xC19987 "DTC_LOST_COMM_DOOR_MODULE_A_DMFL (DMFL)", // 0xC19987
"DTC_LOST_COMM_DOOR_MODULE_B_DMFR", // 0xC20087 "DTC_LOST_COMM_DOOR_MODULE_B_DMFR (DMFR)", // 0xC20087
"DTC_LOST_COMM_SEAT_MODULE_A_SMFL", // 0xC20887 "DTC_LOST_COMM_SEAT_MODULE_A_SMFL (SMFL)", // 0xC20887
"DTC_LOST_COMM_SEAT_MODULE_B_SMFR", // 0xC20987 "DTC_LOST_COMM_SEAT_MODULE_B_SMFR (SMFR)", // 0xC20987
"DTC_LOST_COMM_SEAT_MODULE_C_SMRL", // 0xC21087 "DTC_LOST_COMM_SEAT_MODULE_C_SMRL (SMRL)", // 0xC21087
"DTC_LOST_COMM_SEAT_MODULE_D_SMRR", // 0xC21187 "DTC_LOST_COMM_SEAT_MODULE_D_SMRR (SMRR)", // 0xC21187
"DTC_LOST_COMM_TRUNK_CCPF_CCPR", // 0xE2A187 "DTC_LOST_COMM_TRUNK_CCPF_CCPR", // 0xE2A187
"DTC_LOST_COMM_CGW", // 0xE2A287 "DTC_LOST_COMM_CGW", // 0xE2A287
"DTC_LOST_COMM_DEFROSTER_GATE", // 0xE23087 "DTC_LOST_COMM_DEFROSTER_GATE", // 0xE23087
@ -306,8 +306,8 @@ uint32_t diagnostic_UDS_ReadDTCSupportDTC_19_dtc(tDiagnostic *env, tDiagnosticDT
void set_NoBitsDTC(tDiagnostic *env, bool noBitsDTC) { void set_NoBitsDTC(tDiagnostic *env, bool noBitsDTC) {
if (osMutexAcquire(env->access, 5000) == osOK) { if (osMutexAcquire(env->access, 5000) == osOK) {
env->isNoBitsDTC = noBitsDTC;
memcpy(dtc_state_FIX_error, dtc_state_error, sizeof(dtc_state_error)); memcpy(dtc_state_FIX_error, dtc_state_error, sizeof(dtc_state_error));
env->isNoBitsDTC = noBitsDTC;
osMutexRelease(env->access); osMutexRelease(env->access);
} else { } else {
@ -372,7 +372,8 @@ setErrorDTC_CAN(tDiagnostic *env, uint8_t *dtc_state_error_model, ccu_candb_erro
} }
// U010087 (EMS/VCU) - 0x298 OR 0x150 OR 0x153 - OK // U010087 (EMS/VCU) - 0x298 OR 0x150 OR 0x153 - OK
if ((CAN_ERROR_MISSLE->EMS_HVC_Req_Msg) || (CAN_ERROR_MISSLE->EMS_Veh) || (CAN_ERROR_MISSLE->EMS_Veh_02) || (time > timeCanSpamReceiver)) { if ((CAN_ERROR_MISSLE->EMS_HVC_Req_Msg) || (CAN_ERROR_MISSLE->EMS_Veh) || (CAN_ERROR_MISSLE->EMS_Veh_02) ||
(time > timeCanSpamReceiver)) {
dtc_state_error_model[DTC_LOST_COMM_ECM_PCM] = DTC_TEST_FAILED_CONFIRMED; dtc_state_error_model[DTC_LOST_COMM_ECM_PCM] = DTC_TEST_FAILED_CONFIRMED;
} else { } else {
dtc_state_error_model[DTC_LOST_COMM_ECM_PCM] = dtc_state_error[DTC_LOST_COMM_ECM_PCM] & (~(DTC_TEST_FAILED)); dtc_state_error_model[DTC_LOST_COMM_ECM_PCM] = dtc_state_error[DTC_LOST_COMM_ECM_PCM] & (~(DTC_TEST_FAILED));
@ -386,14 +387,16 @@ setErrorDTC_CAN(tDiagnostic *env, uint8_t *dtc_state_error_model, ccu_candb_erro
} }
// U014187 (BCM) - 0x365 OR 0x157 OR 0x152 OR 0x280 OR 0x51A - OK // U014187 (BCM) - 0x365 OR 0x157 OR 0x152 OR 0x280 OR 0x51A - OK
if ((CAN_ERROR_MISSLE->BCM_CLIMATIC_DATA) || (CAN_ERROR_MISSLE->BCM_EEM) || (CAN_ERROR_MISSLE->BCM_Powertrain) || (CAN_ERROR_MISSLE->BCM_VEH_STATE) || (CAN_ERROR_MISSLE->VEH_VIN) || (time > timeCanSpamReceiver)) { if ((CAN_ERROR_MISSLE->BCM_CLIMATIC_DATA) || (CAN_ERROR_MISSLE->BCM_EEM) || (CAN_ERROR_MISSLE->BCM_Powertrain) ||
(CAN_ERROR_MISSLE->BCM_VEH_STATE) || (CAN_ERROR_MISSLE->VEH_VIN) || (time > timeCanSpamReceiver)) {
dtc_state_error_model[DTC_LOST_COMM_BCM] = DTC_TEST_FAILED_CONFIRMED; dtc_state_error_model[DTC_LOST_COMM_BCM] = DTC_TEST_FAILED_CONFIRMED;
} else { } else {
dtc_state_error_model[DTC_LOST_COMM_BCM] = dtc_state_error[DTC_LOST_COMM_BCM] & (~(DTC_TEST_FAILED)); dtc_state_error_model[DTC_LOST_COMM_BCM] = dtc_state_error[DTC_LOST_COMM_BCM] & (~(DTC_TEST_FAILED));
} }
// U016B87 (HVC) - 0x25A OR 0x305 - OK // U016B87 (HVC) - 0x25A OR 0x305 - OK
if ((CAN_ERROR_MISSLE->HVC_CCU_Status_Msg) || (CAN_ERROR_MISSLE->HVC_Err_Status_Msg) || (time > timeCanSpamReceiver)) { if ((CAN_ERROR_MISSLE->HVC_CCU_Status_Msg) || (CAN_ERROR_MISSLE->HVC_Err_Status_Msg) ||
(time > timeCanSpamReceiver)) {
dtc_state_error_model[DTC_LOST_COMM_AC_COMPRESSOR] = DTC_TEST_FAILED_CONFIRMED; dtc_state_error_model[DTC_LOST_COMM_AC_COMPRESSOR] = DTC_TEST_FAILED_CONFIRMED;
} else { } else {
dtc_state_error_model[DTC_LOST_COMM_AC_COMPRESSOR] = dtc_state_error_model[DTC_LOST_COMM_AC_COMPRESSOR] =
@ -450,8 +453,9 @@ setErrorDTC_CAN(tDiagnostic *env, uint8_t *dtc_state_error_model, ccu_candb_erro
} }
static void static void
setErrorDTC_LIN(uint8_t *dtc_state_error_model, const uint8_t *LIN1_ERROR_MISSING, const uint8_t *LIN2_ERROR_MISSING, const uint8_t setErrorDTC_LIN(uint8_t *dtc_state_error_model, const uint8_t *LIN1_ERROR_MISSING, const uint8_t *LIN2_ERROR_MISSING,
*LIN3_ERROR_MISSING, const uint8_t *LIN4_ERROR_MISSING, const uint8_t *LIN5_ERROR_MISSING) { const uint8_t
*LIN3_ERROR_MISSING, const uint8_t *LIN4_ERROR_MISSING, const uint8_t *LIN5_ERROR_MISSING) {
for (uint8_t i = 0; i < 9; ++i) { for (uint8_t i = 0; i < 9; ++i) {
if (LIN1_ERROR_MISSING[i]) { if (LIN1_ERROR_MISSING[i]) {
@ -512,11 +516,14 @@ void set_Dtc_state(tDiagnostic *env, CCU_Errors_t *CCU_Errors,
if (env->isCleanDTC) { if (env->isCleanDTC) {
env->isCleanDTC = false; env->isCleanDTC = false;
memset(dtc_state_FIX_error, 0, sizeof(dtc_state_FIX_error));
memset(dtc_state_error, 0, sizeof(dtc_state_error)); memset(dtc_state_error, 0, sizeof(dtc_state_error));
} }
if (env->isNoBitsDTC == true) {
osMutexRelease(env->access);
return;
}
for (uint8_t i = 0; i < COUNT_DTC_CODE_ERROR; ++i) { for (uint8_t i = 0; i < COUNT_DTC_CODE_ERROR; ++i) {
if (dtc_state_error_model[i]) { if (dtc_state_error_model[i]) {
@ -526,7 +533,8 @@ void set_Dtc_state(tDiagnostic *env, CCU_Errors_t *CCU_Errors,
} }
} }
setErrorDTC_LIN(dtc_state_error_model, LIN1_ERROR_MISSING, LIN2_ERROR_MISSING, LIN3_ERROR_MISSING, LIN4_ERROR_MISSING, LIN5_ERROR_MISSING); setErrorDTC_LIN(dtc_state_error_model, LIN1_ERROR_MISSING, LIN2_ERROR_MISSING, LIN3_ERROR_MISSING,
LIN4_ERROR_MISSING, LIN5_ERROR_MISSING);
setErrorDTC_CAN_VIN(dtc_state_error_model, CAN_ERROR_MISSING, VIN, CCU_Errors); setErrorDTC_CAN_VIN(dtc_state_error_model, CAN_ERROR_MISSING, VIN, CCU_Errors);
// Если не было изначально сообщений // Если не было изначально сообщений
@ -538,6 +546,8 @@ void set_Dtc_state(tDiagnostic *env, CCU_Errors_t *CCU_Errors,
// dtc_state_error_model[DTC_REAR_HVAC_AROMA_CONFIG_INVALID] = dtc_state_error[DTC_REAR_HVAC_AROMA_CONFIG_INVALID] & (~(DTC_TEST_FAILED)); // dtc_state_error_model[DTC_REAR_HVAC_AROMA_CONFIG_INVALID] = dtc_state_error[DTC_REAR_HVAC_AROMA_CONFIG_INVALID] & (~(DTC_TEST_FAILED));
// } // }
if (memcmp(dtc_state_error, dtc_state_error_model, sizeof(dtc_state_error)) != 0) { if (memcmp(dtc_state_error, dtc_state_error_model, sizeof(dtc_state_error)) != 0) {
bool isDTC_FileWrite = false; bool isDTC_FileWrite = false;