Index: firmware/App/Modes/ModeGenIdle.c =================================================================== diff -u -ref46e2aa7eba74dabd99bfcd9e6b38b8ce77820c -r0c599603188536e9d329fbd60a8768affd0c49a2 --- firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision ef46e2aa7eba74dabd99bfcd9e6b38b8ce77820c) +++ firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision 0c599603188536e9d329fbd60a8768affd0c49a2) @@ -45,16 +45,13 @@ #define TARGET_RO_PRESSURE_PSI 130 ///< Target pressure for RO pump. #define TARGET_RO_FLOW_RATE_L 0.3 ///< Target flow rate for RO pump. -#define TARGET_FLUSH_WATER_RO_FLOW_RATE_L 0.3 ///< Target flow rate for RO pump. TODO: determine the flow rate - /// The time of HD lost comm before DG transition back to standby. #define HD_LOST_COMM_TIMEOUT_MS (5 * SEC_PER_MIN * MS_PER_SECOND ) // ********** private data ********** static DG_GEN_IDLE_MODE_STATE_T genIdleState; ///< Currently active generation idle state. static DG_GEN_IDLE_MODE_BAD_FILL_STATE_T badFillState; ///< Current active bad fill state. -static F32 flushWaterVolumeL = 0.0; ///< Volume of water pumped by RO pump during flush water state. static U32 hdLostCommStartTime_ms = 0; ///< Lost communication with HD start time in ms. // ********** private function prototypes ********** @@ -79,8 +76,7 @@ void initGenIdleMode( void ) { genIdleState = DG_GEN_IDLE_MODE_STATE_START; - badFillState = DG_HANDLE_BAD_FILL_STATE_FIRST_DRAIN; - flushWaterVolumeL = 0.0; +// badFillState = DG_HANDLE_BAD_FILL_STATE_FIRST_DRAIN; hdLostCommStartTime_ms = 0; } @@ -118,7 +114,7 @@ // because the initial guess in the heaters driver needs the target flow to calculate // the new PWMs for the main and small primary heaters #ifndef DISABLE_FLOW_CONTROL_TREATMENT - setROPumpTargetFlowRateLPM( TARGET_FLUSH_WATER_RO_FLOW_RATE_L, TARGET_RO_PRESSURE_PSI ); + setROPumpTargetFlowRateLPM( TARGET_RO_FLOW_RATE_L, TARGET_RO_PRESSURE_PSI ); setHeaterTargetTemperature( DG_PRIMARY_HEATER, getPrimaryHeaterTargetTemperature() ); startHeater( DG_PRIMARY_HEATER ); #endif @@ -187,6 +183,7 @@ switch ( genIdleState ) { case DG_GEN_IDLE_MODE_STATE_START: + badFillState = DG_HANDLE_BAD_FILL_STATE_START; genIdleState = handleIdleStartState(); break; @@ -219,7 +216,8 @@ { DG_GEN_IDLE_MODE_STATE_T result = DG_GEN_IDLE_MODE_STATE_START; - if ( TRUE == isBadFill() ) // bad fill due to conductivity is out of range and assume bottles need prime +// if ( TRUE == isBadFill() ) // bad fill due to conductivity is out of range and assume bottles need prime + if ( TRUE == isAvgConductivityOutOfRange() ) { result = DG_GEN_IDLE_MODE_STATE_HANDLE_BAD_FILL ; } @@ -304,10 +302,9 @@ *************************************************************************/ static DG_GEN_IDLE_MODE_BAD_FILL_STATE_T handleFirstDrainState( void ) { - DG_GEN_IDLE_MODE_BAD_FILL_STATE_T result = DG_HANDLE_BAD_FILL_STATE_FIRST_DRAIN; + DG_GEN_IDLE_MODE_BAD_FILL_STATE_T result = DG_HANDLE_BAD_FILL_STATE_FLUSH_FILL; // after first drain is completed, go to next sub-state requestNewOperationMode( DG_MODE_DRAI ); // go to drain mode to empty bad dialysate because this is a bad fill - result = DG_HANDLE_BAD_FILL_STATE_FLUSH_FILL; // after first drain is completed, go to next sub-state return result; } @@ -324,9 +321,21 @@ { DG_GEN_IDLE_MODE_BAD_FILL_STATE_T result = DG_HANDLE_BAD_FILL_STATE_FLUSH_FILL; - requestNewOperationMode( DG_MODE_FILL ); // When fill is completed, it goes to generation idle mode (DG_GEN_IDLE_MODE_STATE_START) - result = DG_HANDLE_BAD_FILL_STATE_SECOND_DRAIN; // (idle 1.2) + if ( FALSE == isAlarmActive( ALARM_ID_FILL_CONDUCTIVITY_OUT_OF_RANGE ) ) // alarm is no longer active - cleared by user + { + // TODO fill only up to 1000 mL not 1500 mL + requestNewOperationMode( DG_MODE_FILL ); // When fill is completed, it goes to generation idle mode (DG_GEN_IDLE_MODE_STATE_START) + if ( TRUE == isAvgConductivityOutOfRange() ) + { + result = DG_HANDLE_BAD_FILL_STATE_FIRST_DRAIN; + } + else + { + result = DG_HANDLE_BAD_FILL_STATE_SECOND_DRAIN; // (idle 1.2) + } + } + return result; } @@ -340,10 +349,9 @@ *************************************************************************/ static DG_GEN_IDLE_MODE_BAD_FILL_STATE_T handleSecondDrainState( void ) { - DG_GEN_IDLE_MODE_BAD_FILL_STATE_T result = DG_HANDLE_BAD_FILL_STATE_SECOND_DRAIN; + DG_GEN_IDLE_MODE_BAD_FILL_STATE_T result = DG_HANDLE_BAD_FILL_STATE_REFILL; // after second drain completed, go to refill sub-state (idle 1.3) requestNewOperationMode( DG_MODE_DRAI ); // go to drain mode to empty bad dialysate because this is a bad fill - result = DG_HANDLE_BAD_FILL_STATE_REFILL; // after second drain completed, go to refill sub-state (idle 1.3) return result; } @@ -358,10 +366,11 @@ *************************************************************************/ static DG_GEN_IDLE_MODE_BAD_FILL_STATE_T handleRefillState( void ) { - DG_GEN_IDLE_MODE_BAD_FILL_STATE_T result = DG_HANDLE_BAD_FILL_STATE_REFILL; + DG_GEN_IDLE_MODE_BAD_FILL_STATE_T result = DG_HANDLE_BAD_FILL_STATE_CLEAR_ALARM; // (idle 1.4) + // TODO fill only up to 1500 mL not 1000 mL + requestNewOperationMode( DG_MODE_FILL ); - result = DG_HANDLE_BAD_FILL_STATE_CLEAR_ALARM; // (idle 1.4) return result; } @@ -376,7 +385,7 @@ *************************************************************************/ static DG_GEN_IDLE_MODE_BAD_FILL_STATE_T handleClearAlarmState( void ) { - DG_GEN_IDLE_MODE_BAD_FILL_STATE_T result = DG_HANDLE_BAD_FILL_STATE_CLEAR_ALARM; + DG_GEN_IDLE_MODE_BAD_FILL_STATE_T result = DG_HANDLE_BAD_FILL_STATE_START; // clear wait for dialysate alarm condition to allow resume clearAlarmCondition( ALARM_ID_CREATING_DIALYSATE_PLEASE_WAIT ); // resume option will appear