Index: firmware/App/Modes/TreatmentEnd.c =================================================================== diff -u -r89f4c7f0995e2094b3f26fc7e7e12371e847abac -r6b870cd0699bb3ee22b93981d51373a6c2d56162 --- firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision 89f4c7f0995e2094b3f26fc7e7e12371e847abac) +++ firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision 6b870cd0699bb3ee22b93981d51373a6c2d56162) @@ -37,13 +37,17 @@ #define TX_END_BP_FLOW_RATE_ML_MIN 100 /// Max time to wait for user to initiate final rinseback. -#define TX_END_TIMEOUT_MS ( ( 15 * 60 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) // TODO - get time from Systems +static const U32 TX_END_TIMEOUT_MS = ( ( 15 * 60 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ); // TODO - get time from Systems +/// Maximum time in this mode before blood sitting warning given (in general task intervals). +static const U32 MAX_TIME_BLOOD_SITTING = ( ( 5 * SEC_PER_MIN * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ); + // ********** private data ********** static TREATMENT_END_STATE_T treatmentEndState; ///< Current state of the treatment end sub-mode. static U32 txEndTimerCtr; ///< Timer counter (in GP task intervals) counts time spent waiting for user to initiate final rinseback. +static U32 bloodSittingTimerCtr; ///< Timer counter tracks time in paused state while blood is sitting. static BOOL txEndAlarmResumeRequested; ///< Flag indicates user requesting resume from alarm. static BOOL txEndAlarmRinsebackRequested; ///< Flag indicates user requesting rinseback from alarm. @@ -74,6 +78,7 @@ { treatmentEndState = TREATMENT_END_WAIT_FOR_RINSEBACK_STATE; txEndTimerCtr = 0; + bloodSittingTimerCtr = 0; resetTreatmentEndFlags(); } @@ -139,6 +144,7 @@ setValvePosition( VBV, VALVE_POSITION_B_OPEN ); // Start blood pump at Tx End slow flow rate setBloodPumpTargetFlowRate( TX_END_BP_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + bloodSittingTimerCtr = 0; // Start air trap leveling control startAirTrapControl(); } @@ -238,6 +244,8 @@ { TREATMENT_END_STATE_T result = TREATMENT_END_PAUSED_STATE; + bloodSittingTimerCtr++; + // Is final rinseback requested? if ( ( TRUE == txEndRinsebackRequested ) || ( TRUE == txEndAlarmRinsebackRequested ) ) { @@ -254,6 +262,14 @@ { signalEndTreatment(); } + else + { + // Ensure we do not sit in stopped state for too long + if ( bloodSittingTimerCtr > MAX_TIME_BLOOD_SITTING ) + { + activateAlarmNoData( ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK ); + } + } return result; }