From 9cde8e5eade63326584c9e7fd6b328c05b597f9d Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 11 Nov 2025 14:30:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inc/CanSerialPortFrameXCP.h | 15 +++++++++--- Src/CanSerialPortFrameXCP.c | 49 +++++++++++++++++++++++++------------ 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/Inc/CanSerialPortFrameXCP.h b/Inc/CanSerialPortFrameXCP.h index 62b4b3f..49961e8 100644 --- a/Inc/CanSerialPortFrameXCP.h +++ b/Inc/CanSerialPortFrameXCP.h @@ -218,14 +218,21 @@ typedef struct __attribute__ ((packed)) { #define MAX_CTO 8 #define MAX_DTO 8 -#define MAX_DAO 6 -#define MAX_ODT 20 -#define MAX_ODT_ENTRIES_SIZE 6 +#define BODY_MAX_LEN (MAX_DTO - 2) + +#define MAX_DAO 20 +#define MAX_ODT 10 +#define MAX_ODT_ENTRIES_SIZE 7 #define MAX_EVENT_CHANNEL 1 +typedef struct { + uint8_t DATA[BODY_MAX_LEN]; +} tXCP_DATA_STIM; + typedef struct { uint8_t ODT_ENTRIES_COUNT; + tXCP_DATA_STIM DATA_STM[MAX_ODT_ENTRIES_SIZE]; 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]; @@ -453,6 +460,8 @@ typedef struct { uint8_t downloadRemaining; uint8_t response[8]; + uint8_t DATA[MAX_ODT_ENTRIES_SIZE * BODY_MAX_LEN]; + //tXCP_EVENT_CHANNEL EVENT_CHANNEL[MAX_EVENT_CHANNEL]; tXCP_DAQ DAQ[MAX_DAO]; uint16_t DAQ_COUNT; diff --git a/Src/CanSerialPortFrameXCP.c b/Src/CanSerialPortFrameXCP.c index 10de80b..036b238 100644 --- a/Src/CanSerialPortFrameXCP.c +++ b/Src/CanSerialPortFrameXCP.c @@ -312,17 +312,18 @@ uint8_t XCP_GET_DAQ_LIST_INFO_216(tCanSerialPortFrameXCP *env) { uint8_t XCP_FREE_DAQ_214(tCanSerialPortFrameXCP *env) { env->DAQ_COUNT = 0; + memset(env->DAQ, 0, sizeof(env->DAQ)); - for (uint16_t i = 0; i < MAX_DAO; ++i) { +// for (uint16_t i = 0; i < MAX_DAO; ++i) { - env->DAQ[i].SELECTED = 0; - env->DAQ[i].RUNNING = 0; - env->DAQ[i].ODT_COUNT = 0; +// env->DAQ[i].SELECTED = 0; +// env->DAQ[i].RUNNING = 0; +// 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; - } - } +// for (uint8_t j = 0; j < MAX_ODT; ++j) { +// env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_COUNT = 0; +// } +// } env->response[0] = XCP_COMMAND_CONNECT; return 1; @@ -903,7 +904,7 @@ uint8_t vCanSerialPortFrameXcpReceive(tCanSerialPortFrameXCP *env, uint32 timeou } _Noreturn void CanXcpProcessing_ServiceTask(tCanSerialPortFrameXCP *env) { - uint8_t response_size; + uint8_t size; while (1) { @@ -922,33 +923,49 @@ _Noreturn void CanXcpProcessing_ServiceTask(tCanSerialPortFrameXCP *env) { env->response[0] = j; // ODT env->response[1] = i; // DAQ - response_size = 0; + size = 0; for (uint8_t k = 0; k < env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_COUNT; ++k) { - memcpy(&env->response[2] + response_size, + memcpy(&env->DATA[size], (uint8_t *) env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_ADR[k], env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_SIZE[k]); - response_size += env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_SIZE[k]; + size += env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_SIZE[k]; } - if (response_size) { - env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, response_size, 1000); + uint8_t count_size = size / BODY_MAX_LEN; + uint8_t count_size_tail = size % BODY_MAX_LEN; + + size = 0; + + for (uint8_t k = 0; k < count_size; ++k) { + memcpy(&env->response[2], &env->DATA[size], BODY_MAX_LEN); + env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, MAX_DTO, 1000); + size += 6; } + if (count_size_tail) { + memcpy(&env->response[2], &env->DATA[size], count_size_tail); + env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, count_size_tail, 1000); + } + + } } else { // STIM - DTO for (uint8_t j = 0; j < env->DAQ[i].ODT_COUNT; ++j) { + size = 0; + for (uint8_t k = 0; k < env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_COUNT; ++k) { - memcpy(&env->response[2] + response_size, - (uint8_t *) env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_ADR[k], + memcpy((uint8_t *) env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_ADR[k], + &env->DAQ[i].ODT_NUMBER[j].DATA_STM[size], env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_SIZE[k]); + size += env->DAQ[i].ODT_NUMBER[j].ODT_ENTRIES_SIZE[k]; } }