Index: firmware/App/Modes/BloodPrime.c =================================================================== diff -u -r9c3f5379ed2fbf1053bb7c446a0a1302f66459b4 -r4151ee46ace3cc66b6b7c0f276040889fe0d75e6 --- firmware/App/Modes/BloodPrime.c (.../BloodPrime.c) (revision 9c3f5379ed2fbf1053bb7c446a0a1302f66459b4) +++ firmware/App/Modes/BloodPrime.c (.../BloodPrime.c) (revision 4151ee46ace3cc66b6b7c0f276040889fe0d75e6) @@ -178,7 +178,7 @@ break; default: - // TODO - s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_BLOOD_PRIME_INVALID_STATE, bloodPrimeState ); break; } @@ -195,7 +195,7 @@ * state operations. * @details Inputs: flags * @details Outputs: flags handled - * @return next blood prime end ramp state + * @return next blood prime state *************************************************************************/ static BLOOD_PRIME_STATE_T handleBloodPrimeRampState( void ) { Index: firmware/App/Modes/Rinseback.c =================================================================== diff -u -r1942c708bc95f57e87b0bf6a472ebe824a3f38ed -r4151ee46ace3cc66b6b7c0f276040889fe0d75e6 --- firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision 1942c708bc95f57e87b0bf6a472ebe824a3f38ed) +++ firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision 4151ee46ace3cc66b6b7c0f276040889fe0d75e6) @@ -275,7 +275,7 @@ break; default: - // TODO - s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_RINSEBACK_INVALID_STATE, rinsebackState ); break; } Index: firmware/App/Modes/TreatmentEnd.c =================================================================== diff -u -r1942c708bc95f57e87b0bf6a472ebe824a3f38ed -r4151ee46ace3cc66b6b7c0f276040889fe0d75e6 --- firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision 1942c708bc95f57e87b0bf6a472ebe824a3f38ed) +++ firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision 4151ee46ace3cc66b6b7c0f276040889fe0d75e6) @@ -188,7 +188,7 @@ break; default: - // TODO - s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_TREATMENT_END_INVALID_STATE, treatmentEndState ); break; } Index: firmware/App/Modes/TreatmentRecirc.c =================================================================== diff -u -r1942c708bc95f57e87b0bf6a472ebe824a3f38ed -r4151ee46ace3cc66b6b7c0f276040889fe0d75e6 --- firmware/App/Modes/TreatmentRecirc.c (.../TreatmentRecirc.c) (revision 1942c708bc95f57e87b0bf6a472ebe824a3f38ed) +++ firmware/App/Modes/TreatmentRecirc.c (.../TreatmentRecirc.c) (revision 4151ee46ace3cc66b6b7c0f276040889fe0d75e6) @@ -191,7 +191,7 @@ break; default: - // TODO - s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_TREATMENT_RECIRC_INVALID_STATE, treatmentRecircState ); break; } Index: firmware/App/Modes/TreatmentStop.c =================================================================== diff -u -rc46815918e7cf33e8736f180094843758f1e21b2 -r4151ee46ace3cc66b6b7c0f276040889fe0d75e6 --- firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision c46815918e7cf33e8736f180094843758f1e21b2) +++ firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision 4151ee46ace3cc66b6b7c0f276040889fe0d75e6) @@ -17,7 +17,9 @@ #include "AirTrap.h" #include "BloodFlow.h" -#include "Buttons.h" +//#include "Buttons.h" +#include "DGInterface.h" +#include "DialInFlow.h" #include "DialOutFlow.h" #include "ModeTreatment.h" #include "OperationModes.h" @@ -31,10 +33,13 @@ // ********** private data ********** -TREATMENT_STOP_STATE_T currentTxStopState; ///< Current treatment stop state. +static TREATMENT_STOP_STATE_T currentTxStopState; ///< Current treatment stop state. // ********** private function prototypes ********** +static TREATMENT_STOP_STATE_T handleTreatmentStopRecircState( void ); +static TREATMENT_STOP_STATE_T handleTreatmentStopNoRecircState( void ); + /*********************************************************************//** * @brief * The initTreatmentStop function initializes the Treatment Stop sub-mode @@ -63,6 +68,9 @@ signalDialOutPumpHardStop(); // TODO - stop Heparin pump + // Start out assuming we re-circulate dialysate while stopped + setDialInPumpTargetFlowRate( DIALYSATE_FLOW_RATE_FOR_RECIRC, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + // Set valves to safe state setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); @@ -112,9 +120,70 @@ *************************************************************************/ void execTreatmentStop( void ) { - // TODO - implement + switch ( currentTxStopState ) + { + case TREATMENT_STOP_RECIRC_STATE: + currentTxStopState = handleTreatmentStopRecircState(); + break; + + case TREATMENT_STOP_NO_RECIRC_STATE: + currentTxStopState = handleTreatmentStopNoRecircState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_TREATMENT_STOP_INVALID_STATE, currentTxStopState ); + break; + } } +/*********************************************************************//** + * @brief + * The handleTreatmentStopRecircState function handles the re-circ dialysate + * state operations. + * @details Inputs: active alarms + * @details Outputs: dialysate re-circulation stopped if active alarm blocks + * @return next treatment stop state + *************************************************************************/ +static TREATMENT_STOP_STATE_T handleTreatmentStopRecircState( void ) +{ + TREATMENT_STOP_STATE_T result = TREATMENT_STOP_RECIRC_STATE; + + // if any active alarm(s) blocks dialysate re-circulation, stop it + if ( TRUE == isDialysateRecircBlocked() ) + { + signalDialInPumpHardStop(); + cmdStopDGTrimmerHeater(); + result = TREATMENT_STOP_NO_RECIRC_STATE; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The handleTreatmentStopNoRecircState function handles the no re-circ dialysate + * state operations. + * @details Inputs: none + * @details Outputs: none + * @return next treatment stop state + *************************************************************************/ +static TREATMENT_STOP_STATE_T handleTreatmentStopNoRecircState( void ) +{ + TREATMENT_STOP_STATE_T result = TREATMENT_STOP_NO_RECIRC_STATE; + + // nothing to do in this state - alarm user response will take us to appropriate next sub-mode + + return result; +} + +/*********************************************************************//** + * @brief + * The getCurrentTreatmentStopState function returns the current state of the + * treatment stop sub-mode. + * @details Inputs: currentTxStopState + * @details Outputs: none + * @return currentTxStopState + *************************************************************************/ TREATMENT_STOP_STATE_T getCurrentTreatmentStopState( void ) { return currentTxStopState; Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r49dba1e95bb3763b4c150e7a80b84a65264a7ca8 -r4151ee46ace3cc66b6b7c0f276040889fe0d75e6 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 49dba1e95bb3763b4c150e7a80b84a65264a7ca8) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 4151ee46ace3cc66b6b7c0f276040889fe0d75e6) @@ -147,7 +147,8 @@ alarmStatus.noResume = FALSE; alarmStatus.noRinseback = FALSE; alarmStatus.noEndTreatment = FALSE; - alarmStatus.noNewTreatment = FALSE; + alarmStatus.noNewTreatment = FALSE; + alarmStatus.noDialRecirc = FALSE; alarmStatus.usrACKRequired = FALSE; } @@ -547,6 +548,19 @@ /*********************************************************************//** * @brief + * The isDialysateRecircBlocked function determines whether any currently + * active alarm is blocking dialysate re-circulation. + * @details Inputs: alarmStatus + * @details Outputs: none + * @return TRUE if any active alarm prevents dialysate re-circulation, FALSE if not + *************************************************************************/ +BOOL isDialysateRecircBlocked( void ) +{ + return alarmStatus.noDialRecirc; +} + +/*********************************************************************//** + * @brief * The getCurrentAlarmStatePriority function determines the current alarm * state priority (NONE, LOW, MEDIUM, or HIGH). * @details Inputs: alarmStatus @@ -633,7 +647,8 @@ { ALARM_PRIORITY_T highestPriority = ALARM_PRIORITY_NONE; ALARM_ID_T a; - BOOL faultsActive = FALSE; + BOOL faultsActive = FALSE; + BOOL dialysateRecircBlocked = FALSE; // Update FIFOs and sub-ranks per active alarms table - for alarm ranking purposes to determine "top" alarm for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) @@ -671,14 +686,20 @@ if ( TRUE == ALARM_TABLE[ a ].alarmIsFault ) { faultsActive = TRUE; + } + // Track whether any active alarms prevent dialysate re-circulation so far + if ( TRUE == ALARM_TABLE[ a ].alarmNoDialysateRecirc ) + { + dialysateRecircBlocked = TRUE; } } } // Update alarm to display per highest priority FIFO alarmStatus.alarmsState = highestPriority; alarmStatus.alarmTop = alarmPriorityFIFO[ highestPriority ].alarmID; - alarmStatus.systemFault = faultsActive; + alarmStatus.systemFault = faultsActive; + alarmStatus.noDialRecirc = dialysateRecircBlocked; } /*********************************************************************//** Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r49dba1e95bb3763b4c150e7a80b84a65264a7ca8 -r4151ee46ace3cc66b6b7c0f276040889fe0d75e6 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 49dba1e95bb3763b4c150e7a80b84a65264a7ca8) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 4151ee46ace3cc66b6b7c0f276040889fe0d75e6) @@ -81,7 +81,8 @@ BOOL noResume; ///< Treatment may not be resumed at this time BOOL noRinseback; ///< Rinseback may not be initiated at this time BOOL noEndTreatment; ///< Ending the treatment is not an option at this time - BOOL noNewTreatment; ///< No new treatments may be started even if current treatment is ended + BOOL noNewTreatment; ///< No new treatments may be started even if current treatment is ended + BOOL noDialRecirc; ///< No dialysate re-circulation allowed at this time BOOL usrACKRequired; ///< The user must acknowledge top alarm BOOL lampOn; ///< The alarm lamp is on } COMP_ALARM_STATUS_T; @@ -238,6 +239,11 @@ SW_FAULT_ID_MODE_PRE_TREATMENT_PRIME_INVALID_STATE, SW_FAULT_ID_SYSTEM_COMM_INVALID_FRAME_SIZE, SW_FAULT_ID_SYSTEM_CMMM_CAN_TRANSMIT_REJECTED, // 95 + SW_FAULT_ID_BLOOD_PRIME_INVALID_STATE, + SW_FAULT_ID_RINSEBACK_INVALID_STATE, + SW_FAULT_ID_TREATMENT_END_INVALID_STATE, + SW_FAULT_ID_TREATMENT_RECIRC_INVALID_STATE, + SW_FAULT_ID_TREATMENT_STOP_INVALID_STATE, // 100 NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; @@ -256,6 +262,7 @@ void signalAlarmUserActionInitiated( ALARM_USER_ACTION_T action ); BOOL isAlarmActive( ALARM_ID_T alarm ); BOOL isAnyAlarmActive( void ); +BOOL isDialysateRecircBlocked( void ); ALARM_PRIORITY_T getCurrentAlarmStatePriority( void ); BOOL isAlarmRecoverable( ALARM_ID_T alarm ); void setAlarmAudioVolume( U32 volumeLevel );