Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r30f049651877229042e3f8700c8596e5b9a1e0f4 -r38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1 --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 30f049651877229042e3f8700c8596e5b9a1e0f4) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1) @@ -88,7 +88,13 @@ U32 execInitAndPOSTMode( void ) { SELF_TEST_STATUS_T testStatus = SELF_TEST_STATUS_IN_PROGRESS; + BOOL stop = isStopButtonPressed(); + if ( TRUE == stop ) + { + // Ignore stop button in this mode. + } + // TODO - send POST status on CAN // Execute current POST state *Note - these switch cases must be in same order as enum HD_POST_States Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rc539499ea2dee6d62194d573ac93b313d9e2936d -r38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision c539499ea2dee6d62194d573ac93b313d9e2936d) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1) @@ -79,6 +79,13 @@ *************************************************************************/ U32 execPreTreatmentMode( void ) { + BOOL stop = isStopButtonPressed(); + + if ( TRUE == stop ) + { + activateAlarmNoData( ALARM_ID_TREATMENT_STOPPED_BY_USER ); + } + // execute mode state machine switch ( currentPreTreatmentState ) { Index: firmware/App/Modes/ModeService.c =================================================================== diff -u -r911f6526ec3ba03ba0131681c7fb371c0abda6bb -r38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1 --- firmware/App/Modes/ModeService.c (.../ModeService.c) (revision 911f6526ec3ba03ba0131681c7fb371c0abda6bb) +++ firmware/App/Modes/ModeService.c (.../ModeService.c) (revision 38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1) @@ -62,6 +62,13 @@ *************************************************************************/ U32 execServiceMode( void ) { + BOOL stop = isStopButtonPressed(); + + if ( TRUE == stop ) + { + // Ignore stop button in this mode. + } + return 0; // TODO - return current state } Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r1b27784f400d03678a1441cd70ab1c4111bbfa04 -r38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 1b27784f400d03678a1441cd70ab1c4111bbfa04) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1) @@ -30,6 +30,7 @@ #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "Timers.h" +#include "TreatmentEnd.h" #include "TreatmentRecirc.h" #include "TreatmentStop.h" #include "Utilities.h" @@ -84,8 +85,9 @@ static BOOL initiateRinsebackAlarmResponseRequest; ///< Flag indicates user has requested rinseback. static BOOL endTreatmentAlarmResponseRequest; ///< Flag indicates user has requested treatment end. static BOOL rinsebackToStoppedRequest; ///< Flag indicates user has requested return to treatment from rinseback workflow. -static BOOL rinsebackToEndTreatmentRequest; ///< Flag indicates user has requested end of treatment from rinseback workflow. +static BOOL endTreatmentRequest; ///< Flag indicates user has requested end of treatment from rinseback workflow. static BOOL rinsebackToRecircRequest; ///< Flag indicates user has requested to proceed to re-circulate sub-mode. +static BOOL treatmentEndToRinsebackRequest; ///< Flag indicates user has requested final rinseback. static U32 pendingParamChangesTimer; ///< User required to confirm UF volume change within 1 minute. static F32 pendingUFVolumeChange; ///< An ultrafiltration volume change (mL) is pending user confirmation. @@ -102,6 +104,7 @@ static TREATMENT_STATE_T handleTreatmentStopState( void ); static TREATMENT_STATE_T handleTreatmentRinsebackState( void ); static TREATMENT_STATE_T handleTreatmentRecircState( void ); +static TREATMENT_STATE_T handleTreatmentEndState( void ); /*********************************************************************//** * @brief @@ -150,8 +153,9 @@ initiateRinsebackAlarmResponseRequest = FALSE; endTreatmentAlarmResponseRequest = FALSE; rinsebackToStoppedRequest = FALSE; - rinsebackToEndTreatmentRequest = FALSE; + endTreatmentRequest = FALSE; rinsebackToRecircRequest = FALSE; + treatmentEndToRinsebackRequest = FALSE; } /*********************************************************************//** @@ -167,11 +171,12 @@ initTreatmentMode(); initTreatmentReservoirMgmt(); // Initialize treatment sub-modes each time we transition to treatment mode + // initBloodPrime(); TODO initDialysis(); initTreatmentStop(); initRinseback(); initTreatmentRecirc(); - // TODO - init treatment end sub-mode + initTreatmentEnd(); } /*********************************************************************//** @@ -291,22 +296,35 @@ * @details Outputs: rinsebackToStoppedRequest * @return none *************************************************************************/ -void signalRinsebackToTreatmentStopped( void ) +void signalGoToTreatmentStopped( void ) { rinsebackToStoppedRequest = TRUE; } /*********************************************************************//** * @brief + * The signalGoToRinseback function signals that user wants to perform + * a rinseback operation. + * @details Inputs: none + * @details Outputs: rinsebackRequested + * @return none + *************************************************************************/ +void signalGoToRinseback( void ) +{ + treatmentEndToRinsebackRequest = TRUE; +} + +/*********************************************************************//** + * @brief * The signalRinsebackToTreatmentEnd function signals that user wants to end the * treatment from rinseback workflow. * @details Inputs: none * @details Outputs: rinsebackToEndTreatmentRequest * @return none *************************************************************************/ -void signalRinsebackToTreatmentEnd( void ) +void signalEndTreatment( void ) { - rinsebackToEndTreatmentRequest = TRUE; + endTreatmentRequest = TRUE; } /*********************************************************************//** @@ -366,13 +384,12 @@ break; case TREATMENT_DIALYSIS_END_STATE: - // TODO - implement + currentTreatmentState = handleTreatmentEndState(); break; case TREATMENT_END_STATE: - // TODO - implement endAirTrapControl(); // TODO - move to appropriate place - requestNewOperationMode( MODE_POST ); // TODO - test code - remove later + requestNewOperationMode( MODE_POST ); break; default: @@ -477,13 +494,15 @@ U32 newTime = getMSTimerCount(); U32 msSinceLast = calcTimeBetween( lastTreatmentTimeStamp, newTime ); + // Handle alarm signals if ( TRUE == alarmStopSignalled ) { alarmStopSignalled = FALSE; stopDialysis(); transitionToTreatmentStop(); result = TREATMENT_STOP_STATE; } + // Execute dialysis sub-mode else { // Update treatment time (unless delivering a saline bolus) @@ -496,7 +515,10 @@ // End treatment if treatment duration has been reached if ( CALC_ELAPSED_TREAT_TIME_IN_SECS() >= presTreatmentTimeSecs ) { - result = TREATMENT_END_STATE; + stopDialysis(); + transitionToTreatmentEnd(); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_END_OF_DIALYSIS_TREATMENT_WARNING, presTreatmentTimeSecs ); + result = TREATMENT_DIALYSIS_END_STATE; } // Otherwise, execute state machine for treatment dialysis sub-mode else @@ -572,30 +594,29 @@ { TREATMENT_STATE_T result = TREATMENT_RINSEBACK_STATE; + // Handle alarm signals if ( TRUE == alarmStopSignalled ) { alarmStopSignalled = FALSE; signalStopRinseback(); } + // Execute treatment re-circ sub-mode execRinseback(); + // Handle signals from treatment end sub-mode if ( TRUE == rinsebackToRecircRequest ) { - rinsebackToRecircRequest = FALSE; transitionToTreatmentRecirc(); result = TREATMENT_RECIRC_STATE; } else if ( TRUE == rinsebackToStoppedRequest ) { - rinsebackToStoppedRequest = FALSE; transitionToTreatmentStop(); result = TREATMENT_STOP_STATE; } - else if ( TRUE == rinsebackToEndTreatmentRequest ) + else if ( TRUE == endTreatmentRequest ) { - rinsebackToEndTreatmentRequest = FALSE; - // TODO - transition to end state result = TREATMENT_END_STATE; } @@ -614,24 +635,24 @@ { TREATMENT_STATE_T result = TREATMENT_RECIRC_STATE; + // Handle alarm signals if ( TRUE == alarmStopSignalled ) { - alarmStopSignalled = FALSE; signalStopTreatmentRecirc(); } + // Execute treatment re-circ sub-mode execTreatmentRecirc(); + // Handle signals from treatment end sub-mode if ( TRUE == rinsebackToStoppedRequest ) { - rinsebackToStoppedRequest = FALSE; transitionToTreatmentStop(); result = TREATMENT_STOP_STATE; } - else if ( TRUE == rinsebackToEndTreatmentRequest ) + else if ( TRUE == endTreatmentRequest ) { - rinsebackToEndTreatmentRequest = FALSE; - // TODO - transition to end state + endTreatmentRequest = FALSE; result = TREATMENT_END_STATE; } @@ -640,6 +661,53 @@ /*********************************************************************//** * @brief + * The handleTreatmentEndState function executes the end state of the + * Treatment Mode state machine. + * @details Inputs: none + * @details Outputs: treatment end sub-mode executed. + * @return next treatment mode state + *************************************************************************/ +static TREATMENT_STATE_T handleTreatmentEndState( void ) +{ + TREATMENT_STATE_T result = TREATMENT_DIALYSIS_END_STATE; + + // Handle alarm user response signals - forward to treatment end sub-mode + if ( TRUE == alarmStopSignalled ) + { + signalStopTreatmentEnd(); + } + else if ( TRUE == initiateRinsebackAlarmResponseRequest ) + { + signalTreatmentEndAlarmRinsebackUserAction(); + } + else if ( TRUE == endTreatmentAlarmResponseRequest ) + { + signalTreatmentEndAlarmEndTxUserAction(); + } + else if ( TRUE == resumeTreatmentAlarmResponseRequest ) + { + signalTreatmentEndAlarmResumeUserAction(); + } + + // Execute treatment end sub-mode + execTreatmentEnd(); + + // Handle signals from treatment end sub-mode + if ( TRUE == treatmentEndToRinsebackRequest ) + { + transitionToRinseback(); + result = TREATMENT_RINSEBACK_STATE; + } + else if ( TRUE == endTreatmentRequest ) + { + result = TREATMENT_END_STATE; + } + + return result; +} + +/*********************************************************************//** + * @brief * The verifyTreatmentDurationSettingChange function verifies and responds to * the user treatment duration setting change request. * @details Inputs: current operating mode, treatment states and parameters Index: firmware/App/Modes/ModeTreatment.h =================================================================== diff -u -r1b27784f400d03678a1441cd70ab1c4111bbfa04 -r38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1 --- firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 1b27784f400d03678a1441cd70ab1c4111bbfa04) +++ firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1) @@ -84,8 +84,9 @@ void transitionToTreatmentMode( void ); // Prepares for transition to treatment mode U32 execTreatmentMode( void ); // Execute the treatment mode state machine (call from OperationModes) void signalAlarmActionToTreatmentMode( ALARM_ACTION_T action ); // Execute alarm action as appropriate for Treatment mode -void signalRinsebackToTreatmentStopped( void ); // Rinseback or Re-circ sub-mode is signaling to return to treatment stopped sub-mode -void signalRinsebackToTreatmentEnd( void ); // Rinseback or Re-circ sub-mode is signaling to end treatment +void signalGoToTreatmentStopped( void ); // Rinseback or Re-circ sub-mode is signaling to return to treatment stopped sub-mode +void signalGoToRinseback( void ); // Requesting transition to rinseback sub-mode from other sub-mode +void signalEndTreatment( void ); // Requesting transition to post-treatment mode void signalRinsebackToRecirc( void ); // Rinseback sub-mode is signaling to move on to re-circ sub-mode TREATMENT_STATE_T getTreatmentState( void ); // Determine the current treatment sub-mode (state) Index: firmware/App/Modes/ModeTreatmentParams.c =================================================================== diff -u -r766708fceb0bdf1af8c7897df29d4f5036bfd3db -r38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1 --- firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision 766708fceb0bdf1af8c7897df29d4f5036bfd3db) +++ firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision 38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1) @@ -255,6 +255,13 @@ *************************************************************************/ U32 execTreatParamsMode( void ) { + BOOL stop = isStopButtonPressed(); + + if ( TRUE == stop ) + { + // Ignore stop button in this mode. + } + // Execute mode state machine switch ( currentTreatmentParamsState ) { Index: firmware/App/Modes/Rinseback.c =================================================================== diff -u -r67b1208c4d62d55d66672a18b7a69d025d0110c2 -r38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1 --- firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision 67b1208c4d62d55d66672a18b7a69d025d0110c2) +++ firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision 38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1) @@ -309,17 +309,17 @@ // Has user requested to return to treatment? else if ( TRUE == backToTreatmentRequested ) { - signalRinsebackToTreatmentStopped(); + signalGoToTreatmentStopped(); } // Has user requested to end the treatment? else if ( TRUE == endTreatmentRequested ) { - signalRinsebackToTreatmentEnd(); + signalEndTreatment(); } // Has rinseback operation exceeded max time? else if ( rinsebackTimerCtr > MAX_RINSEBACK_TIME ) { - signalRinsebackToTreatmentStopped(); + signalGoToTreatmentStopped(); activateAlarmNoData( ALARM_ID_TREATMENT_RINSEBACK_TIMEOUT_ALARM ); } @@ -376,7 +376,7 @@ // Has rinseback operation exceeded max time? else if ( rinsebackTimerCtr > MAX_RINSEBACK_TIME ) { - signalRinsebackToTreatmentStopped(); + signalGoToTreatmentStopped(); activateAlarmNoData( ALARM_ID_TREATMENT_RINSEBACK_TIMEOUT_ALARM ); } // Has user or alarm requested rinseback pause? @@ -438,7 +438,7 @@ // Has rinseback operation exceeded max time? if ( rinsebackTimerCtr > MAX_RINSEBACK_TIME ) { - signalRinsebackToTreatmentStopped(); + signalGoToTreatmentStopped(); activateAlarmNoData( ALARM_ID_TREATMENT_RINSEBACK_TIMEOUT_ALARM ); } else if ( TRUE == resumeRinsebackRequested ) @@ -489,11 +489,11 @@ } else if ( TRUE == backToTreatmentRequested ) { - signalRinsebackToTreatmentStopped(); + signalGoToTreatmentStopped(); } else if ( TRUE == endTreatmentRequested ) { - signalRinsebackToTreatmentEnd(); + signalEndTreatment(); } return result; Index: firmware/App/Modes/TreatmentRecirc.c =================================================================== diff -u -r1b27784f400d03678a1441cd70ab1c4111bbfa04 -r38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1 --- firmware/App/Modes/TreatmentRecirc.c (.../TreatmentRecirc.c) (revision 1b27784f400d03678a1441cd70ab1c4111bbfa04) +++ firmware/App/Modes/TreatmentRecirc.c (.../TreatmentRecirc.c) (revision 38f6b0b6ff1608eb1fd046e91add7fd2c65de4b1) @@ -134,7 +134,7 @@ * for recirculation state. * @details Inputs: none * @details Outputs: arterial and venous lines opened, blood pump started, - * and air trap levelin control is started. + * and air trap leveling control is started. * @return none *************************************************************************/ static void setupForRecirculationState( void ) @@ -222,12 +222,12 @@ else if ( TRUE == recircEndTreatmentRequested ) { setupForRecirculationStopState(); - signalRinsebackToTreatmentEnd(); // signal end Tx sub-mode + signalEndTreatment(); // signal end Tx sub-mode } // Has max time in re-circ sub-mode been exceeded? else if ( recircTimerCtr > RECIRC_TIMEOUT_MS ) { - signalRinsebackToTreatmentStopped(); + signalGoToTreatmentStopped(); activateAlarmNoData( ALARM_ID_TREATMENT_RECIRC_TIMEOUT_ALARM ); } @@ -249,12 +249,12 @@ // Is back to treatment requested? if ( TRUE == recircBackToTreatmenRequested ) { - signalRinsebackToTreatmentStopped(); + signalGoToTreatmentStopped(); } // Is end treatment requested? else if ( TRUE == recircEndTreatmentRequested ) { - signalRinsebackToTreatmentEnd(); + signalEndTreatment(); } // Is re-circ resume requested? else if ( TRUE == recircResumeRequested ) @@ -265,7 +265,7 @@ // Has max time in re-circ sub-mode been exceeded? else if ( recircTimerCtr > RECIRC_TIMEOUT_MS ) { - signalRinsebackToTreatmentStopped(); + signalGoToTreatmentStopped(); activateAlarmNoData( ALARM_ID_TREATMENT_RECIRC_TIMEOUT_ALARM ); }