Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -re23087e0c17f6ea81d60641fdb52121a8dd5a099 -r27f3db92495948d4c1192421c1b0c20338c4a034 --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision e23087e0c17f6ea81d60641fdb52121a8dd5a099) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 27f3db92495948d4c1192421c1b0c20338c4a034) @@ -109,7 +109,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 ********** @@ -157,9 +157,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; @@ -309,11 +313,10 @@ if ( ( DG_MODE_CIRC == getDGOpMode() ) && ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == getDGSubMode() ) && ( resUseVolumeMl >= (F32)dgReservoirFillVolumeTargetSet ) ) { - DG_RESERVOIR_ID_T activeRes = dgActiveReservoirSet; - DG_RESERVOIR_ID_T inactiveRes = ( activeRes == DG_RESERVOIR_1 ? DG_RESERVOIR_2 : DG_RESERVOIR_1 ); + DG_RESERVOIR_ID_T inactiveRes = getDGInactiveReservoir(); // Signal dialysis sub-mode to capture baseline volume for next reservoir. - setStartReservoirVolume(); + setStartReservoirVolume( inactiveRes ); // Command DG to switch reservoirs cmdSetDGActiveReservoir( inactiveRes ); // Signal dialysis sub-mode to switch reservoirs @@ -760,7 +763,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 ); } @@ -775,7 +778,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 ); } @@ -793,14 +796,36 @@ 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 { - // TODO - s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_INVALID_RESERVOIR_ID, (U32)resID ); } } + +/*********************************************************************//** + * @brief + * The cmdChangeDGValveSetting function sends a change valve setting command + * message to the DG. + * @details Inputs: none + * @details Outputs: change valve setting command sent to DG. + * @param valveSettingID ID of valve setting to change to + * @return none + *************************************************************************/ +void cmdChangeDGValveSetting( DG_VALVE_SETTING_ID_T valveSettingID ) +{ + if ( valveSettingID < NUM_OF_DG_VALVE_SETTTINGS ) + { + dgCmdResp[ DG_CMD_VALVE_SETTING ].commandID = DG_CMD_NONE; + sendDGChangeValveSettingCommand( (U32)valveSettingID ); + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_INVALID_VALVE_SETTING_ID, (U32)valveSettingID ); + } +} /*********************************************************************//** * @brief @@ -812,7 +837,7 @@ *************************************************************************/ void cmdStartDGFill( U32 fillToVolMl ) { - dgCmdResp.commandID = DG_CMD_NONE; + dgCmdResp[ DG_CMD_START_FILL ].commandID = DG_CMD_NONE; dgReservoirFillVolumeTargetSet = fillToVolMl; sendDGFillCommand( fillToVolMl ); } @@ -830,7 +855,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; @@ -855,16 +880,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 ); @@ -885,12 +920,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; }