Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r1da5fe992c0b461115912698afc9cc7039ad2df3 -rf19f59af0cf694c63d58b7ecfc66989167b92b26 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 1da5fe992c0b461115912698afc9cc7039ad2df3) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision f19f59af0cf694c63d58b7ecfc66989167b92b26) @@ -116,10 +116,13 @@ static U32 dataPublishCounter; ///< Used to schedule dialysate fill data publication to CAN bus. static DG_FILL_MODE_STATE_T fillState; ///< Currently active fill state. -static U32 dialysateFillStartTimeMS; ///< Current time when starting to fill dialysate in milliseconds. static F32 reservoirBaseWeight; ///< Fill reservoir base weight. static FILL_CONDITION_STATUS_T fillStatus; ///< Fill condition status. +static BOOL didFillRecoverFromPause; ///< Flag to indicate whether the previous state was pause or not. +static U32 dialysateFillStartTimeMS; ///< Current time when starting to fill dialysate in milliseconds. +static U32 dialysatePauseStartTimeMS; ///< Current time when starting a pause during fill dialysate in milliseconds. +static U32 dialysatePauseElapsedTimeMS; ///< Elapsed time in pause during fill dialysate in milliseconds. static U32 concentrateTestStartTime; ///< Starting time for concentrate test. static U32 concentratePrimingStartTime; ///< Starting time for concentrate priming. static U32 flushBubblesStartTime; ///< Starting time for flush bubbles. @@ -146,7 +149,6 @@ static U32 pumpSpeedIndex; ///< Index used to access the desired pump speed in roPumpFlushBubblesSpeed table. static BOOL havePauseActuatorsBeenSet; ///< Flag to indicate the actuators have been set to pause for the first time. -static BOOL didFillRecoverFromPause; ///< Flag to indicate whether the previous state was pause or not. static FILL_ACID_BICARB_TYPES_T chemicalsTypes; ///< Chemicals Types (acid and bicarb). static DG_CHEMICALS_FILL_COND_CAL_RECORD_T chemicalsCond; ///< Chemicals fill conductivity records. static F32 acidMixRatio; ///< Acid conductivity mix ratio. @@ -194,32 +196,34 @@ getAcidConcentrateCalRecord( &acid ); getBicarbConcentrateCalRecord( &bicarb ); + acidConductivitySampleCount = 0; + acidConductivityTotal = 0.0F; acidMixRatio = acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConcMixRatio; + averageAcidConductivity = 0.0F; + averageBicarbConductivity = 0.0F; + bicarbConductivitySampleCount = 0; + bicarbConductivityTotal = 0.0F; bicarbMixRatio = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbConcMixRatio; - fillState = DG_FILL_MODE_STATE_TEST_INLET_WATER; - dialysateFillStartTimeMS = 0; - dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; - reservoirBaseWeight = 0.0F; - integratedVolumeML.data = 0.0F; - didFMPCheckStart = FALSE; concentrateTestStartTime = 0; - acidConductivityTotal = 0.0F; - bicarbConductivityTotal = 0.0F; - conductivitySampleCount = 0; concPumpPrimeStartTimeMS = getMSTimerCount(); - pumpSpeedIndex = 0; - averageBicarbConductivity = 0.0F; - averageAcidConductivity = 0.0F; - pctDiffInConductivity = 0.0F; - bicarbConductivitySampleCount = 0; - acidConductivitySampleCount = 0; - totalBicarbConductivity = 0.0F; - totalAcidConductivity = 0.0F; + conductivitySampleCount = 0; + dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; + dialysateFillStartTimeMS = 0; + dialysatePauseElapsedTimeMS = 0; + dialysatePauseStartTimeMS = 0; + didFillRecoverFromPause = FALSE; + didFMPCheckStart = FALSE; + fillCPoConductivitySampleCnt = 0; + fillState = DG_FILL_MODE_STATE_TEST_INLET_WATER; havePauseActuatorsBeenSet = FALSE; + integratedVolumeML.data = 0.0F; + pctDiffInConductivity = 0.0F; + pumpSpeedIndex = 0; + reservoirBaseWeight = 0.0F; sumFillCPoConductivity = 0.0F; sumFillRejRatio = 0.0F; - fillCPoConductivitySampleCnt = 0; - didFillRecoverFromPause = FALSE; + totalAcidConductivity = 0.0F; + totalBicarbConductivity = 0.0F; } /*********************************************************************//** @@ -290,14 +294,14 @@ requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); - dialysateFillStartTimeMS = getMSTimerCount(); fillStatus.isThisFirstFill = FALSE; break; case DG_FILL_MODE_STATE_PAUSED: targetFlowLPM = TARGET_RO_FLOW_RATE_IN_PAUSE_L; havePauseActuatorsBeenSet = FALSE; + dialysatePauseStartTimeMS = getMSTimerCount(); break; } } @@ -888,8 +892,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 ); } @@ -959,6 +965,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 ); @@ -1001,11 +1012,37 @@ * concentratePrimingStartTime, totalBicarbConductivity, averageBicarbConductivity, * bicarbConductivitySampleCount, concentrateTestStartTime, fillStatus, * havePauseActuatorsBeenSet, flushBubblesStartTime, didFillRecoverFromPause + * dialysatePauseElapsedTimeMS, dialysatePauseStartTimeMS * @param state mode fill state enum * @return none *************************************************************************/ 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: @@ -1085,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 );