diff --git a/Inc/CanSerialPortFrameXCP.h b/Inc/CanSerialPortFrameXCP.h index b76a24c..b3df6a9 100644 --- a/Inc/CanSerialPortFrameXCP.h +++ b/Inc/CanSerialPortFrameXCP.h @@ -142,7 +142,7 @@ typedef struct __attribute__ ((packed)) { uint8_t STATE_NUMBER; - uint32_t SESSION_CONFIGURATION_ID; + uint16_t SESSION_CONFIGURATION_ID; } eXcpCommand_GET_STATUS; @@ -583,12 +583,25 @@ typedef struct { //tXCP_DAQ DAQ[MAX_DAO]; - uint16_t DAQ_LIST_NUMBER; - uint8_t ODT_NUMBER; - uint8_t ODT_ENTRY_NUMBER; - uint16_t DAQ_COUNT; + 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; + uint8_t ODT_NUMBER; + uint8_t ODT_ENTRY_NUMBER; + uint16_t DAQ_COUNT; + } SETUP; + tXCP_DAQ *DAQ; + + tRtcIO *rtcIO; osMutexId_t access; diff --git a/Src/CanSerialPortFrameXCP.c b/Src/CanSerialPortFrameXCP.c index 3bb1c76..867bccc 100644 --- a/Src/CanSerialPortFrameXCP.c +++ b/Src/CanSerialPortFrameXCP.c @@ -113,10 +113,8 @@ void CanSerialPortFrameXcpInit( } static void FREE_DAQ(tCanSerialPortFrameXCP *env) { - env->DAQ_COUNT = 0; - env->DAQ_LIST_NUMBER = 0; - env->ODT_NUMBER = 0; - env->ODT_ENTRY_NUMBER = 0; + memset(&env->STATE, 0, sizeof(env->STATE)); + memset(&env->SETUP, 0, sizeof(env->SETUP)); memset(env->DAQ, 0, sizeof(DAQ)); } @@ -164,34 +162,57 @@ static uint8_t XCP_COMMAND_DISCONNECT_FE(tCanSerialPortFrameXCP *env) { 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) { + + update_STATE(env); + eXcpCommand_GET_STATUS *xcpCommand_GET_STATUS = (eXcpCommand_GET_STATUS *) env->response; 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->STORE_DAQ_REQ = 0; - xcpCommand_GET_STATUS->CLEAR_DAQ_REQ = 0; + xcpCommand_GET_STATUS->STORE_DAQ_REQ = env->STATE.STORE_DAQ_REQ; + xcpCommand_GET_STATUS->CLEAR_DAQ_REQ = env->STATE.CLEAR_DAQ_REQ; xcpCommand_GET_STATUS->reserve2 = 0; xcpCommand_GET_STATUS->reserve3 = 0; - xcpCommand_GET_STATUS->DAQ_RUNNING = 0; - xcpCommand_GET_STATUS->RESUME = 0; + xcpCommand_GET_STATUS->DAQ_RUNNING = env->STATE.DAQ_RUNNING; + 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->DAQ = 0; - xcpCommand_GET_STATUS->STIM = 0; - xcpCommand_GET_STATUS->PGM = 0; + xcpCommand_GET_STATUS->DAQ = 1; // защита DAQ-команд + xcpCommand_GET_STATUS->STIM = 1; // защита STIM-команд + xcpCommand_GET_STATUS->PGM = 1; // защита команд программирования xcpCommand_GET_STATUS->reserve6 = 0; xcpCommand_GET_STATUS->reserve7 = 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) { @@ -440,7 +461,7 @@ static uint8_t XCP_GET_DAQ_LIST_INFO_D8(tCanSerialPortFrameXCP *env) { static uint8_t XCP_ALLOC_DAQ_D5(tCanSerialPortFrameXCP *env) { 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; return 1; @@ -486,9 +507,9 @@ static uint8_t XCP_SET_DAQ_PTR_E2(tCanSerialPortFrameXCP *env) { return 2; } - env->DAQ_LIST_NUMBER = request->DAQ_LIST_NUMBER; - env->ODT_NUMBER = request->ODT_NUMBER; - env->ODT_ENTRY_NUMBER = request->ODT_ENTRY_NUMBER; + env->SETUP.DAQ_LIST_NUMBER = request->DAQ_LIST_NUMBER; + env->SETUP.ODT_NUMBER = request->ODT_NUMBER; + env->SETUP.ODT_ENTRY_NUMBER = request->ODT_ENTRY_NUMBER; 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) { 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[1] = XCP_ERR_OUT_OF_RANGE; @@ -506,12 +527,12 @@ static uint8_t XCP_WRITE_DAQ_E1(tCanSerialPortFrameXCP *env) { 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->DAQ_LIST_NUMBER].ODT_NUMBER[env->ODT_NUMBER].ADR_EXT[env->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->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].BIT_OFFSET[env->SETUP.ODT_ENTRY_NUMBER] = request->BIT_OFFSET; + 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->SETUP.DAQ_LIST_NUMBER].ODT_NUMBER[env->SETUP.ODT_NUMBER].ODT_ENTRIES_ADR[env->SETUP.ODT_ENTRY_NUMBER] = request->ADR; + 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; return 1; @@ -606,12 +627,12 @@ static uint8_t XCP_READ_DAQ_DB(tCanSerialPortFrameXCP *env) { eXcpCommand_WRITE_DAQ *response = (eXcpCommand_WRITE_DAQ *) env->response; 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->ADR_EXT = env->DAQ[env->DAQ_LIST_NUMBER].ODT_NUMBER[env->ODT_NUMBER].ADR_EXT[env->ODT_ENTRY_NUMBER]; - response->ADR = env->DAQ[env->DAQ_LIST_NUMBER].ODT_NUMBER[env->ODT_NUMBER].ODT_ENTRIES_ADR[env->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->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->SETUP.DAQ_LIST_NUMBER].ODT_NUMBER[env->SETUP.ODT_NUMBER].ADR_EXT[env->SETUP.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->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; } @@ -1256,7 +1277,7 @@ _Noreturn void CanXcpProcessing_Service_Dto_Stim_Task(tCanSerialPortFrameXCP *en 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) && (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) { - 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) && (env->DAQ[i].EVENT_CHANNEL == channel) &&