Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r2b3e0e31be725bca3d859240cbf8efd19fcb009f -r19fc8f015489be63932eed969d28329d123332e0 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 2b3e0e31be725bca3d859240cbf8efd19fcb009f) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 19fc8f015489be63932eed969d28329d123332e0) @@ -34,24 +34,21 @@ // ********** private data ********** static BOOL treatStartReqReceived = FALSE; ///< Flag indicates user requests treatment begin. -static BOOL alarmActionStopReceived = FALSE; ///< Flag indicates alarm action stop received. +static BOOL alarmActionStopReceived = FALSE; ///< Flag indicates an alarm w/ stop property was triggered. static BOOL alarmActionResumeReceived = FALSE; ///< Flag indicates alarm action resume received. static HD_PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; ///< Current state of pre-treatment mode state machine. -static HD_PRE_TREATMENT_MODE_STATE_T resumePreTreatmentState; ///< Pre-treatment mode state to be resumed when alarm action resume signal receives. // ********** private function prototypes ********** -static void handleAlarmActionStop( void ); -static void handleAlarmActionResume( void ); +static void resetSignalFlags( void ); static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handleRecirculateState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ); -static HD_PRE_TREATMENT_MODE_STATE_T handlePretreatmentPauseState( void ); /*********************************************************************//** * @brief @@ -62,11 +59,9 @@ *************************************************************************/ void initPreTreatmentMode( void ) { - treatStartReqReceived = FALSE; - alarmActionStopReceived = FALSE; - alarmActionResumeReceived = FALSE; currentPreTreatmentState = HD_PRE_TREATMENT_START_STATE; - resumePreTreatmentState = HD_PRE_TREATMENT_START_STATE; + + resetSignalFlags(); } /*********************************************************************//** @@ -106,6 +101,7 @@ break; case HD_PRE_TREATMENT_WATER_SAMPLE_STATE: + transitionToNoCartSelfTests(); currentPreTreatmentState = HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; break; @@ -133,16 +129,15 @@ currentPreTreatmentState = handlePatientConnectionState(); break; - case HD_PRE_TREATMENT_PAUSE_STATE: - currentPreTreatmentState = handlePretreatmentPauseState(); - break; - default: currentPreTreatmentState = HD_PRE_TREATMENT_START_STATE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, (U32)currentPreTreatmentState ); break; } + // Alarm response request flags should be handled at this point, reset in case not handled in current state + resetSignalFlags(); + return (U32)currentPreTreatmentState; } @@ -183,15 +178,15 @@ switch( action ) { case ALARM_ACTION_STOP: - handleAlarmActionStop(); + alarmActionStopReceived = TRUE; break; case ALARM_ACTION_RESUME: - handleAlarmActionResume(); + alarmActionResumeReceived = TRUE; break; case ALARM_ACTION_END_TREATMENT: - requestNewOperationMode( MODE_POST ); + requestNewOperationMode( MODE_STAN ); break; case ALARM_ACTION_ACK: @@ -206,78 +201,20 @@ /*********************************************************************//** * @brief - * The handleAlarmActionStop function forwards the alarm action to corresponding - * sub-mode and sets appropriate flag to allow corresponding sub-mode handles. - * @details Inputs: currentPreTreatmentState - * @details Outputs: signals corresponding sub-mode of alarm action + * The resetSignalFlags function resets all signal flags. + * @details Inputs: none + * @details Outputs: signal flags set to FALSE * @return none *************************************************************************/ -static void handleAlarmActionStop( void ) +static void resetSignalFlags( void ) { - switch ( currentPreTreatmentState ) - { - case HD_PRE_TREATMENT_PRIME_STATE: - signalAlarmActionToPrimeMode( ALARM_ACTION_STOP ); - break; - - case HD_PRE_TREATMENT_RECIRCULATE_STATE: - // The corresponding sub-mode will handle the signal - alarmActionStopReceived = TRUE; - break; - - case HD_PRE_TREATMENT_START_STATE: - case HD_PRE_TREATMENT_WATER_SAMPLE_STATE: - case HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE: - case HD_PRE_TREATMENT_SELF_TEST_DRY_STATE: - case HD_PRE_TREATMENT_CART_INSTALL_STATE: - case HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE: - // do nothing - break; - - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, (U32)currentPreTreatmentState ); - break; - } + treatStartReqReceived = FALSE; + alarmActionStopReceived = FALSE; + alarmActionResumeReceived = FALSE; } /*********************************************************************//** * @brief - * The handleAlarmActionResume function forwards the alarm action to corresponding - * sub-mode and sets appropriate flag to allow corresponding sub-mode handles. - * @details Inputs: currentPreTreatmentState - * @details Outputs: signals corresponding sub-mode of alarm action - * @return none - *************************************************************************/ -static void handleAlarmActionResume( void ) -{ - switch ( currentPreTreatmentState ) - { - case HD_PRE_TREATMENT_PRIME_STATE: - signalAlarmActionToPrimeMode( ALARM_ACTION_RESUME ); - break; - - case HD_PRE_TREATMENT_RECIRCULATE_STATE: - case HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE: - case HD_PRE_TREATMENT_SELF_TEST_DRY_STATE: - case HD_PRE_TREATMENT_START_STATE: - case HD_PRE_TREATMENT_WATER_SAMPLE_STATE: - case HD_PRE_TREATMENT_CART_INSTALL_STATE: - case HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE: - // do nothing - break; - - case HD_PRE_TREATMENT_PAUSE_STATE: - alarmActionResumeReceived = TRUE; - break; - - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, (U32)currentPreTreatmentState ); - break; - } -} - -/*********************************************************************//** - * @brief * The handleSelfTestNoCartState function handles self-test with no cartridge. * @details Inputs: none * @details Outputs: home blood pump and dialysate pumps @@ -292,6 +229,16 @@ activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); } + if ( TRUE == alarmActionResumeReceived ) + { + signalResumeSelfTests(); + } + + if ( TRUE == alarmActionStopReceived ) + { + signalStopSelfTests(); + } + execNoCartSelfTests(); if ( TRUE == isNoCartSelfTestsPassed() ) @@ -334,16 +281,20 @@ if ( STATE_OPEN == getFPGADoorState() ) { activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); - state = HD_PRE_TREATMENT_CART_INSTALL_STATE; } - execDrySelfTests(); + if ( TRUE == alarmActionResumeReceived ) + { + signalResumeSelfTests(); + } - if ( ( TRUE == isAlarmActive( ALARM_ID_CARTRIDGE_INSTALLED_IMPROPERLY ) ) || ( TRUE == isAlarmActive( ALARM_ID_INSTALL_NEW_CARTRIDGE ) ) ) + if ( TRUE == alarmActionStopReceived ) { - state = HD_PRE_TREATMENT_CART_INSTALL_STATE; + signalStopSelfTests(); } + execDrySelfTests(); + if ( TRUE == isDrySelfTestsPassed() ) { transitionToPrime(); @@ -369,6 +320,16 @@ activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); } + if ( TRUE == alarmActionResumeReceived ) + { + signalResumePrime(); + } + + if ( TRUE == alarmActionStopReceived ) + { + signalStopPrime(); + } + execPrime(); if ( TRUE == isPrimeCompleted() ) @@ -393,6 +354,23 @@ { HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_RECIRCULATE_STATE; + if ( STATE_OPEN == getFPGADoorState() ) + { + activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); + } + + if ( TRUE == alarmActionResumeReceived ) + { + signalResumePreTreatmentRecirc(); + } + + if ( TRUE == alarmActionStopReceived ) + { + signalStopPreTreatmentRecirc(); + } + + execPreTreatmentRecirc(); + if ( TRUE == isPatientConnectionRequested() ) { state = HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; @@ -422,24 +400,4 @@ return HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; } -/*********************************************************************//** - * @brief - * The handlePretreatmentPauseState function handles pre-treatment pause state. - * @details Inputs: previousPrimeState - * @details Outputs: primeStartTime, primeResumeReqReceived - * @return current state - *************************************************************************/ -static HD_PRE_TREATMENT_MODE_STATE_T handlePretreatmentPauseState( void ) -{ - HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_PAUSE_STATE; - - if ( TRUE == alarmActionResumeReceived ) - { - alarmActionResumeReceived = FALSE; - state = resumePreTreatmentState; - } - - return state; -} - /**@}*/ Index: firmware/App/Modes/PreTreatmentRecirc.c =================================================================== diff -u -r2b3e0e31be725bca3d859240cbf8efd19fcb009f -r19fc8f015489be63932eed969d28329d123332e0 --- firmware/App/Modes/PreTreatmentRecirc.c (.../PreTreatmentRecirc.c) (revision 2b3e0e31be725bca3d859240cbf8efd19fcb009f) +++ firmware/App/Modes/PreTreatmentRecirc.c (.../PreTreatmentRecirc.c) (revision 19fc8f015489be63932eed969d28329d123332e0) @@ -37,17 +37,22 @@ { PRE_TREATMENT_RECIRC_START_STATE = 0, ///< Pre-treatment recirculate start state. PRE_TREATMENT_RECIRC_STATE, ///< Pre-treatment recirculate state. + PRE_TREATMENT_RECIRC_STOPPED_STATE, ///< Pre-treatment recirculate stopped state. NUM_OF_PRE_TREATMENT_RECIRC_STATES ///< Number of pre-treatment recirculate states. } PRE_TREATMENT_RECIRC_STATE_T; // ********** private data ********** static PRE_TREATMENT_RECIRC_STATE_T currentPreTreatmentRecircState; ///< Current state of the pre-treatment recirculate state machine. +static BOOL recircStopRequested; ///< Flag indicates alarm requesting to stop pre-treatment recirculate. +static BOOL recircResumeRequested; ///< Flag indicates alarm requesting to resume pre-treatment recirculate. // ********** private function prototypes ********** +static void resetPreTreatmentRecircFlags( void ); static PRE_TREATMENT_RECIRC_STATE_T handlePreTreatmentRecirculateStartState( void ); static PRE_TREATMENT_RECIRC_STATE_T handlePreTreatmentRecirculateState( void ); +static PRE_TREATMENT_RECIRC_STATE_T handlePreTreatmentRecirculateStoppedState( void ); /*********************************************************************//** * @brief @@ -59,6 +64,8 @@ void initPreTreatmentRecirc( void ) { currentPreTreatmentRecircState = PRE_TREATMENT_RECIRC_START_STATE; + + resetPreTreatmentRecircFlags(); } /*********************************************************************//** @@ -94,15 +101,48 @@ currentPreTreatmentRecircState = handlePreTreatmentRecirculateState(); break; + case PRE_TREATMENT_RECIRC_STOPPED_STATE: + currentPreTreatmentRecircState = handlePreTreatmentRecirculateStoppedState(); + break; + default: currentPreTreatmentRecircState = PRE_TREATMENT_RECIRC_START_STATE; - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_INVALID_NO_CARTRIDGE_SELF_TEST_STATE, (U32)currentPreTreatmentRecircState ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_INVALID_PRE_TREATMENT_RECIRC_STATE, (U32)currentPreTreatmentRecircState ); break; } + + // All flags should be handled by now, reset in case flags not handle in current state + resetPreTreatmentRecircFlags(); } /*********************************************************************//** * @brief + * The signalResumePreTreatmentRecirc function signals the pre-treatment + * recirculate sub-mode to resume. + * @details Inputs: none + * @details Outputs: recircResumepRequested + * @return none + *************************************************************************/ +void signalResumePreTreatmentRecirc( void ) +{ + recircResumeRequested = TRUE; +} + +/*********************************************************************//** + * @brief + * The signalStopPreTreatmentRecirc function signals the pre-treatment + * recirculate sub-mode to stop when an alarm with stop property has been triggered. + * @details Inputs: none + * @details Outputs: recircStopRequested + * @return none + *************************************************************************/ +void signalStopPreTreatmentRecirc( void ) +{ + recircStopRequested = TRUE; +} + +/*********************************************************************//** + * @brief * The isPatientConnectionRequested function returns the status of patient connection request. * @details Inputs: none * @details Outputs: none @@ -116,6 +156,20 @@ /*********************************************************************//** * @brief + * The resetPreTreatmentRecircFlags function resets all pre-treatment recirculate + * signal flags. + * @details Inputs: none + * @details Outputs: signal flags set to FALSE + * @return none + *************************************************************************/ +static void resetPreTreatmentRecircFlags( void ) +{ + recircStopRequested = FALSE; + recircResumeRequested = FALSE; +} + +/*********************************************************************//** + * @brief * The handlePreTreatmentRecirculateStartState function changes valves and * heater settings for pre-treatment recirculate sub-mode. * @details Inputs: none @@ -141,7 +195,7 @@ /*********************************************************************//** * @brief - * The handleRecirculateState function handles blood and dialysate circuits + * The handlePreTreatmentRecirculateState function handles blood and dialysate circuits * recirculation state during pre-treatment recirculate sub-mode. * @details Inputs: none * @details Outputs: controlled valves and pumps @@ -151,18 +205,39 @@ { PRE_TREATMENT_RECIRC_STATE_T state = PRE_TREATMENT_RECIRC_STATE; -// if ( TRUE == alarmActionStopReceived ) -// { -// signalDialOutPumpHardStop(); -// signalDialInPumpHardStop(); -// signalBloodPumpHardStop(); -// cmdStopDGTrimmerHeater(); -// -// state = HD_PRE_TREATMENT_PAUSE_STATE; -// resumePreTreatmentState = HD_PRE_TREATMENT_RECIRCULATE_START_STATE; -// } + if ( TRUE == recircStopRequested ) + { + signalDialOutPumpHardStop(); + signalDialInPumpHardStop(); + signalBloodPumpHardStop(); + cmdStopDGTrimmerHeater(); + recircStopRequested = FALSE; + state = PRE_TREATMENT_RECIRC_STOPPED_STATE; + } + return state; } +/*********************************************************************//** + * @brief + * The handlePreTreatmentRecirculateStoppedState function handles stopped state + * for pre-treatment recirculate sub-mode. + * @details Inputs: alarmActionResumeReceived + * @details Outputs: resume re-circulation + * @return current state (sub-mode) + *************************************************************************/ +static PRE_TREATMENT_RECIRC_STATE_T handlePreTreatmentRecirculateStoppedState( void ) +{ + PRE_TREATMENT_RECIRC_STATE_T state = PRE_TREATMENT_RECIRC_STOPPED_STATE; + + if ( TRUE == recircResumeRequested ) + { + recircResumeRequested = FALSE; + state = PRE_TREATMENT_RECIRC_START_STATE; + } + + return state; +} + /**@}*/ Index: firmware/App/Modes/PreTreatmentRecirc.h =================================================================== diff -u -r2b3e0e31be725bca3d859240cbf8efd19fcb009f -r19fc8f015489be63932eed969d28329d123332e0 --- firmware/App/Modes/PreTreatmentRecirc.h (.../PreTreatmentRecirc.h) (revision 2b3e0e31be725bca3d859240cbf8efd19fcb009f) +++ firmware/App/Modes/PreTreatmentRecirc.h (.../PreTreatmentRecirc.h) (revision 19fc8f015489be63932eed969d28329d123332e0) @@ -38,6 +38,8 @@ void transitionToPreTreatmentRecirc(); void execPreTreatmentRecirc( void ); +void signalResumePreTreatmentRecirc( void ); +void signalStopPreTreatmentRecirc( void ); BOOL isPatientConnectionRequested( void ); /**@}*/ Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r8d14f6af0d1c2edd293a2157ed56b5e7e475d2df -r19fc8f015489be63932eed969d28329d123332e0 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 8d14f6af0d1c2edd293a2157ed56b5e7e475d2df) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 19fc8f015489be63932eed969d28329d123332e0) @@ -81,10 +81,10 @@ static U32 primePauseStartTime; ///< Priming pause start time (in ms). static U32 primeStatusBroadcastTimerCounter; ///< Prime status data broadcast timer counter used to schedule when to transmit data. -static BOOL primeStartReqReceived; ///< Flag to indicate if a request to start priming has been received. -static BOOL primePauseReqReceived; ///< Flag to indicate if a request to pause priming has been received. -static BOOL primeResumeReqReceived; ///< Flag to indicate if a request to resume priming has been received. -static BOOL reservoirFilledStatus[ NUM_OF_DG_RESERVOIRS ]; ///< Flag to indicate if a reservoir has been filled. +static BOOL primeStartRequested; ///< Flag indicates user requesting to start prime. +static BOOL primeStopRequested; ///< Flag indicates alarm requesting to stop prime. +static BOOL primeResumeRequested; ///< Flag indicates user requesting prime resume. +static BOOL reservoirFilledStatus[ NUM_OF_DG_RESERVOIRS ]; ///< Flag indicates a reservoir has been filled. static U32 noAirDetectedStartTime; ///< starting time when detecting no air. static U32 purgeAirTimeOutStartTime; ///< Starting time for purge air state time out. @@ -95,11 +95,13 @@ // ********** private function prototypes ********** +static void resetPrimeFlags(); static void handlePrimePauseRequest( void ); static void broadcastPrimingStatus( void ); static void execPrimeReservoirMgmt( void ); static void purgeAirValvesBloodPumpControl( void ); +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeWaitForUserStartState( void ); static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineSetupState( void ); static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimePurgeAirState( void ); static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeCircBloodCircuitState( void ); @@ -140,17 +142,15 @@ primeStartTime = getMSTimerCount(); primePauseStartTime = 0; primeStatusBroadcastTimerCounter = 0; - // TODO: set to false after integration with UI - primeStartReqReceived = TRUE; - primeResumeReqReceived = FALSE; - primePauseReqReceived = FALSE; reservoirFilledStatus[ DG_RESERVOIR_1 ] = FALSE; reservoirFilledStatus[ DG_RESERVOIR_2 ] = FALSE; setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, FALSE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_END_TREATMENT, FALSE ); + + resetPrimeFlags(); } /*********************************************************************//** @@ -170,10 +170,14 @@ #ifdef SKIP_PRIMING currentPrimeState = HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; #else - currentPrimeState = HD_PRIME_SALINE_SETUP_STATE; + currentPrimeState = HD_PRIME_WAIT_FOR_USER_START_STATE; #endif break; + case HD_PRIME_WAIT_FOR_USER_START_STATE: + currentPrimeState = handlePrimeWaitForUserStartState(); + break; + case HD_PRIME_SALINE_SETUP_STATE: currentPrimeState = handlePrimeSalineSetupState(); break; @@ -220,6 +224,9 @@ break; } + // Prime flags should be handled by now + resetPrimeFlags(); + // Handle prime pause request handlePrimePauseRequest(); @@ -242,36 +249,45 @@ return primeCompleted; } +/*********************************************************************//** + * @brief + * The signalResumePrime function signals the prime sub-mode to resume + * previous operation. + * @details Inputs: none + * @details Outputs: primeResumeRequested + * @return none + *************************************************************************/ +void signalResumePrime( void ) +{ + primeResumeRequested = TRUE; +} /*********************************************************************//** * @brief - * The signalAlarmActionToPrimeMode function executes the given alarm action - * as appropriate while in Prime Mode. + * The signalStopPrime function signals the prime sub-mode to stop when an + * alarm with stop property has been triggered. * @details Inputs: none - * @details Outputs: given alarm action executed - * @param action ID of alarm action to execute + * @details Outputs: primeStopRequested * @return none *************************************************************************/ -void signalAlarmActionToPrimeMode( ALARM_ACTION_T action ) +void signalStopPrime( void ) { - switch ( action ) - { - case ALARM_ACTION_STOP: - primePauseReqReceived = TRUE; - break; + primeStopRequested = TRUE; +} - case ALARM_ACTION_RESUME: - primeResumeReqReceived = TRUE; - break; - - case ALARM_ACTION_ACK: - // Nothing to be done here - break; - - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRIME_INVALID_ALARM_ACTION, (U32)action ) - break; - } +/*********************************************************************//** + * @brief + * The resetPrimeFlags function resets all prime signal flags. + * @details Inputs: none + * @details Outputs: signal flags set to FALSE + * @return none + *************************************************************************/ +static void resetPrimeFlags( void ) +{ + // TODO: set to false after integration with UI + primeStartRequested = TRUE; + primeResumeRequested = FALSE; + primeStopRequested = FALSE; } /*********************************************************************//** @@ -283,13 +299,13 @@ *************************************************************************/ static void handlePrimePauseRequest( void ) { - if ( ( TRUE == primePauseReqReceived ) && ( HD_PRIME_PAUSE != currentPrimeState ) ) + if ( ( TRUE == primeStopRequested ) && ( HD_PRIME_PAUSE != currentPrimeState ) ) { signalDialOutPumpHardStop(); signalDialInPumpHardStop(); signalBloodPumpHardStop(); - primePauseReqReceived = FALSE; + primeStopRequested = FALSE; primePauseStartTime = getMSTimerCount(); previousPrimeState = currentPrimeState; currentPrimeState = HD_PRIME_PAUSE; @@ -471,23 +487,37 @@ * @details Outputs: control valves to purge air * @return current state *************************************************************************/ -static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineSetupState( void ) +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeWaitForUserStartState( void ) { - HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_SALINE_SETUP_STATE; + HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_WAIT_FOR_USER_START_STATE; - if ( TRUE == primeStartReqReceived ) + if ( TRUE == primeStartRequested ) { - purgeAirValvesBloodPumpControl(); - purgeAirTimeOutStartTime = getMSTimerCount(); - primeStartReqReceived = FALSE; - state = HD_PRIME_SALINE_PURGE_AIR_STATE; + primeStartRequested = FALSE; + state = HD_PRIME_SALINE_SETUP_STATE; } return state; } /*********************************************************************//** * @brief + * The handlePrimeSalineSetupState function checks user's request to start + * priming. + * @details Inputs: primeStartReqReceived + * @details Outputs: control valves to purge air + * @return current state + *************************************************************************/ +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineSetupState( void ) +{ + purgeAirValvesBloodPumpControl(); + purgeAirTimeOutStartTime = getMSTimerCount(); + + return HD_PRIME_SALINE_PURGE_AIR_STATE; +} + +/*********************************************************************//** + * @brief * The handlePrimePurgeAirState function checks for air trap level and moves * to blood circuit circulation state if fluid is detected at upper sensor. * @details Inputs: air trap levels @@ -725,17 +755,16 @@ { HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_PAUSE; - if ( TRUE == primeResumeReqReceived ) + if ( TRUE == primeResumeRequested ) { - primeResumeReqReceived = FALSE; + primeResumeRequested = FALSE; primeStartTime += calcTimeSince( primePauseStartTime ); switch ( previousPrimeState ) { case HD_PRIME_SALINE_SETUP_STATE: case HD_PRIME_SALINE_PURGE_AIR_STATE: case HD_PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE: - primeStartReqReceived = TRUE; state = HD_PRIME_SALINE_SETUP_STATE; break; Index: firmware/App/Modes/Prime.h =================================================================== diff -u -re0e5aff5a2d873dac91dfb1c1086572f7f1647da -r19fc8f015489be63932eed969d28329d123332e0 --- firmware/App/Modes/Prime.h (.../Prime.h) (revision e0e5aff5a2d873dac91dfb1c1086572f7f1647da) +++ firmware/App/Modes/Prime.h (.../Prime.h) (revision 19fc8f015489be63932eed969d28329d123332e0) @@ -24,6 +24,7 @@ /** * @defgroup Prime Prime * @brief Prime sub-mode of pre-treatment mode. This sub-mode handles blood and dialysate circuits priming functionality. + * This sub-mode also executes wet self-tests after prime is completed. * * @addtogroup Prime * @{ @@ -50,7 +51,8 @@ void execPrime( void ); BOOL isPrimeCompleted( void ); -void signalAlarmActionToPrimeMode( ALARM_ACTION_T action ); +void signalResumePrime( void ); +void signalStopPrime( void ); /**@}*/ Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r8d14f6af0d1c2edd293a2157ed56b5e7e475d2df -r19fc8f015489be63932eed969d28329d123332e0 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 8d14f6af0d1c2edd293a2157ed56b5e7e475d2df) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 19fc8f015489be63932eed969d28329d123332e0) @@ -49,7 +49,7 @@ typedef enum No_Cart_Self_Tests_State { NO_CART_SELF_TESTS_START_STATE = 0, ///< No cartridge self-tests starting state. - NO_CART_SELF_TESTS_WAIT_FOR_CLOSED_DOOR, ///< Wait for door to be closed before running self-tests. + NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE, ///< Wait for door to be closed before running self-tests. NO_CART_SELF_TESTS_OCCLUSION_SENSORS_STATE, ///< No cartridge occlusion sensors self-test state. NO_CART_SELF_TESTS_BLOOD_FLOW_METERS_STATE, ///< No cartridge blood flow meter self-test state. NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS_STATE, ///< No cartridge dialysate flow meter self-test state. @@ -59,6 +59,7 @@ NO_CART_SELF_TESTS_DOOR_SWITCH_STATE, ///< No cartridge door switch self-test state. NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE, ///< No cartridge home valves and pumps self-test state. NO_CART_SELF_TESTS_HOME_IDLE_STATE, ///< Wait for valves and pumps finish homing state. + NO_CART_SELF_TESTS_STOPPED, ///< No cart self-test stopped state. NO_CART_SELF_TESTS_COMPLETE, ///< No cartridge self-test complete state. NUM_OF_NO_CART_SELF_TESTS_STATES ///< Number of no cartridge self-tests states. } NO_CART_SELF_TESTS_STATE_T; @@ -67,12 +68,14 @@ typedef enum Dry_Self_Tests_State { DRY_SELF_TESTS_START_STATE = 0, ///< Dry self-tests starting state. + DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE, ///< Wait for door to close before executing self-tests. DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE, ///< Bubble detectors dry self-test state. DRY_SELF_TESTS_AIR_TRAP_STATE, ///< Air trap fill level ultrasonic sensor dry self-test state. DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE, ///< Occlusion sensors dry self-test state. DRY_SELF_TESTS_PRESSURE_SENSORS_SETUP_STATE, ///< Pressure sensors dry self-test setup valves and pump state. DRY_SELF_TESTS_PRESSURE_SENSORS_STATE, ///< Pressure sensors verify pressure readings state. DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_STATE, ///< Preassure sensors verify normal pressure readings state. + DRY_SELF_TESTS_STOPPED, ///< Dry self-test stopped state. DRY_SELF_TESTS_COMPLETE, ///< Dry self-test complete state. NUM_OF_DRY_SELF_TESTS_STATES ///< Number of dry self-tests states. } DRY_SELF_TESTS_STATE_T; @@ -103,18 +106,28 @@ static BOOL wetSelfTestsResult; ///< Result of wet self-tests. static WET_SELF_TESTS_STATE_T currentWetSelfTestsState; ///< Current state of the wet self-tests state machine. +static BOOL selfTestsResumeRequested; ///< Flag indicates user requesting self-tests resume. +static BOOL selfTestsStopRequested; ///< Flag indicates alarm requesting to stop self-test. + // ********** private function prototypes ********** +static void resetSelfTestsFlags( void ); + +static void handleNoCartSelfTestsStopRequest( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestsWaitForClosedDoor( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestPumpsState( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeValvesAndPumpState( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestLeakDetectorsState( SELF_TEST_STATUS_T *result ); +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestStoppedState( void ); +static void handleDrySelfTestsStopRequest( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestBubbleDetectorsState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestAirTrapState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsSetupState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsState( SELF_TEST_STATUS_T *result ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalState( SELF_TEST_STATUS_T *result ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestStoppedState( void ); /*********************************************************************//** * @brief @@ -129,6 +142,45 @@ /*********************************************************************//** * @brief + * The signalResumeSelfTests function signals the self-tests to resume + * previous operation. + * @details Inputs: none + * @details Outputs: primeResumeRequested + * @return none + *************************************************************************/ +void signalResumeSelfTests( void ) +{ + selfTestsResumeRequested = TRUE; +} + +/*********************************************************************//** + * @brief + * The signalStopPrime function signals self-tests to stop when an + * alarm with stop property has been triggered. + * @details Inputs: none + * @details Outputs: primeStopRequested + * @return none + *************************************************************************/ +void signalStopSelfTests( void ) +{ + selfTestsStopRequested = TRUE; +} + +/*********************************************************************//** + * @brief + * The resetSelfTestsFlags function resets all self-tests signal flags. + * @details Inputs: none + * @details Outputs: signal flags set to FALSE + * @return none + *************************************************************************/ +static void resetSelfTestsFlags( void ) +{ + selfTestsResumeRequested = FALSE; + selfTestsStopRequested = FALSE; +} + +/*********************************************************************//** + * @brief * The transitionToNoCartSelfTests function resets anything required before * the start of no cartridge self-tests. * @details Inputs: none @@ -140,8 +192,9 @@ noCartSelfTestsResult = FALSE; hasPumpsStarted = FALSE; currentNoCartSelfTestsState = NO_CART_SELF_TESTS_START_STATE; - runPumpStartTime = 0; + + resetSelfTestsFlags(); } /*********************************************************************//** @@ -163,11 +216,11 @@ #ifdef SKIP_SELF_TESTS currentNoCartSelfTestsState = NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE; #else - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_WAIT_FOR_CLOSED_DOOR; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; #endif break; - case NO_CART_SELF_TESTS_WAIT_FOR_CLOSED_DOOR: + case NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE: currentNoCartSelfTestsState = handleNoCartSelfTestsWaitForClosedDoor(); break; @@ -215,6 +268,10 @@ } break; + case NO_CART_SELF_TESTS_STOPPED: + currentNoCartSelfTestsState = handleNoCartSelfTestStoppedState(); + break; + case NO_CART_SELF_TESTS_COMPLETE: noCartSelfTestsResult = TRUE; break; @@ -225,6 +282,12 @@ break; } + // Transition to stopped state when alarm with stop property has been triggered + handleNoCartSelfTestsStopRequest(); + + // Self-tests flags should be handled by now, reset if flags not handled with current state + resetSelfTestsFlags(); + if ( SELF_TEST_STATUS_FAILED == result ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRE_TREATMENT_SELF_TEST_FAILURE, currentNoCartSelfTestsState ); @@ -255,6 +318,8 @@ { drySelfTestsResult = FALSE; currentDrySelfTestsState = DRY_SELF_TESTS_START_STATE; + + resetSelfTestsFlags(); } /*********************************************************************//** @@ -275,10 +340,14 @@ #ifdef SKIP_SELF_TESTS currentDrySelfTestsState = DRY_SELF_TESTS_COMPLETE; #else - currentDrySelfTestsState = DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE; + currentDrySelfTestsState = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; #endif break; + case DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE: + currentDrySelfTestsState = handleDrySelfTestWaitForDoorCloseState(); + break; + case DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE: currentDrySelfTestsState = handleDrySelfTestBubbleDetectorsState(); break; @@ -306,6 +375,10 @@ currentDrySelfTestsState = handleDrySelfTestPressureSensorsNormalState( &result ); break; + case DRY_SELF_TESTS_STOPPED: + currentDrySelfTestsState = handleDrySelfTestStoppedState(); + break; + case DRY_SELF_TESTS_COMPLETE: drySelfTestsResult = TRUE; break; @@ -316,6 +389,12 @@ break; } + // Transition to stopped state when alarm with stop property has been triggered + handleDrySelfTestsStopRequest(); + + // Self-tests flags should be handled by now, reset if flags not handled with current state + resetSelfTestsFlags(); + if ( SELF_TEST_STATUS_FAILED == result ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRE_TREATMENT_SELF_TEST_FAILURE, currentDrySelfTestsState ); @@ -346,6 +425,8 @@ { wetSelfTestsResult = FALSE; currentWetSelfTestsState = WET_SELF_TESTS_START_STATE; + + resetSelfTestsFlags(); } /*********************************************************************//** @@ -418,7 +499,27 @@ return wetSelfTestsResult; } +/*********************************************************************//** + * @brief + * The handleNoCartSelfTestsStopRequest function handles stop request from alarm + * and transition to stopped state. + * @details Inputs: none + * @details Outputs: none + * @return the next state of no cart self-tests state machine + *************************************************************************/ +static void handleNoCartSelfTestsStopRequest( void ) +{ + if ( TRUE == selfTestsStopRequested ) + { + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_STOPPED; + selfTestsStopRequested = FALSE; + } +} + /*********************************************************************//** * @brief * The handleNoCartridgeWaitForClosedDoor function executes the wait for @@ -429,7 +530,7 @@ *************************************************************************/ static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestsWaitForClosedDoor( void ) { - NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_WAIT_FOR_CLOSED_DOOR; + NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; signalBloodPumpHardStop(); signalDialInPumpHardStop(); @@ -528,6 +629,67 @@ /*********************************************************************//** * @brief + * The handleNoCartSelfTestStoppedState function handles the stopped no + * cartridge self-tests operation. + * @details Inputs: none + * @details Outputs: none + * @return the next state of no cart self-tests state machine + *************************************************************************/ +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestStoppedState( void ) +{ + NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_STOPPED; + + if ( TRUE == selfTestsResumeRequested ) + { + state = NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleDrySelfTestsStopRequest function handles stop request from alarm + * and transition to stopped state. + * @details Inputs: none + * @details Outputs: none + * @return the next state of dry self-tests state machine + *************************************************************************/ +static void handleDrySelfTestsStopRequest( void ) +{ + if ( TRUE == selfTestsStopRequested ) + { + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); + + currentDrySelfTestsState = DRY_SELF_TESTS_STOPPED; + selfTestsStopRequested = FALSE; + } +} + +/*********************************************************************//** + * @brief + * The handleDrySelfTestWaitForDoorCloseState function verify no fluid is detected + * by bubble detectors. + * @details Inputs: none + * @details Outputs: none + * @return the next state of dry self-tests state machine + *************************************************************************/ +static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ) +{ + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; + + if ( STATE_CLOSED == getFPGADoorState() ) + { + state = DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleDrySelfTestBubbleDetectorsState function verify no fluid is detected * by bubble detectors. * @details Inputs: none @@ -661,4 +823,24 @@ return state; } +/*********************************************************************//** + * @brief + * The handleDrySelfTestStoppedState function handles the stopped dry self-tests + * operation. + * @details Inputs: none + * @details Outputs: none + * @return the next state of dry self-tests state machine + *************************************************************************/ +static DRY_SELF_TESTS_STATE_T handleDrySelfTestStoppedState( void ) +{ + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_STOPPED; + + if ( TRUE == selfTestsResumeRequested ) + { + state = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; + } + + return state; +} + /**@}*/ Index: firmware/App/Modes/SelfTests.h =================================================================== diff -u -rc965df576088a9b2eb23d826f8f7e9f03d1bc962 -r19fc8f015489be63932eed969d28329d123332e0 --- firmware/App/Modes/SelfTests.h (.../SelfTests.h) (revision c965df576088a9b2eb23d826f8f7e9f03d1bc962) +++ firmware/App/Modes/SelfTests.h (.../SelfTests.h) (revision 19fc8f015489be63932eed969d28329d123332e0) @@ -34,6 +34,8 @@ // ********** public function prototypes ********** void initSelfTests( void ); +void signalResumeSelfTests( void ); +void signalStopSelfTests( void ); void transitionToNoCartSelfTests(); void execNoCartSelfTests( void ); Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -rc965df576088a9b2eb23d826f8f7e9f03d1bc962 -r19fc8f015489be63932eed969d28329d123332e0 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision c965df576088a9b2eb23d826f8f7e9f03d1bc962) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 19fc8f015489be63932eed969d28329d123332e0) @@ -238,10 +238,10 @@ 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_MODE_PRIME_INVALID_ALARM_ACTION, SW_FAULT_ID_HD_INVALID_NO_CARTRIDGE_SELF_TEST_STATE, SW_FAULT_ID_HD_INVALID_DRY_SELF_TEST_STATE, SW_FAULT_ID_HD_INVALID_WET_SELF_TEST_STATE, + SW_FAULT_ID_HD_INVALID_PRE_TREATMENT_RECIRC_STATE, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T;