Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -rf7b149d8b8c9ea6ac58e4739101693d251d7a355 -rc4d489831394f0954dfcddf8158baf0da09ad5c8 --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision f7b149d8b8c9ea6ac58e4739101693d251d7a355) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision c4d489831394f0954dfcddf8158baf0da09ad5c8) @@ -108,7 +108,7 @@ static F32 resUseVolumeMl = 0.0; ///< Accumulated volume used from active reservoir. // DG command response -static DG_CMD_RESPONSE_T dgCmdResp; ///< Used to keep the latest DG command response. +static DG_CMD_RESPONSE_T dgCmdResp[ NUM_OF_DG_COMMANDS ]; ///< Keep the latest DG command response for each command. // ********** private function prototypes ********** @@ -156,9 +156,13 @@ } } - dgCmdResp.commandID = DG_CMD_NONE; - dgCmdResp.rejected = TRUE; - dgCmdResp.rejectCode = DG_CMD_REQUEST_REJECT_REASON_NONE; + // initialize DG command response + for ( i = 0; i < NUM_OF_DG_COMMANDS; i++ ) + { + dgCmdResp[ i ].commandID = DG_CMD_NONE; + dgCmdResp[ i ].rejected = TRUE; + dgCmdResp[ i ].rejectCode = DG_CMD_REQUEST_REJECT_REASON_NONE; + } smLoadCellReadingsIdx = 0; smLoadCellReadingsTotal[ DG_RESERVOIR_1 ] = 0.0; @@ -744,7 +748,7 @@ void cmdStartDGTrimmerHeater( void ) { dgTrimmerHeaterOn = TRUE; - dgCmdResp.commandID = DG_CMD_NONE; + dgCmdResp[ DG_CMD_START_TRIMMER_HEATER ].commandID = DG_CMD_NONE; sendDGStartStopTrimmerHeaterCommand( START_DG_CMD, dgTrimmerTempSet ); } @@ -759,7 +763,7 @@ void cmdStopDGTrimmerHeater( void ) { dgTrimmerHeaterOn = FALSE; - dgCmdResp.commandID = DG_CMD_NONE; + dgCmdResp[ DG_CMD_STOP_TRIMMER_HEATER ].commandID = DG_CMD_NONE; sendDGStartStopTrimmerHeaterCommand( STOP_DG_CMD, 0 ); } @@ -777,7 +781,7 @@ if ( resID < NUM_OF_DG_RESERVOIRS ) { dgActiveReservoirSet = resID; - dgCmdResp.commandID = DG_CMD_NONE; + dgCmdResp[ DG_CMD_SWITCH_RESERVOIR ].commandID = DG_CMD_NONE; sendDGSwitchReservoirCommand( (U32)resID ); } else @@ -796,7 +800,7 @@ *************************************************************************/ void cmdStartDGFill( U32 fillToVolMl ) { - dgCmdResp.commandID = DG_CMD_NONE; + dgCmdResp[ DG_CMD_START_FILL ].commandID = DG_CMD_NONE; dgReservoirFillVolumeTargetSet = fillToVolMl; sendDGFillCommand( fillToVolMl ); } @@ -814,7 +818,7 @@ { DRAIN_RESERVOIR_CMD_PAYLOAD_T payload; - dgCmdResp.commandID = DG_CMD_NONE; + dgCmdResp[ DG_CMD_START_DRAIN ].commandID = DG_CMD_NONE; payload.drainToVolumeML = drainToVolMl; payload.tareLoadCells = tareLoadCell; dgReservoirDrainVolumeTargetSet = drainToVolMl; @@ -839,16 +843,26 @@ * The handleDGCommandResponse function processes the latest DG command response. * @details Inputs: none * @details Outputs: process command response from DG - * @param cmdRespPtr pointer to DG command response data record + * @param dgCmdRespPtr pointer to DG command response data record * @return none *************************************************************************/ -void handleDGCommandResponse( U08 *cmdRespPtr ) +void handleDGCommandResponse( DG_CMD_RESPONSE_T *dgCmdRespPtr ) { - memcpy( &dgCmdResp, cmdRespPtr, sizeof( DG_CMD_RESPONSE_T ) ); + if ( dgCmdRespPtr->commandID < NUM_OF_DG_COMMANDS ) + { + if ( DG_CMD_NONE != dgCmdRespPtr->commandID ) + { + memcpy( &dgCmdResp[ dgCmdRespPtr->commandID ], dgCmdRespPtr, sizeof( DG_CMD_RESPONSE_T ) ); + } + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_INVALID_COMMAND_RESPONSE_ID, dgCmdRespPtr->commandID ); + } - if ( TRUE == dgCmdResp.rejected ) + if ( TRUE == dgCmdRespPtr->rejected ) { - switch ( dgCmdResp.rejectCode ) + switch ( dgCmdRespPtr->rejectCode ) { case DG_CMD_REQUEST_REJECT_REASON_INVALID_PARAMETER: activateAlarmNoData( ALARM_ID_DG_COMMAND_INVALID_PARAMETER_FAULT ); @@ -869,12 +883,22 @@ * The getDGCommandResponse function gets the latest command response from DG. * @details Inputs: dgCmdResp * @details Outputs: none + * @param commandID id of specific interested command response * @param cmdRespPtr pointer to data record to copy DG command response to - * @return none + * @return TRUE if a specific command response has been received, otherwise FALSE *************************************************************************/ -void getDGCommandResponse( DG_CMD_RESPONSE_T *cmdRespPtr ) +BOOL getDGCommandResponse( U32 commandID, DG_CMD_RESPONSE_T *cmdRespPtr ) { - memcpy( cmdRespPtr, &dgCmdResp, sizeof( DG_CMD_RESPONSE_T ) ); + BOOL hasCommandResp = FALSE; + + if ( commandID == dgCmdResp[ commandID ].commandID ) + { + hasCommandResp = TRUE; + memcpy( cmdRespPtr, &dgCmdResp[ commandID ], sizeof( DG_CMD_RESPONSE_T ) ); + dgCmdResp[ commandID ].commandID = DG_CMD_NONE; + } + + return hasCommandResp; } Index: firmware/App/Controllers/DGInterface.h =================================================================== diff -u -r6e07046677cba738be6f78b155f4f23120a43081 -rc4d489831394f0954dfcddf8158baf0da09ad5c8 --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 6e07046677cba738be6f78b155f4f23120a43081) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision c4d489831394f0954dfcddf8158baf0da09ad5c8) @@ -171,8 +171,8 @@ void cmdStopDGTrimmerHeater( void ); void cmdDGSampleWater( void ); -void handleDGCommandResponse( U08 *cmdRespPtr ); -void getDGCommandResponse( DG_CMD_RESPONSE_T *cmdRespPtr ); +void handleDGCommandResponse( DG_CMD_RESPONSE_T *dgCmdRespPtr ); +BOOL getDGCommandResponse( U32 commandID, DG_CMD_RESPONSE_T *cmdRespPtr ); BOOL testSetDialOutLoadCellWeightOverride( U32 sensor, F32 value ); BOOL testResetDialOutLoadCellWeightOverride( U32 sensor ); Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r70ccc0b282f1dafcd1f6b95dd53f4efe2efd3b2b -rc4d489831394f0954dfcddf8158baf0da09ad5c8 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 70ccc0b282f1dafcd1f6b95dd53f4efe2efd3b2b) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision c4d489831394f0954dfcddf8158baf0da09ad5c8) @@ -355,8 +355,6 @@ static void execPrimeReservoirMgmt( void ) { DG_CMD_RESPONSE_T dgCmdResp; - - getDGCommandResponse( &dgCmdResp ); DG_OP_MODE_T dgOpMode = getDGOpMode(); U32 dgSubMode = getDGSubMode(); @@ -383,7 +381,7 @@ break; case PRIME_RESERVOIR_MGMT_WAIT_FOR_DRAIN_CMD_RESP: - if ( DG_CMD_START_DRAIN == dgCmdResp.commandID ) + if ( TRUE == getDGCommandResponse( DG_CMD_START_DRAIN, &dgCmdResp ) ) { if ( FALSE == dgCmdResp.rejected ) { @@ -420,7 +418,7 @@ break; case PRIME_RESERVOIR_MGMT_WAIT_FOR_FILL_CMD_RESP: - if ( DG_CMD_START_FILL == dgCmdResp.commandID ) + if ( TRUE == getDGCommandResponse( DG_CMD_START_FILL, &dgCmdResp ) ) { if ( FALSE == dgCmdResp.rejected && DG_MODE_FILL == dgOpMode ) { Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r19fc8f015489be63932eed969d28329d123332e0 -rc4d489831394f0954dfcddf8158baf0da09ad5c8 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 19fc8f015489be63932eed969d28329d123332e0) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision c4d489831394f0954dfcddf8158baf0da09ad5c8) @@ -242,6 +242,7 @@ SW_FAULT_ID_HD_INVALID_DRY_SELF_TEST_STATE, SW_FAULT_ID_HD_INVALID_WET_SELF_TEST_STATE, SW_FAULT_ID_HD_INVALID_PRE_TREATMENT_RECIRC_STATE, + SW_FAULT_ID_HD_INVALID_COMMAND_RESPONSE_ID, // 100 NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rbd552b98354cef7d9c028f25635e0334c7aecf28 -rc4d489831394f0954dfcddf8158baf0da09ad5c8 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision bd552b98354cef7d9c028f25635e0334c7aecf28) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision c4d489831394f0954dfcddf8158baf0da09ad5c8) @@ -686,8 +686,11 @@ if ( messagePtr->hdr.payloadLen == sizeof( DG_CMD_RESPONSE_T ) ) { + DG_CMD_RESPONSE_T dgCmdResponse; + result = TRUE; - handleDGCommandResponse( messagePtr->payload ); + memcpy( &dgCmdResponse, messagePtr->payload, sizeof( DG_CMD_RESPONSE_T ) ); + handleDGCommandResponse( &dgCmdResponse ); } sendAckResponseMsg( (MSG_ID_T)messagePtr->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_DG, result );