diff --git a/Inc/CanSerialPortFrameXCP.h b/Inc/CanSerialPortFrameXCP.h index a80b8eb..8071b19 100644 --- a/Inc/CanSerialPortFrameXCP.h +++ b/Inc/CanSerialPortFrameXCP.h @@ -224,16 +224,18 @@ typedef struct __attribute__ ((packed)) { #define MAX_ODT 10 #define MAX_ODT_ENTRIES_SIZE 7 -#define MAX_EVENT_CHANNEL 1 +#define MAX_EVENT_CHANNEL 2 typedef struct { - uint8_t DATA[BODY_MAX_LEN]; + uint8_t DATA[BODY_MAX_LEN]; } tXCP_DATA_STIM; typedef struct { uint8_t ODT_ENTRIES_COUNT; - uint8_t IS_STIM_RECEIVED; + tXCP_DATA_STIM DATA_STM[MAX_ODT_ENTRIES_SIZE]; + uint8_t DATA_STM_COUNTER; + uint8_t BIT_OFFSET[MAX_ODT_ENTRIES_SIZE]; uint8_t ADR_EXT[MAX_ODT_ENTRIES_SIZE]; uint8_t ODT_ENTRIES_SIZE[MAX_ODT_ENTRIES_SIZE]; @@ -267,9 +269,9 @@ typedef struct { uint8_t TRANSMISSION_RATE_PRESCALER; uint8_t DAQ_LIST_PRIORITY; - uint8_t COUNTER; - + uint8_t PRESCALER_COUNTER; + uint8_t IS_STIM_RECEIVED; tXCP_ODT_ENTRIES ODT_NUMBER[MAX_ODT]; } tXCP_DAQ; @@ -476,7 +478,9 @@ typedef struct { osMutexId_t access; - tStaticThreadBlock(1024) T_can_Listener_XCP; + tStaticThreadBlock(512) T_can_Listener_XCP; + tStaticThreadBlock(512) T_can_Listener_Dto_Stim_XCP; + tStaticThreadBlock(512) T_can_Listener_Dto_Daq_XCP; } tCanSerialPortFrameXCP; diff --git a/Src/CanSerialPortFrameXCP.c b/Src/CanSerialPortFrameXCP.c index 9539645..deea0be 100644 --- a/Src/CanSerialPortFrameXCP.c +++ b/Src/CanSerialPortFrameXCP.c @@ -423,7 +423,7 @@ static uint8_t XCP_SET_DAQ_LIST_MODE_224(tCanSerialPortFrameXCP *env) { 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; - env->DAQ[request->DAQ_LIST_NUMBER].COUNTER = request->TRANSMISSION_RATE_PRESCALER; + env->DAQ[request->DAQ_LIST_NUMBER].PRESCALER_COUNTER = request->TRANSMISSION_RATE_PRESCALER; env->response[0] = XCP_COMMAND_CONNECT; return 1; @@ -596,8 +596,15 @@ static uint8_t XCP_GET_DAQ_EVENT_INFO_215(tCanSerialPortFrameXCP *env) { response->RESERVED1 = 0; response->RESERVED2 = 0; - response->DAQ = 1; - response->STM = 1; + + if (request->EVENT_CHANNEL_NUMBER == 0) { // DTO-STIM + response->DAQ = 1; + response->STM = 0; + } else { // DTO-DAQ + response->DAQ = 0; + response->STM = 1; + } + response->RESERVED3 = 0; response->RESERVED4 = 0; response->CONSISTENCY_DAQ = 0; @@ -615,8 +622,17 @@ static uint8_t XCP_GET_DAQ_EVENT_INFO_215(tCanSerialPortFrameXCP *env) { static uint8_t XCP_GET_DAQ_STM(tCanSerialPortFrameXCP *env) { eXcpCommand_GET_DAQ_STM *response = (eXcpCommand_GET_DAQ_STM *) env->canFrame.data; - memcpy(env->DAQ[response->DAQ].ODT_NUMBER[response->ODT].DATA_STM, &env->canFrame.data[3], env->canFrame.dlc - 2); + uint8_t *COUNTER = &env->DAQ[response->DAQ].ODT_NUMBER[response->ODT].DATA_STM_COUNTER; + memcpy(env->DAQ[response->DAQ].ODT_NUMBER[response->ODT].DATA_STM[*COUNTER].DATA, &env->canFrame.data[3], + env->canFrame.dlc - 2); + + ++env->DAQ[response->DAQ].ODT_NUMBER[response->ODT].DATA_STM_COUNTER; + + if (*COUNTER == env->DAQ[response->DAQ].ODT_COUNT) { + *COUNTER = 0; + env->DAQ[response->DAQ].IS_STIM_RECEIVED = 1; + } return 0; } @@ -918,7 +934,7 @@ uint8_t vCanSerialPortFrameXcpReceive(tCanSerialPortFrameXCP *env, uint32 timeou return response_size; } -_Noreturn void CanXcpProcessing_ServiceTask(tCanSerialPortFrameXCP *env) { +_Noreturn void CanXcpProcessing_Service_Dto_Stim_Task(tCanSerialPortFrameXCP *env) { uint8_t size; while (1) { @@ -929,9 +945,104 @@ _Noreturn void CanXcpProcessing_ServiceTask(tCanSerialPortFrameXCP *env) { if (env->DAQ[i].RUNNING) { - if ((env->DAQ[i].EVENT_CHANNEL == 0) && (env->DAQ[i].COUNTER == 0)) { + if ((env->DAQ[i].EVENT_CHANNEL == 0) && (env->DAQ[i].PRESCALER_COUNTER == 0)) { - env->DAQ[i].COUNTER = env->DAQ[i].TRANSMISSION_RATE_PRESCALER; + env->DAQ[i].PRESCALER_COUNTER = env->DAQ[i].TRANSMISSION_RATE_PRESCALER; + + if (env->DAQ[i].DIRECTION == 1) { // STIM - DTO + + if (env->DAQ[i].IS_STIM_RECEIVED) { + + for (uint8_t j = 0; j < env->DAQ[i].ODT_COUNT; ++j) { + + size = 0; + + for (uint8_t k = 0; k < MAX_ODT_ENTRIES_SIZE; ++k) { + + uint8_t ODT_ENTRIES_SIZE = env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_SIZE[k]; + + if (ODT_ENTRIES_SIZE) { + + memcpy(&env->DATA[size], + env->DAQ[i].ODT_NUMBER[j].DATA_STM[k].DATA, + ODT_ENTRIES_SIZE); + + size += ODT_ENTRIES_SIZE; + + } + + } + + uint8_t size_stim = 0; + + for (uint8_t k = 0; k < MAX_ODT_ENTRIES_SIZE; ++k) { + + + uint8_t ODT_ENTRIES_SIZE = env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_SIZE[k]; + + if (ODT_ENTRIES_SIZE) { + + if ((size_stim + ODT_ENTRIES_SIZE) <= size) { + memcpy((uint8_t *) env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_ADR[k], + &env->DAQ[i].ODT_NUMBER[j].DATA_STM[k].DATA[size_stim], + ODT_ENTRIES_SIZE); + + size_stim += ODT_ENTRIES_SIZE; + } else { + asm("nop"); + } + + } + + + } + + + } + + env->DAQ[i].IS_STIM_RECEIVED = 0; + + } else { + asm("nop"); + } + } else { + asm("nop"); + } + + } else { + --env->DAQ[i].PRESCALER_COUNTER; + } + + + } + + + } + + osMutexRelease(env->access); + } + + SystemDelayMs(10); + } + + +} + + +_Noreturn void CanXcpProcessing_Service_Dto_Daq_Task(tCanSerialPortFrameXCP *env) { + uint8_t size; + + while (1) { + + if (osMutexAcquire(env->access, 100) == osOK) { + + for (uint16 i = 0; i < env->DAQ_COUNT; ++i) { + if (env->DAQ[i].RUNNING) { + + + if ((env->DAQ[i].EVENT_CHANNEL == 1) && (env->DAQ[i].PRESCALER_COUNTER == 0)) { + + env->DAQ[i].PRESCALER_COUNTER = env->DAQ[i].TRANSMISSION_RATE_PRESCALER; if (env->DAQ[i].DIRECTION == 0) { // DAQ - DTO for (uint8_t j = 0; j < env->DAQ[i].ODT_COUNT; ++j) { @@ -975,61 +1086,12 @@ _Noreturn void CanXcpProcessing_ServiceTask(tCanSerialPortFrameXCP *env) { } - } else { // STIM - DTO - - for (uint8_t j = 0; j < env->DAQ[i].ODT_COUNT; ++j) { - - size = 0; - - for (uint8_t k = 0; k < MAX_ODT_ENTRIES_SIZE; ++k) { - - uint8_t ODT_ENTRIES_SIZE = env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_SIZE[k]; - - if (ODT_ENTRIES_SIZE) { - - memcpy(&env->DATA[size], - env->DAQ[i].ODT_NUMBER[j].DATA_STM[k].DATA, - ODT_ENTRIES_SIZE); - - size += ODT_ENTRIES_SIZE; - - } - - } - - uint8_t size_stim = 0; - - for (uint8_t k = 0; k < MAX_ODT_ENTRIES_SIZE; ++k) { - - if (env->DAQ[i].ODT_NUMBER[j].IS_STIM_RECEIVED) { - - uint8_t ODT_ENTRIES_SIZE = env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_SIZE[k]; - - if (ODT_ENTRIES_SIZE) { - - if ((size_stim + ODT_ENTRIES_SIZE) <= size) { - memcpy((uint8_t *) env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_ADR[k], - &env->DAQ[i].ODT_NUMBER[j].DATA_STM[k].DATA[size_stim], - ODT_ENTRIES_SIZE); - - size_stim += ODT_ENTRIES_SIZE; - } else { - asm("nop"); - } - - } - - env->DAQ[i].ODT_NUMBER[j].IS_STIM_RECEIVED = 0; - } - - } - - - } + } else { + asm("nop"); } } else { - --env->DAQ[i].COUNTER; + --env->DAQ[i].PRESCALER_COUNTER; } @@ -1048,7 +1110,8 @@ _Noreturn void CanXcpProcessing_ServiceTask(tCanSerialPortFrameXCP *env) { } void CanXcpProcessing_Service_Start(tCanSerialPortFrameXCP *env) { - ThreadBlock_Start(env->T_can_Listener_XCP, env, CanXcpProcessing_ServiceTask); + ThreadBlock_Start(env->T_can_Listener_Dto_Stim_XCP, env, CanXcpProcessing_Service_Dto_Stim_Task); + ThreadBlock_Start(env->T_can_Listener_Dto_Daq_XCP, env, CanXcpProcessing_Service_Dto_Daq_Task); } _Noreturn void CanXcpProcessing_ListenerTask(tCanSerialPortFrameXCP *env) {