Обновление

This commit is contained in:
cfif 2025-11-12 15:49:16 +03:00
parent a6c05be8f1
commit a675460804
2 changed files with 133 additions and 66 deletions

View File

@ -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;

View File

@ -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) {