Index: firmware/App/Modes/ModeROPermeateSample.c =================================================================== diff -u -ra12e1212c1cf49011ed8d65beaf9416ca18ffe98 -rb644e09158661395c03a07f869eed78c77188e7a --- firmware/App/Modes/ModeROPermeateSample.c (.../ModeROPermeateSample.c) (revision a12e1212c1cf49011ed8d65beaf9416ca18ffe98) +++ firmware/App/Modes/ModeROPermeateSample.c (.../ModeROPermeateSample.c) (revision b644e09158661395c03a07f869eed78c77188e7a) @@ -59,12 +59,14 @@ NUM_OF_COLLECT_SAMPLE_STATES ///< Number of collect sample states. } COLLECT_SAMPLE_STATES_T; -/// Dispense request message status structure -typedef struct +/// Dispense message status enum +typedef enum Dispense_Message_Status { - BOOL hasMessageBeenReceived; ///< Dispense message request flag to indicate message has been received. - BOOL signalContinueDispensing; ///< Dispense message request flag to indicate whether continue dispensing or not. -} DISPENSE_RQST_MSG_STATUS_T; + DISPENSE_MSG_NOT_RECEIVED = 0, ///< Dispense message not received. + DISPENSE_MSG_DISPENSE, ///< Dispense message dispense. + DISPENSE_MSG_STOP, ///< Dispense message stop. + NUM_OF_DISPENSE_MSG ///< Number of dispense messages. +} DISPENSE_MSG_STATUS_T; static DG_RO_PERM_STATE_T roPermeateSampleState; ///< Mode RO permeate sample state. static DG_RO_PERM_STATE_T roPermeateSamplePrevState; ///< Mode RO permeate sample previous state. @@ -76,7 +78,7 @@ static F32 roPermeateSampledispensedVolumeML; ///< Mode RO permeate sample dispensed volume in milliliters. static BOOL isReservoirFull; ///< Mode RO permeate sample flag to indicate reservoir 2 is filled. static COLLECT_SAMPLE_STATES_T collectSampleSubState; ///< Mode RO permeate sample collect sample substate. -static DISPENSE_RQST_MSG_STATUS_T dispenseMessageStatus; ///< Mode RO permeate sample dispense message status. +static DISPENSE_MSG_STATUS_T dispenseMessageStatus; ///< Mode RO permeate sample dispense message status. // ********** private function prototypes ********** @@ -121,8 +123,7 @@ roPermeateSampledispensedVolumeML = 0.0F; isReservoirFull = FALSE; collectSampleSubState = COLLECT_SAMPLE_INITIALIZE; - dispenseMessageStatus.hasMessageBeenReceived = FALSE; - dispenseMessageStatus.signalContinueDispensing = FALSE; + dispenseMessageStatus = DISPENSE_MSG_NOT_RECEIVED; // Initialize the reservoirs rsrvrsStatus.rsrvrFillStableTime = 0; @@ -275,6 +276,14 @@ // ********** private functions ********** +/*********************************************************************//** + * @brief + * The handleROPermeateSampleStartState function handles the RO permeate + * sample start state. + * @details Inputs: none + * @details Outputs: none + * @return next state of the RO permeate sample state machine + *************************************************************************/ static DG_RO_PERM_STATE_T handleROPermeateSampleStartState( void ) { DG_RO_PERM_STATE_T state = DG_RO_PERM_SAMPLE_STATE_DRAIN_R1; @@ -284,6 +293,14 @@ return state; } +/*********************************************************************//** + * @brief + * The handleROPermeateSampleDrainR1State function handles the RO permeate + * sample drain R1 state. + * @details Inputs: none + * @details Outputs: none + * @return next state of the RO permeate sample state machine + *************************************************************************/ static DG_RO_PERM_STATE_T handleROPermeateSampleDrainR1State( void ) { DG_RO_PERM_STATE_T state = DG_RO_PERM_SAMPLE_STATE_DRAIN_R1; @@ -292,6 +309,15 @@ return state; } + +/*********************************************************************//** + * @brief + * The handleROPermeateSampleDrainR2State function handles the RO permeate + * sample drain R2 state. + * @details Inputs: none + * @details Outputs: none + * @return next state of the RO permeate sample state machine + *************************************************************************/ static DG_RO_PERM_STATE_T handleROPermeateSampleDrainR2State( void ) { DG_RO_PERM_STATE_T state = DG_RO_PERM_SAMPLE_STATE_DRAIN_R2; @@ -301,6 +327,14 @@ return state; } +/*********************************************************************//** + * @brief + * The handleROPermeateSampleFlushDrainState function handles the RO permeate + * sample flush drain state. + * @details Inputs: stateStartTimeMS + * @details Outputs: none + * @return next state of the RO permeate sample state machine + *************************************************************************/ static DG_RO_PERM_STATE_T handleROPermeateSampleFlushDrainState( void ) { DG_RO_PERM_STATE_T state = DG_RO_PERM_SAMPLE_STATE_FLUSH_DRAIN; @@ -314,6 +348,14 @@ return state; } +/*********************************************************************//** + * @brief + * The handleROPermeateSampleFlushDialysateState function handles the RO permeate + * sample flush dialysate state. + * @details Inputs: stateStartTimeMS + * @details Outputs: none + * @return next state of the RO permeate sample state machine + *************************************************************************/ static DG_RO_PERM_STATE_T handleROPermeateSampleFlushDialysateState( void ) { DG_RO_PERM_STATE_T state = DG_RO_PERM_SAMPLE_STATE_FLUSH_DIALYSATE; @@ -327,20 +369,35 @@ return state; } +/*********************************************************************//** + * @brief + * The handleROPermeateSampleFlushConcenrateStrawsState function handles + * the RO permeate sample flush concentrate straws state. + * @details Inputs: stateStartTimeMS + * @details Outputs: none + * @return next state of the RO permeate sample state machine + *************************************************************************/ static DG_RO_PERM_STATE_T handleROPermeateSampleFlushConcenrateStrawsState( void ) { DG_RO_PERM_STATE_T state = DG_RO_PERM_SAMPLE_STATE_FLUSH_CONCENTRATE_STRAWS; if ( TRUE == didTimeout( stateStartTimeMS, FLUSH_CONCENTRATE_STRAWS_TIME_MS ) ) { - rsrvrsStatus.rsrvr[ DG_RESERVOIR_2 ].rStatus = DG_RESERVOIR_BELOW_TARGET; - state = DG_RO_PERM_SAMPLE_STATE_FLUSH_R2_TO_R1_AND_DRAIN_R1; + state = DG_RO_PERM_SAMPLE_STATE_FLUSH_R2_TO_R1_AND_DRAIN_R1; setROPermeateSampleStateTransition( state ); } return state; } +/*********************************************************************//** + * @brief + * The handleROPermeateSampleFlushR2ToR1AndDrainR1State function handles + * the RO permeate sample flush R2 to R1 and drain R1 state. + * @details Inputs: stateStartTimeMS, rsrvrsStatus, isReservoirFull + * @details Outputs: stateStartTimeMS, rsrvrsStatus, isReservoirFull + * @return next state of the RO permeate sample state machine + *************************************************************************/ static DG_RO_PERM_STATE_T handleROPermeateSampleFlushR2ToR1AndDrainR1State( void ) { DG_RO_PERM_STATE_T state = DG_RO_PERM_SAMPLE_STATE_FLUSH_R2_TO_R1_AND_DRAIN_R1; @@ -360,8 +417,7 @@ if ( TRUE == didTimeout( stateStartTimeMS, RSRVR_DRAIN_BEFORE_SAMPLE_COLLECTION_MS ) ) { - stateStartTimeMS = getMSTimerCount(); - state = DG_RO_PERM_SAMPLE_STATE_COLLECT_SAMPLE; + state = DG_RO_PERM_SAMPLE_STATE_COLLECT_SAMPLE; setROPermeateSampleStateTransition( state ); } } @@ -371,6 +427,16 @@ return state; } +/*********************************************************************//** + * @brief + * The handleROPermeateSampleCollectSampleState function handles + * the RO permeate sample collect sample state. + * @details Inputs: dispenseMessageStatus, collectSampleSubState, + * roPermeateSampledispensedVolumeML + * @details Outputs: dispenseMessageStatus, collectSampleSubState, + * roPermeateSampledispensedVolumeML + * @return next state of the RO permeate sample state machine + *************************************************************************/ static DG_RO_PERM_STATE_T handleROPermeateSampleCollectSampleState( void ) { DG_RO_PERM_STATE_T state = DG_RO_PERM_SAMPLE_STATE_COLLECT_SAMPLE; @@ -379,27 +445,36 @@ { clearAlarm( ALARM_ID_DG_RO_PERMEATE_SAMPLE_REMOVE_DIA_CAP ); - if ( ( FALSE == dispenseMessageStatus.hasMessageBeenReceived ) && ( FALSE == dispenseMessageStatus.signalContinueDispensing ) ) + switch ( dispenseMessageStatus ) { - // Check alarm active is not needed - if ( ( FALSE == isAlarmActive( ALARM_ID_DG_RO_PERMEATE_SAMPLE_REMOVE_DIA_CAP ) ) && ( COLLECT_SAMPLE_INITIALIZE == collectSampleSubState ) ) - { - collectSampleSubState = COLLECT_SAMPLE_DISPENSE; - setROPermeateSampleStateTransition( state ); - } - } - else if ( TRUE == dispenseMessageStatus.hasMessageBeenReceived ) - { - if ( ( TRUE == dispenseMessageStatus.signalContinueDispensing ) && ( FALSE == isROPumpRunning() ) ) - { - collectSampleSubState = COLLECT_SAMPLE_DISPENSE; - setROPermeateSampleStateTransition( state ); - } - else if ( FALSE == dispenseMessageStatus.signalContinueDispensing ) - { + case DISPENSE_MSG_NOT_RECEIVED: + // Check alarm active is not needed + if ( ( FALSE == isAlarmActive( ALARM_ID_DG_RO_PERMEATE_SAMPLE_REMOVE_DIA_CAP ) ) && ( COLLECT_SAMPLE_INITIALIZE == collectSampleSubState ) ) + { + collectSampleSubState = COLLECT_SAMPLE_DISPENSE; + setROPermeateSampleStateTransition( state ); + } + break; + + case DISPENSE_MSG_DISPENSE: + if ( FALSE == isROPumpRunning() ) + { + collectSampleSubState = COLLECT_SAMPLE_DISPENSE; + dispenseMessageStatus = DISPENSE_MSG_NOT_RECEIVED; + setROPermeateSampleStateTransition( state ); + } + break; + + case DISPENSE_MSG_STOP: collectSampleSubState = COLLECT_SAMPLE_STOP; + dispenseMessageStatus = DISPENSE_MSG_NOT_RECEIVED; setROPermeateSampleStateTransition( state ); - } + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_DG_RO_PERMEATE_SAMPLE_INVALID_MESSAGE, dispenseMessageStatus ) + dispenseMessageStatus = DISPENSE_MSG_NOT_RECEIVED; + break; } if ( TRUE == isROPumpRunning() ) @@ -420,6 +495,14 @@ return state; } +/*********************************************************************//** + * @brief + * The handleROPermeateSampleCancelBasicPathState function handles + * the RO permeate sample cancel basic path state. + * @details Inputs: none + * @details Outputs: none + * @return next state of the RO permeate sample state machine + *************************************************************************/ static DG_RO_PERM_STATE_T handleROPermeateSampleCancelBasicPathState( void ) { DG_RO_PERM_STATE_T state = DG_RO_PERM_SAMPLE_STATE_CANCEL_BASIC_PATH; @@ -429,6 +512,14 @@ return state; } +/*********************************************************************//** + * @brief + * The handleROPermeateSampleCancelWaterPathState function handles + * the RO permeate sample cancel water path state. + * @details Inputs: stateStartTimeMS, rsrvrsStatus + * @details Outputs: stateStartTimeMS, rsrvrsStatus, alarmDetectedPendingTrigger + * @return next state of the RO permeate sample state machine + *************************************************************************/ static DG_RO_PERM_STATE_T handleROPermeateSampleCancelWaterPathState( void ) { DG_RO_PERM_STATE_T state = DG_RO_PERM_SAMPLE_STATE_CANCEL_WATER_PATH; @@ -470,6 +561,14 @@ return state; } +/*********************************************************************//** + * @brief + * The handleROPermeateSampleCompleteState function handles + * the RO permeate sample complete state. + * @details Inputs: none + * @details Outputs: none + * @return next state of the RO permeate sample state machine + *************************************************************************/ static DG_RO_PERM_STATE_T handleROPermeateSampleCompleteState( void ) { DG_RO_PERM_STATE_T state = DG_RO_PERM_SAMPLE_STATE_COMPLETE; @@ -479,7 +578,6 @@ return state; } - /*********************************************************************//** * @brief * The failROPermeateSample function sets the alarm that failed the RO @@ -569,6 +667,16 @@ } } +/*********************************************************************//** + * @brief + * The setROPermeateSampleStateTransition function handles setting the + * actuators and variables prior to transitioning to an RO permeate sample state. + * @details Inputs: collectSampleSubState + * @details Outputs: stateStartTimeMS, rsrvrsStatus, isReservoirFull, + * collectSampleSubState, roPermeateSampledispensedVolumeML, dispenseMessageStatus + * @param state which is the state to prepare the actuators and variables + * @return none + *************************************************************************/ static void setROPermeateSampleStateTransition( DG_RO_PERM_STATE_T state ) { switch( state ) @@ -597,6 +705,7 @@ signalROPumpHardStop(); // Drain pump setDrainPumpTargetRPM( RSRVR_DRAIN_TARGET_RPM ); + // Variables stateStartTimeMS = getMSTimerCount(); break; @@ -624,6 +733,7 @@ signalROPumpHardStop(); // Drain pump setDrainPumpTargetRPM( RSRVR_DRAIN_TARGET_RPM ); + // Variables stateStartTimeMS = getMSTimerCount(); break; @@ -651,6 +761,7 @@ signalROPumpHardStop(); // Drain pump signalDrainPumpHardStop(); + // Variables stateStartTimeMS = getMSTimerCount(); break; @@ -678,6 +789,7 @@ setROPumpTargetFlowRateLPM( RO_PUMP_TARGET_FLOW_RATE_LPM, RO_PUMP_MAX_PRESSURE_PSI ); // Drain pump signalDrainPumpHardStop(); + // Variables stateStartTimeMS = getMSTimerCount(); break; @@ -708,6 +820,7 @@ setROPumpTargetFlowRateLPM( RO_PUMP_TARGET_FLOW_RATE_LPM, RO_PUMP_MAX_PRESSURE_PSI ); // Drain pump signalDrainPumpHardStop(); + // Variables stateStartTimeMS = getMSTimerCount(); break; @@ -735,7 +848,10 @@ setROPumpTargetFlowRateLPM( RO_PUMP_TARGET_FLOW_RATE_LPM, RO_PUMP_MAX_PRESSURE_PSI ); // Drain pump setDrainPumpTargetRPM( RSRVR_DRAIN_TARGET_RPM ); - stateStartTimeMS = getMSTimerCount(); + // Setup the variables for the next state + rsrvrsStatus.rsrvr[ DG_RESERVOIR_2 ].rStatus = DG_RESERVOIR_BELOW_TARGET; + stateStartTimeMS = getMSTimerCount(); + isReservoirFull = FALSE; break; case DG_RO_PERM_SAMPLE_STATE_COLLECT_SAMPLE: @@ -746,6 +862,7 @@ activateAlarmNoData( ALARM_ID_DG_RO_PERMEATE_SAMPLE_REMOVE_DIA_CAP ); stateStartTimeMS = getMSTimerCount(); roPermeateSampledispensedVolumeML = 0.0F; + dispenseMessageStatus = DISPENSE_MSG_NOT_RECEIVED; break; case COLLECT_SAMPLE_DISPENSE: @@ -778,6 +895,12 @@ case COLLECT_SAMPLE_STOP: deenergizeActuators( NO_PARK_CONC_PUMPS ); break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_DG_RO_PERMEATE_SAMPLE_INVALID_COLLECTION_STATE_SELECTED, + collectSampleSubState ) + collectSampleSubState = COLLECT_SAMPLE_INITIALIZE; + break; } break; @@ -806,6 +929,7 @@ signalROPumpHardStop(); // Drain pump setDrainPumpTargetRPM( RSRVR_DRAIN_TARGET_RPM ); + // Variables stateStartTimeMS = getMSTimerCount(); rsrvrsStatus.rsrvr[ DG_RESERVOIR_1 ].rStatus = DG_RESERVOIR_BELOW_TARGET; rsrvrsStatus.rsrvr[ DG_RESERVOIR_2 ].rStatus = DG_RESERVOIR_ABOVE_TARGET; @@ -814,6 +938,10 @@ case DG_RO_PERM_SAMPLE_STATE_COMPLETE: deenergizeActuators( NO_PARK_CONC_PUMPS ); break; + + default: + // Do nothing + break; } } @@ -855,6 +983,16 @@ return state; } +/*********************************************************************//** + * @brief + * The checkRsrvrDrainStatus function checks and manages the status + * of reservoir drain status + * @details Inputs: rsrvrsStatus, stateStartTimeMS + * @details Outputs: rsrvrsStatus, stateStartTimeMS + * @param rsrvrID the reservoir ID to check the status of the timeout + * @param state the state of the RO permeate sample mode + * @return: state of the RO permeate sample mode + *************************************************************************/ static DG_RO_PERM_STATE_T checkRsrvrDrainStatus( DG_RESERVOIR_ID_T rsrvrID, DG_RO_PERM_STATE_T state ) { if ( DG_RESERVOIR_ABOVE_TARGET == rsrvrsStatus.rsrvr[ rsrvrID ].rStatus )