Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r631df8130cb75938e0f496f0518ad52134bc5656 -rade9db1aa022146c405a2aeca846cd9bd15b05ce --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 631df8130cb75938e0f496f0518ad52134bc5656) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision ade9db1aa022146c405a2aeca846cd9bd15b05ce) @@ -209,6 +209,8 @@ conductivitySampleCount = 0; dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; dialysateFillStartTimeMS = 0; + dialysatePauseElapsedTimeMS = 0; + dialysatePauseStartTimeMS = 0; didFillRecoverFromPause = FALSE; didFMPCheckStart = FALSE; fillCPoConductivitySampleCnt = 0; @@ -300,6 +302,7 @@ case DG_FILL_MODE_STATE_PAUSED: targetFlowLPM = TARGET_RO_FLOW_RATE_IN_PAUSE_L; havePauseActuatorsBeenSet = FALSE; + dialysatePauseStartTimeMS = getMSTimerCount(); break; } } @@ -890,8 +893,10 @@ fillStatus.fillTemperatureRunningSum += inletTemperature; // TODO: Check for open straw door status and alarm if closed - // Check if run out of time to fill the reservoir - if ( TRUE == didTimeout( dialysateFillStartTimeMS, DIALYSATE_FILL_TIME_OUT ) ) + // Check if run out of time to fill the reservoir, disregarding time paused, + // because pause time isn't the reservoir's, or loadcell's fault + // the 5 minutes DIALYSATE_FILL_TIME_OUT is a mystery number. + if ( TRUE == didTimeout( dialysateFillStartTimeMS, DIALYSATE_FILL_TIME_OUT+dialysatePauseElapsedTimeMS ) ) { activateAlarmNoData( ALARM_ID_DG_DIALYSATE_FILL_OUT_OF_TIME ); } @@ -961,6 +966,11 @@ fillStatus.fillTemperatureRunningSum = 0.0F; fillStatus.fillSampleCounter = 0; fillStatus.fillLastTemperature = inletTemperature; + // clear max fill time tracking + dialysateFillStartTimeMS = 0; + dialysatePauseElapsedTimeMS = 0; + dialysatePauseStartTimeMS = 0; + didFillRecoverFromPause = FALSE; calculateHeaterEstimationGain( DG_PRIMARY_HEATER ); requestNewOperationMode( DG_MODE_GENE ); @@ -1008,6 +1018,31 @@ *************************************************************************/ static void setModeFillStateTransition( DG_FILL_MODE_STATE_T state ) { + // Execute state cleanup on exit + if ( state != fillState ) + { + switch( fillState ) + { + // Do nothing + case DG_FILL_MODE_STATE_TEST_INLET_WATER: + case DG_FILL_MODE_STATE_PRIME_CONCENTRATE_LINES: + case DG_FILL_MODE_STATE_FLUSH_BUBBLES: + case DG_FILL_MODE_STATE_TEST_BICARB_CONDUCTIVITY: + case DG_FILL_MODE_STATE_TEST_ACID_CONDUCTIVITY: + case DG_FILL_MODE_STATE_PRODUCE_DIALYSATE: + case DG_FILL_MODE_STATE_DELIVER_DIALYSATE: + break; + + case DG_FILL_MODE_STATE_PAUSED: + dialysatePauseElapsedTimeMS += calcTimeSince(dialysatePauseStartTimeMS); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_FILL_MODE_INVALID_EXEC_STATE, state ) + break; + } + } + // Execute on running state switch( state ) { case DG_FILL_MODE_STATE_TEST_INLET_WATER: @@ -1087,6 +1122,7 @@ case DG_FILL_MODE_STATE_PAUSED: if ( FALSE == havePauseActuatorsBeenSet ) { + dialysatePauseStartTimeMS = getMSTimerCount(); setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); setROPumpTargetFlowRateLPM( TARGET_RO_FLOW_RATE_IN_PAUSE_L, TARGET_RO_PRESSURE_PSI ); requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, NO_PARK_CONC_PUMPS );