Обновление

This commit is contained in:
cfif 2025-12-29 15:54:32 +03:00
parent 31badb40c3
commit 62cd50c41f
2 changed files with 72 additions and 38 deletions

View File

@ -142,7 +142,7 @@ typedef struct __attribute__ ((packed)) {
uint8_t STATE_NUMBER; uint8_t STATE_NUMBER;
uint32_t SESSION_CONFIGURATION_ID; uint16_t SESSION_CONFIGURATION_ID;
} eXcpCommand_GET_STATUS; } eXcpCommand_GET_STATUS;
@ -583,12 +583,25 @@ typedef struct {
//tXCP_DAQ DAQ[MAX_DAO]; //tXCP_DAQ DAQ[MAX_DAO];
struct {
uint8_t STORE_CAL_REQ; // ожидает сохранения в энергонезависимую память
uint8_t STORE_DAQ_REQ; // требуется сохранить DAQ-листы
uint8_t CLEAR_DAQ_REQ; // требуется очистить все DAQ-листы
uint8_t DAQ_RUNNING; // минимум один DAQ-лист запущен и работает
uint8_t RESUME; // устройство в режиме RESUME
} STATE;
struct {
uint16_t DAQ_LIST_NUMBER; uint16_t DAQ_LIST_NUMBER;
uint8_t ODT_NUMBER; uint8_t ODT_NUMBER;
uint8_t ODT_ENTRY_NUMBER; uint8_t ODT_ENTRY_NUMBER;
uint16_t DAQ_COUNT; uint16_t DAQ_COUNT;
} SETUP;
tXCP_DAQ *DAQ; tXCP_DAQ *DAQ;
tRtcIO *rtcIO; tRtcIO *rtcIO;
osMutexId_t access; osMutexId_t access;

View File

@ -113,10 +113,8 @@ void CanSerialPortFrameXcpInit(
} }
static void FREE_DAQ(tCanSerialPortFrameXCP *env) { static void FREE_DAQ(tCanSerialPortFrameXCP *env) {
env->DAQ_COUNT = 0; memset(&env->STATE, 0, sizeof(env->STATE));
env->DAQ_LIST_NUMBER = 0; memset(&env->SETUP, 0, sizeof(env->SETUP));
env->ODT_NUMBER = 0;
env->ODT_ENTRY_NUMBER = 0;
memset(env->DAQ, 0, sizeof(DAQ)); memset(env->DAQ, 0, sizeof(DAQ));
} }
@ -164,34 +162,57 @@ static uint8_t XCP_COMMAND_DISCONNECT_FE(tCanSerialPortFrameXCP *env) {
return 1; return 1;
} }
static void update_STATE(tCanSerialPortFrameXCP *env) {
env->STATE.STORE_CAL_REQ = 0; // ожидает сохранения в энергонезависимую память
env->STATE.STORE_DAQ_REQ = 0; // требуется сохранить DAQ-листы (не загрузить, а сохранить)
env->STATE.CLEAR_DAQ_REQ = 0; // требуется очистить все DAQ-листы
env->STATE.DAQ_RUNNING = 0; // минимум один DAQ-лист запущен и работает
for (uint16 i = 0; i < env->SETUP.DAQ_COUNT; ++i) {
if (env->DAQ[i].RUNNING) {
env->STATE.DAQ_RUNNING = 1; // минимум один DAQ-лист запущен и работает
break;
}
}
env->STATE.RESUME = 0; // устройство в режиме RESUME
}
static uint8_t XCP_COMMAND_GET_STATUS_FD(tCanSerialPortFrameXCP *env) { static uint8_t XCP_COMMAND_GET_STATUS_FD(tCanSerialPortFrameXCP *env) {
update_STATE(env);
eXcpCommand_GET_STATUS *xcpCommand_GET_STATUS = (eXcpCommand_GET_STATUS *) env->response; eXcpCommand_GET_STATUS *xcpCommand_GET_STATUS = (eXcpCommand_GET_STATUS *) env->response;
xcpCommand_GET_STATUS->COM = XCP_COMMAND_CONNECT; xcpCommand_GET_STATUS->COM = XCP_COMMAND_CONNECT;
xcpCommand_GET_STATUS->STORE_CAL_REQ = 0; // Статус состояний
xcpCommand_GET_STATUS->STORE_CAL_REQ = env->STATE.STORE_CAL_REQ;
xcpCommand_GET_STATUS->reserve1 = 0; xcpCommand_GET_STATUS->reserve1 = 0;
xcpCommand_GET_STATUS->STORE_DAQ_REQ = 0; xcpCommand_GET_STATUS->STORE_DAQ_REQ = env->STATE.STORE_DAQ_REQ;
xcpCommand_GET_STATUS->CLEAR_DAQ_REQ = 0; xcpCommand_GET_STATUS->CLEAR_DAQ_REQ = env->STATE.CLEAR_DAQ_REQ;
xcpCommand_GET_STATUS->reserve2 = 0; xcpCommand_GET_STATUS->reserve2 = 0;
xcpCommand_GET_STATUS->reserve3 = 0; xcpCommand_GET_STATUS->reserve3 = 0;
xcpCommand_GET_STATUS->DAQ_RUNNING = 0; xcpCommand_GET_STATUS->DAQ_RUNNING = env->STATE.DAQ_RUNNING;
xcpCommand_GET_STATUS->RESUME = 0; xcpCommand_GET_STATUS->RESUME = env->STATE.RESUME; // устройство не в режиме RESUME
xcpCommand_GET_STATUS->CAL_PAG = 0; // Статус защиты ресурсов
xcpCommand_GET_STATUS->CAL_PAG = 1; // защита команд калибровки/пагинации
xcpCommand_GET_STATUS->reserve5 = 0; xcpCommand_GET_STATUS->reserve5 = 0;
xcpCommand_GET_STATUS->DAQ = 0; xcpCommand_GET_STATUS->DAQ = 1; // защита DAQ-команд
xcpCommand_GET_STATUS->STIM = 0; xcpCommand_GET_STATUS->STIM = 1; // защита STIM-команд
xcpCommand_GET_STATUS->PGM = 0; xcpCommand_GET_STATUS->PGM = 1; // защита команд программирования
xcpCommand_GET_STATUS->reserve6 = 0; xcpCommand_GET_STATUS->reserve6 = 0;
xcpCommand_GET_STATUS->reserve7 = 0; xcpCommand_GET_STATUS->reserve7 = 0;
xcpCommand_GET_STATUS->reserve8 = 0; xcpCommand_GET_STATUS->reserve8 = 0;
xcpCommand_GET_STATUS->STATE_NUMBER = 2; xcpCommand_GET_STATUS->STATE_NUMBER = 2; // номер состояния ECU
xcpCommand_GET_STATUS->SESSION_CONFIGURATION_ID = 0; xcpCommand_GET_STATUS->SESSION_CONFIGURATION_ID = 0; // ID конфигурации сессии
return 8; return 6;
} }
static uint8_t XCP_COMMAND_SYNCH_FC(tCanSerialPortFrameXCP *env) { static uint8_t XCP_COMMAND_SYNCH_FC(tCanSerialPortFrameXCP *env) {
@ -440,7 +461,7 @@ static uint8_t XCP_GET_DAQ_LIST_INFO_D8(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_ALLOC_DAQ_D5(tCanSerialPortFrameXCP *env) { static uint8_t XCP_ALLOC_DAQ_D5(tCanSerialPortFrameXCP *env) {
eXcpCommand_ALLOC_DAQ *request = (eXcpCommand_ALLOC_DAQ *) env->canFrame.data; eXcpCommand_ALLOC_DAQ *request = (eXcpCommand_ALLOC_DAQ *) env->canFrame.data;
env->DAQ_COUNT = request->DAQ_COUNT; env->SETUP.DAQ_COUNT = request->DAQ_COUNT;
env->response[0] = XCP_COMMAND_CONNECT; env->response[0] = XCP_COMMAND_CONNECT;
return 1; return 1;
@ -486,9 +507,9 @@ static uint8_t XCP_SET_DAQ_PTR_E2(tCanSerialPortFrameXCP *env) {
return 2; return 2;
} }
env->DAQ_LIST_NUMBER = request->DAQ_LIST_NUMBER; env->SETUP.DAQ_LIST_NUMBER = request->DAQ_LIST_NUMBER;
env->ODT_NUMBER = request->ODT_NUMBER; env->SETUP.ODT_NUMBER = request->ODT_NUMBER;
env->ODT_ENTRY_NUMBER = request->ODT_ENTRY_NUMBER; env->SETUP.ODT_ENTRY_NUMBER = request->ODT_ENTRY_NUMBER;
env->response[0] = XCP_COMMAND_CONNECT; env->response[0] = XCP_COMMAND_CONNECT;
@ -498,7 +519,7 @@ static uint8_t XCP_SET_DAQ_PTR_E2(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_WRITE_DAQ_E1(tCanSerialPortFrameXCP *env) { static uint8_t XCP_WRITE_DAQ_E1(tCanSerialPortFrameXCP *env) {
eXcpCommand_WRITE_DAQ *request = (eXcpCommand_WRITE_DAQ *) env->canFrame.data; eXcpCommand_WRITE_DAQ *request = (eXcpCommand_WRITE_DAQ *) env->canFrame.data;
if (env->ODT_ENTRY_NUMBER > MAX_ODT_ENTRIES_SIZE_DAQ) { if (env->SETUP.ODT_ENTRY_NUMBER > MAX_ODT_ENTRIES_SIZE_DAQ) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_OUT_OF_RANGE; env->response[1] = XCP_ERR_OUT_OF_RANGE;
@ -506,12 +527,12 @@ static uint8_t XCP_WRITE_DAQ_E1(tCanSerialPortFrameXCP *env) {
return 2; return 2;
} }
env->DAQ[env->DAQ_LIST_NUMBER].ODT_NUMBER[env->ODT_NUMBER].BIT_OFFSET[env->ODT_ENTRY_NUMBER] = request->BIT_OFFSET; env->DAQ[env->SETUP.DAQ_LIST_NUMBER].ODT_NUMBER[env->SETUP.ODT_NUMBER].BIT_OFFSET[env->SETUP.ODT_ENTRY_NUMBER] = request->BIT_OFFSET;
env->DAQ[env->DAQ_LIST_NUMBER].ODT_NUMBER[env->ODT_NUMBER].ADR_EXT[env->ODT_ENTRY_NUMBER] = request->ADR_EXT; env->DAQ[env->SETUP.DAQ_LIST_NUMBER].ODT_NUMBER[env->SETUP.ODT_NUMBER].ADR_EXT[env->SETUP.ODT_ENTRY_NUMBER] = request->ADR_EXT;
env->DAQ[env->DAQ_LIST_NUMBER].ODT_NUMBER[env->ODT_NUMBER].ODT_ENTRIES_ADR[env->ODT_ENTRY_NUMBER] = request->ADR; env->DAQ[env->SETUP.DAQ_LIST_NUMBER].ODT_NUMBER[env->SETUP.ODT_NUMBER].ODT_ENTRIES_ADR[env->SETUP.ODT_ENTRY_NUMBER] = request->ADR;
env->DAQ[env->DAQ_LIST_NUMBER].ODT_NUMBER[env->ODT_NUMBER].ODT_ENTRIES_SIZE[env->ODT_ENTRY_NUMBER] = request->ODT_ENTRY_SIZE; env->DAQ[env->SETUP.DAQ_LIST_NUMBER].ODT_NUMBER[env->SETUP.ODT_NUMBER].ODT_ENTRIES_SIZE[env->SETUP.ODT_ENTRY_NUMBER] = request->ODT_ENTRY_SIZE;
++env->ODT_ENTRY_NUMBER; ++env->SETUP.ODT_ENTRY_NUMBER;
env->response[0] = XCP_COMMAND_CONNECT; env->response[0] = XCP_COMMAND_CONNECT;
return 1; return 1;
@ -606,12 +627,12 @@ static uint8_t XCP_READ_DAQ_DB(tCanSerialPortFrameXCP *env) {
eXcpCommand_WRITE_DAQ *response = (eXcpCommand_WRITE_DAQ *) env->response; eXcpCommand_WRITE_DAQ *response = (eXcpCommand_WRITE_DAQ *) env->response;
response->COM = XCP_COMMAND_CONNECT; response->COM = XCP_COMMAND_CONNECT;
response->BIT_OFFSET = env->DAQ[env->DAQ_LIST_NUMBER].ODT_NUMBER[env->ODT_NUMBER].BIT_OFFSET[env->ODT_ENTRY_NUMBER]; response->BIT_OFFSET = env->DAQ[env->SETUP.DAQ_LIST_NUMBER].ODT_NUMBER[env->SETUP.ODT_NUMBER].BIT_OFFSET[env->SETUP.ODT_ENTRY_NUMBER];
response->ADR_EXT = env->DAQ[env->DAQ_LIST_NUMBER].ODT_NUMBER[env->ODT_NUMBER].ADR_EXT[env->ODT_ENTRY_NUMBER]; response->ADR_EXT = env->DAQ[env->SETUP.DAQ_LIST_NUMBER].ODT_NUMBER[env->SETUP.ODT_NUMBER].ADR_EXT[env->SETUP.ODT_ENTRY_NUMBER];
response->ADR = env->DAQ[env->DAQ_LIST_NUMBER].ODT_NUMBER[env->ODT_NUMBER].ODT_ENTRIES_ADR[env->ODT_ENTRY_NUMBER]; response->ADR = env->DAQ[env->SETUP.DAQ_LIST_NUMBER].ODT_NUMBER[env->SETUP.ODT_NUMBER].ODT_ENTRIES_ADR[env->SETUP.ODT_ENTRY_NUMBER];
response->ODT_ENTRY_SIZE = env->DAQ[env->DAQ_LIST_NUMBER].ODT_NUMBER[env->ODT_NUMBER].ODT_ENTRIES_SIZE[env->ODT_ENTRY_NUMBER]; response->ODT_ENTRY_SIZE = env->DAQ[env->SETUP.DAQ_LIST_NUMBER].ODT_NUMBER[env->SETUP.ODT_NUMBER].ODT_ENTRIES_SIZE[env->SETUP.ODT_ENTRY_NUMBER];
++env->ODT_ENTRY_NUMBER; ++env->SETUP.ODT_ENTRY_NUMBER;
return 8; return 8;
} }
@ -1256,7 +1277,7 @@ _Noreturn void CanXcpProcessing_Service_Dto_Stim_Task(tCanSerialPortFrameXCP *en
if (osMutexAcquire(env->access, 1000) == osOK) { if (osMutexAcquire(env->access, 1000) == osOK) {
for (uint16 i = 0; i < env->DAQ_COUNT; ++i) { for (uint16 i = 0; i < env->SETUP.DAQ_COUNT; ++i) {
if ((env->DAQ[i].DIRECTION == 1) && if ((env->DAQ[i].DIRECTION == 1) &&
(env->DAQ[i].EVENT_CHANNEL == 0) && (env->DAQ[i].EVENT_CHANNEL == 0) &&
@ -1348,7 +1369,7 @@ void Dto_Daq(tCanSerialPortFrameXCP *env, uint16_t channel, uint32_t timeout) {
if (osMutexAcquire(env->access, 1000) == osOK) { if (osMutexAcquire(env->access, 1000) == osOK) {
for (uint16 i = 0; i < env->DAQ_COUNT; ++i) { for (uint16 i = 0; i < env->SETUP.DAQ_COUNT; ++i) {
if ((env->DAQ[i].DIRECTION == 0) && if ((env->DAQ[i].DIRECTION == 0) &&
(env->DAQ[i].EVENT_CHANNEL == channel) && (env->DAQ[i].EVENT_CHANNEL == channel) &&