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