Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r766708fceb0bdf1af8c7897df29d4f5036bfd3db -r27f3db92495948d4c1192421c1b0c20338c4a034 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 766708fceb0bdf1af8c7897df29d4f5036bfd3db) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 27f3db92495948d4c1192421c1b0c20338c4a034) @@ -15,29 +15,42 @@ * ***************************************************************************/ +#include "AlarmMgmt.h" +#include "Buttons.h" +#include "FPGA.h" #include "ModePreTreat.h" #include "OperationModes.h" +#include "PreTreatmentRecirc.h" #include "Prime.h" +#include "SelfTests.h" #include "SystemCommMessages.h" /** * @addtogroup HDPreTreatmentMode * @{ */ +// ********** private definitions ********** + // ********** private data ********** static BOOL treatStartReqReceived = FALSE; ///< Flag indicates user requests treatment begin. +static BOOL alarmActionStopReceived = FALSE; ///< Flag indicates an alarm w/ stop property was triggered. +static BOOL alarmActionResumeReceived = FALSE; ///< Flag indicates alarm action resume received. -static PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; ///< Current state of pre-treatment mode state machine. +static HD_PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; ///< Current state of pre-treatment mode state machine. // ********** private function prototypes ********** -static PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ); -static PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ); -static PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ); -static PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( 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 ); + /*********************************************************************//** * @brief * The initPreTreatmentMode function initializes the Pre-Treatment Mode module. @@ -47,7 +60,12 @@ *************************************************************************/ void initPreTreatmentMode( void ) { - currentPreTreatmentState = PRE_TREATMENT_START_STATE; + currentPreTreatmentState = HD_PRE_TREATMENT_START_STATE; + + initPrime(); + initSelfTests(); + + resetSignalFlags(); } /*********************************************************************//** @@ -60,14 +78,12 @@ *************************************************************************/ void transitionToPreTreatmentMode( void ) { - treatStartReqReceived = FALSE; - // Set user alarm recovery actions allowed in this mode setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, FALSE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_END_TREATMENT, TRUE ); - currentPreTreatmentState = PRE_TREATMENT_START_STATE; + initPreTreatmentMode(); } /*********************************************************************//** @@ -79,53 +95,60 @@ *************************************************************************/ U32 execPreTreatmentMode( void ) { + BOOL stop = isStopButtonPressed(); + + if ( TRUE == stop ) + { + activateAlarmNoData( ALARM_ID_TREATMENT_STOPPED_BY_USER ); + } + // execute mode state machine switch ( currentPreTreatmentState ) { - case PRE_TREATMENT_START_STATE: + case HD_PRE_TREATMENT_START_STATE: cmdStartDG(); cmdSetDGDialysateTargetTemps( 39.0, 37.0 ); - currentPreTreatmentState = PRE_TREATMENT_WATER_SAMPLE_STATE; + currentPreTreatmentState = HD_PRE_TREATMENT_WATER_SAMPLE_STATE; break; - case PRE_TREATMENT_WATER_SAMPLE_STATE: - currentPreTreatmentState = PRE_TREATMENT_SELF_TEST_NO_CART_STATE; + case HD_PRE_TREATMENT_WATER_SAMPLE_STATE: + transitionToNoCartSelfTests(); + currentPreTreatmentState = HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; break; - case PRE_TREATMENT_SELF_TEST_NO_CART_STATE: + case HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE: currentPreTreatmentState = handleSelfTestNoCartState(); break; - case PRE_TREATMENT_CART_INSTALL_STATE: - currentPreTreatmentState = PRE_TREATMENT_SELF_TEST_DRY_STATE; + case HD_PRE_TREATMENT_CART_INSTALL_STATE: + currentPreTreatmentState = handleInstallState(); break; - case PRE_TREATMENT_SELF_TEST_DRY_STATE: + case HD_PRE_TREATMENT_SELF_TEST_DRY_STATE: currentPreTreatmentState = handleSelfTestDryState(); break; - case PRE_TREATMENT_PRIME_STATE: + case HD_PRE_TREATMENT_PRIME_STATE: currentPreTreatmentState = handlePrimeState(); break; - case PRE_TREATMENT_SELF_TEST_WET_STATE: - currentPreTreatmentState = PRE_TREATMENT_RECIRC_STATE; + case HD_PRE_TREATMENT_RECIRCULATE_STATE: + currentPreTreatmentState = handleRecirculateState(); break; - case PRE_TREATMENT_RECIRC_STATE: - currentPreTreatmentState = PRE_TREATMENT_PATIENT_CONNECTION_STATE; - break; - - case PRE_TREATMENT_PATIENT_CONNECTION_STATE: + case HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE: currentPreTreatmentState = handlePatientConnectionState(); break; default: - currentPreTreatmentState = PRE_TREATMENT_START_STATE; + 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; } @@ -141,11 +164,13 @@ { BOOL result = FALSE; - if ( MODE_PRET == getCurrentOperationMode() ) + // TODO: check patient connection sub-mode state + if ( ( MODE_PRET == getCurrentOperationMode() ) && ( HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE == currentPreTreatmentState ) ) { treatStartReqReceived = TRUE; result = TRUE; } + sendTreatmentStartResponseMsg( result, 0 ); // TODO - provide reason code if rejected return result; @@ -162,44 +187,130 @@ *************************************************************************/ void signalAlarmActionToPreTreatmentMode( ALARM_ACTION_T action ) { - // TODO - implement + switch( action ) + { + case ALARM_ACTION_STOP: + alarmActionStopReceived = TRUE; + break; + + case ALARM_ACTION_RESUME: + alarmActionResumeReceived = TRUE; + break; + + case ALARM_ACTION_END_TREATMENT: + requestNewOperationMode( MODE_STAN ); + break; + + case ALARM_ACTION_ACK: + // Nothing to be done here + break; + + default: + // Ignore + break; + } } /*********************************************************************//** * @brief - * The handleSelfTestNoCartState function handles self-test with no cartrige. + * The resetSignalFlags function resets all signal flags. * @details Inputs: none + * @details Outputs: signal flags set to FALSE + * @return none + *************************************************************************/ +static void resetSignalFlags( void ) +{ + treatStartReqReceived = FALSE; + alarmActionStopReceived = FALSE; + alarmActionResumeReceived = FALSE; +} + +/*********************************************************************//** + * @brief + * The handleSelfTestNoCartState function handles self-test with no cartridge. + * @details Inputs: none * @details Outputs: home blood pump and dialysate pumps * @return current state (sub-mode) *************************************************************************/ -static PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ) +static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ) { - // TODO: Prompt user to close door + HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; - homeBloodPump(); - homeDialInPump(); - homeDialOutPump(); + if ( STATE_OPEN == getFPGADoorState() ) + { + activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); + } - // TODO: Prompt user to open door + if ( TRUE == alarmActionResumeReceived ) + { + signalResumeSelfTests(); + } - return PRE_TREATMENT_CART_INSTALL_STATE; + if ( TRUE == alarmActionStopReceived ) + { + signalStopSelfTests(); + } + + execNoCartSelfTests(); + + if ( TRUE == isNoCartSelfTestsPassed() ) + { + state = HD_PRE_TREATMENT_CART_INSTALL_STATE; + } + + return state; } /*********************************************************************//** * @brief - * The handleSelfTestDryState function handles dry self-test. + * The handleInstallState function handles disposable installation. * @details Inputs: none * @details Outputs: transition to prime sub-mode when blood pump finished homing * @return current state (sub-mode) *************************************************************************/ -static PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ) +static HD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ) { - PRE_TREATMENT_MODE_STATE_T state = PRE_TREATMENT_CART_INSTALL_STATE; + HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_CART_INSTALL_STATE; - if ( FALSE == isBloodPumpRunning() ) + // TODO: handle install verification and transition + transitionToDrySelfTests(); + state = HD_PRE_TREATMENT_SELF_TEST_DRY_STATE; + + return state; +} + +/*********************************************************************//** + * @brief + * The handleSelfTestDryState function performs dry self-test. + * @details Inputs: none + * @details Outputs: transition to prime state on user request + * @return current state (sub-mode) + *************************************************************************/ +static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ) +{ + HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_SELF_TEST_DRY_STATE; + + if ( STATE_OPEN == getFPGADoorState() ) { + activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); + } + + if ( TRUE == alarmActionResumeReceived ) + { + signalResumeSelfTests(); + } + + if ( TRUE == alarmActionStopReceived ) + { + signalStopSelfTests(); + } + + execDrySelfTests(); + + if ( TRUE == isDrySelfTestsPassed() ) + { transitionToPrime(); - state = PRE_TREATMENT_PRIME_STATE; + state = HD_PRE_TREATMENT_PRIME_STATE; } return state; @@ -212,36 +323,93 @@ * @details Outputs: transition to self test wet state after priming passed * @return current state (sub-mode) *************************************************************************/ -static PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ) +static HD_PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ) { - PRE_TREATMENT_MODE_STATE_T state = PRE_TREATMENT_PRIME_STATE; + HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_PRIME_STATE; + if ( STATE_OPEN == getFPGADoorState() ) + { + activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); + } + + if ( TRUE == alarmActionResumeReceived ) + { + signalResumePrime(); + } + + if ( TRUE == alarmActionStopReceived ) + { + signalStopPrime(); + } + execPrime(); - if ( TRUE == isPrimingPassed() ) + if ( TRUE == isPrimeCompleted() ) { - state = PRE_TREATMENT_SELF_TEST_WET_STATE; + state = HD_PRE_TREATMENT_RECIRCULATE_STATE; + activateAlarmNoData( ALARM_ID_PRIME_COMPLETED_LOW_PRIORITY ); + transitionToPreTreatmentRecirc(); } return state; } /*********************************************************************//** * @brief + * The handleRecirculateState function handles blood and dialysate circuits + * recirculation state during pre-treatment mode. + * @details Inputs: none + * @details Outputs: controlled valves and pumps + * @return current state (sub-mode) + *************************************************************************/ +static HD_PRE_TREATMENT_MODE_STATE_T handleRecirculateState( void ) +{ + 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; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handlePatientConnectionState function handles patient connection state * during pre-treatment mode. * @details Inputs: none * @details Outputs: requested mode transition to treatment mode * @return current state (sub-mode) *************************************************************************/ -static PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ) +static HD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ) { + DG_RESERVOIR_ID_T const activeRes = getDGActiveReservoir(); + if ( TRUE == treatStartReqReceived ) { + setStartReservoirVolume( activeRes ); requestNewOperationMode( MODE_TREA ); } - return PRE_TREATMENT_PATIENT_CONNECTION_STATE; + return HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; } /**@}*/