diff --git a/Inc/CanSerialPortFrameXCP.h b/Inc/CanSerialPortFrameXCP.h index b3b6634..c5c4dae 100644 --- a/Inc/CanSerialPortFrameXCP.h +++ b/Inc/CanSerialPortFrameXCP.h @@ -210,16 +210,28 @@ typedef struct __attribute__ ((packed)) { } eXcpCommand_SET_DAQ_PTR; #define MAX_DAO 1 -#define MAX_ODT 50 -#define MAX_ODT_ENTRIES_SIZE 14 +#define MAX_ODT 60 +#define MAX_ODT_ENTRIES_SIZE 16 typedef struct { + uint8_t ODT_ENTRIES_COUNT; uint8_t ODT_ENTRIES_SIZE[MAX_ODT_ENTRIES_SIZE]; uint32_t ODT_ENTRIES_ADR[MAX_ODT_ENTRIES_SIZE]; } tXCP_ODT_ENTRIES; + typedef struct { - uint8_t ODT_ENTRIES_COUNT[MAX_ODT]; + uint8_t ALTERNATING; + uint8_t DIRECTION; + uint8_t DTO_CTR; + uint8_t TIMESTAMP; + uint8_t PID_OFF; + uint16_t EVENT_CHANNEL_NUMBER; + uint8_t TRANSMISSION_RATE_PRESCALER; + uint8_t DAQ_LIST_PRIORITY; + + uint8_t ODT_COUNT; + tXCP_ODT_ENTRIES ODT_NUMBER[MAX_ODT]; } tXCP_DAQ; @@ -273,6 +285,34 @@ typedef struct __attribute__ ((packed)) { uint8_t DAQ_LIST_PRIORITY; } eXcpCommand_SET_DAQ_LIST_MODE; + +typedef struct __attribute__ ((packed)) { + eXcpTypeCommand COM; + uint8_t MODE; + uint8_t DAQ_LIST_NUMBER; +} eXcpCommand_START_STOP_DAQ_LIST; + +typedef struct __attribute__ ((packed)) { + eXcpTypeCommand COM; + uint8_t RESERVED; + uint16_t DAQ_COUNT; +} eXcpCommand_ALLOC_DAQ; + +typedef struct __attribute__ ((packed)) { + eXcpTypeCommand COM; + uint8_t RESERVED; + uint8_t DAQ_LIST_NUMBER; + uint8_t ODT_COUNT; +} eXcpCommand_ALLOC_ODT; + +typedef struct __attribute__ ((packed)) { + eXcpTypeCommand COM; + uint8_t RESERVED; + uint8_t DAQ_LIST_NUMBER; + uint8_t ODT_NUMBER; + uint8_t ODT_ENTRIES_COUNT; +} eXcpCommand_ALLOC_ODT_ENTRY; + typedef struct { tSerialPortFrameIO *ioCanFrame; tLoggerInterface *logger; @@ -291,6 +331,9 @@ typedef struct { uint8_t response[8]; tXCP_DAQ DAQ[MAX_DAO]; + uint16_t DAQ_COUNT; + + tRtcIO *rtcIO; tStaticThreadBlock(1024) T_can_Listener_XCP; @@ -302,6 +345,7 @@ typedef uint8_t (*xcp_func_ptr)(tCanSerialPortFrameXCP *env); void CanSerialPortFrameXcpInit( tCanSerialPortFrameXCP *env, tSerialPortFrameIO *ioCanFrame, + tRtcIO *rtcIO, tLoggerInterface *logger ); diff --git a/Src/CanSerialPortFrameXCP.c b/Src/CanSerialPortFrameXCP.c index 0c399ec..d45a04e 100644 --- a/Src/CanSerialPortFrameXCP.c +++ b/Src/CanSerialPortFrameXCP.c @@ -33,11 +33,12 @@ static unsigned long SeedToKeyHVAC_NAMI(unsigned char rnd, unsigned long dwSeedI void CanSerialPortFrameXcpInit( tCanSerialPortFrameXCP *env, tSerialPortFrameIO *ioCanFrame, + tRtcIO *rtcIO, tLoggerInterface *logger ) { env->ioCanFrame = ioCanFrame; - + env->rtcIO = rtcIO; env->logger = logger; InitThreadBlock(env->T_can_Listener_XCP, "CanListenerXCP", osPriorityNormal); @@ -306,24 +307,40 @@ uint8_t XCP_GET_DAQ_LIST_INFO_216(tCanSerialPortFrameXCP *env) { } uint8_t XCP_FREE_DAQ_214(tCanSerialPortFrameXCP *env) { + env->DAQ_COUNT = 0; + + for (uint16_t i = 0; i < MAX_DAO; ++i) { + env->DAQ[i].ODT_COUNT = 0; + + for (uint8_t j = 0; j < MAX_ODT; ++j) { + env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_COUNT = 0; + } + } return 0; } uint8_t XCP_ALLOC_DAQ_213(tCanSerialPortFrameXCP *env) { + eXcpCommand_ALLOC_DAQ *request = (eXcpCommand_ALLOC_DAQ *) env->canFrame.data; + + env->DAQ_COUNT = request->DAQ_COUNT; return 0; } uint8_t XCP_ALLOC_ODT_212(tCanSerialPortFrameXCP *env) { + eXcpCommand_ALLOC_ODT *request = (eXcpCommand_ALLOC_ODT *) env->canFrame.data; + + env->DAQ[request->DAQ_LIST_NUMBER].ODT_COUNT = request->ODT_COUNT; return 0; } uint8_t XCP_ALLOC_ODT_ENTRY_211(tCanSerialPortFrameXCP *env) { - eXcpCommand_DAQ_Alloc_ODR_Entry *request = (eXcpCommand_DAQ_Alloc_ODR_Entry *) env->canFrame.data; - env->DAQ[request->DAQ_LIST_NUMBER].ODT_ENTRIES_COUNT[request->DAQ_LIST_NUMBER] = request->ODT_ENTRIES_COUNT; + eXcpCommand_ALLOC_ODT_ENTRY *request = (eXcpCommand_ALLOC_ODT_ENTRY *) env->canFrame.data; + + env->DAQ[request->DAQ_LIST_NUMBER].ODT_NUMBER[request->ODT_NUMBER].ODT_ENTRIES_COUNT = request->ODT_ENTRIES_COUNT; return 0; } @@ -370,11 +387,39 @@ uint8_t XCP_WRITE_DAQ_225(tCanSerialPortFrameXCP *env) { uint8_t XCP_SET_DAQ_LIST_MODE_224(tCanSerialPortFrameXCP *env) { eXcpCommand_SET_DAQ_LIST_MODE *request = (eXcpCommand_SET_DAQ_LIST_MODE *) env->canFrame.data; + if (request->DAQ_LIST_NUMBER > MAX_DAO) { + env->response[0] = XCP_COMMAND_DISCONNECT; + env->response[1] = XCP_ERR_OUT_OF_RANGE; + return 2; + } + + env->DAQ[request->DAQ_LIST_NUMBER].ALTERNATING = request->ALTERNATING; + env->DAQ[request->DAQ_LIST_NUMBER].DIRECTION = request->DIRECTION; + env->DAQ[request->DAQ_LIST_NUMBER].DTO_CTR = request->DTO_CTR; + env->DAQ[request->DAQ_LIST_NUMBER].TIMESTAMP = request->TIMESTAMP; + env->DAQ[request->DAQ_LIST_NUMBER].PID_OFF = request->PID_OFF; + + env->DAQ[request->DAQ_LIST_NUMBER].EVENT_CHANNEL_NUMBER = request->EVENT_CHANNEL_NUMBER; + env->DAQ[request->DAQ_LIST_NUMBER].TRANSMISSION_RATE_PRESCALER = request->TRANSMISSION_RATE_PRESCALER; + env->DAQ[request->DAQ_LIST_NUMBER].DAQ_LIST_PRIORITY = request->DAQ_LIST_PRIORITY; return 0; } +uint8_t XCP_START_STOP_DAQ_LIST_222(tCanSerialPortFrameXCP *env) { + eXcpCommand_START_STOP_DAQ_LIST *request = (eXcpCommand_START_STOP_DAQ_LIST *) env->canFrame.data; + + if (request->DAQ_LIST_NUMBER > MAX_DAO) { + env->response[0] = XCP_COMMAND_DISCONNECT; + env->response[1] = XCP_ERR_OUT_OF_RANGE; + + return 2; + } + + + return 0; +} const xcp_func_ptr fXcp_func_ptr[256] = { @@ -600,7 +645,7 @@ const xcp_func_ptr fXcp_func_ptr[256] = { NULL, NULL, NULL, - NULL, + XCP_START_STOP_DAQ_LIST_222, NULL, XCP_SET_DAQ_LIST_MODE_224, XCP_WRITE_DAQ_225, @@ -662,8 +707,6 @@ eXcpResult vCanSerialPortFrameXcpReceive(tCanSerialPortFrameXCP *env, uint32 tim } - - } _Noreturn void CanXcpProcessing_ListenerTask(tCanSerialPortFrameXCP *env) {