Обновление
This commit is contained in:
parent
a6c05be8f1
commit
a675460804
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue