Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r5413ebeb2cb61163574550c7b2ca212ae3e307a3 -r965e120959988f653f340d48a0ec22d3ea8206bc --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 5413ebeb2cb61163574550c7b2ca212ae3e307a3) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 965e120959988f653f340d48a0ec22d3ea8206bc) @@ -16,9 +16,13 @@ ***************************************************************************/ #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" /** @@ -28,31 +32,24 @@ // ********** private definitions ********** -#define BLOOD_PUMP_RECIRC_FLOW_RATE 100 ///< Blood pump flow rate during recirculation in mL/min. -#define DIALYSATE_PUMP_RECIRC_FLOW_RATE 100 ///< Dialysate pump flow rate during recirculation in mL/min. - // ********** private data ********** static BOOL treatStartReqReceived = FALSE; ///< Flag indicates user requests treatment begin. -static BOOL patientConnectionStartReqReceived = FALSE; ///< Flag indicates user requests patient connection. -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 handleRecirculateStartState( 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 @@ -63,12 +60,12 @@ *************************************************************************/ void initPreTreatmentMode( void ) { - treatStartReqReceived = FALSE; - patientConnectionStartReqReceived = FALSE; - alarmActionStopReceived = FALSE; - alarmActionResumeReceived = FALSE; currentPreTreatmentState = HD_PRE_TREATMENT_START_STATE; - resumePreTreatmentState = HD_PRE_TREATMENT_START_STATE; + + initPrime(); + initSelfTests(); + + resetSignalFlags(); } /*********************************************************************//** @@ -98,6 +95,13 @@ *************************************************************************/ U32 execPreTreatmentMode( void ) { + BOOL stop = isStopButtonPressed(); + + if ( TRUE == stop ) + { + activateAlarmNoData( ALARM_ID_TREATMENT_STOPPED_BY_USER ); + } + // execute mode state machine switch ( currentPreTreatmentState ) { @@ -108,6 +112,7 @@ break; case HD_PRE_TREATMENT_WATER_SAMPLE_STATE: + transitionToNoCartSelfTests(); currentPreTreatmentState = HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; break; @@ -116,7 +121,7 @@ break; case HD_PRE_TREATMENT_CART_INSTALL_STATE: - currentPreTreatmentState = HD_PRE_TREATMENT_SELF_TEST_DRY_STATE; + currentPreTreatmentState = handleInstallState(); break; case HD_PRE_TREATMENT_SELF_TEST_DRY_STATE: @@ -127,10 +132,6 @@ currentPreTreatmentState = handlePrimeState(); break; - case HD_PRE_TREATMENT_RECIRCULATE_START_STATE: - currentPreTreatmentState = handleRecirculateStartState(); - break; - case HD_PRE_TREATMENT_RECIRCULATE_STATE: currentPreTreatmentState = handleRecirculateState(); break; @@ -139,16 +140,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; } @@ -164,6 +164,7 @@ { BOOL result = FALSE; + // TODO: check patient connection sub-mode state if ( ( MODE_PRET == getCurrentOperationMode() ) && ( HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE == currentPreTreatmentState ) ) { treatStartReqReceived = TRUE; @@ -189,15 +190,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: @@ -212,116 +213,103 @@ /*********************************************************************//** * @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 + * 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 void handleAlarmActionResume( void ) +static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ) { - switch ( currentPreTreatmentState ) + HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; + + if ( STATE_OPEN == getFPGADoorState() ) { - case HD_PRE_TREATMENT_PRIME_STATE: - signalAlarmActionToPrimeMode( ALARM_ACTION_RESUME ); - break; + activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); + } - 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; + if ( TRUE == alarmActionResumeReceived ) + { + signalResumeSelfTests(); + } - case HD_PRE_TREATMENT_PAUSE_STATE: - alarmActionResumeReceived = TRUE; - break; + if ( TRUE == alarmActionStopReceived ) + { + signalStopSelfTests(); + } - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, (U32)currentPreTreatmentState ); - break; + execNoCartSelfTests(); + + if ( TRUE == isNoCartSelfTestsPassed() ) + { + state = HD_PRE_TREATMENT_CART_INSTALL_STATE; } + + return state; } /*********************************************************************//** * @brief - * The handleSelfTestNoCartState function handles self-test with no cartridge. + * The handleInstallState function handles disposable installation. * @details Inputs: none - * @details Outputs: home blood pump and dialysate pumps + * @details Outputs: transition to prime sub-mode when blood pump finished + * homing * @return current state (sub-mode) *************************************************************************/ -static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ) +static HD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ) { - // TODO: Prompt user to close door + HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_CART_INSTALL_STATE; - VALVE_T valve; + // TODO: handle install verification and transition + transitionToDrySelfTests(); + state = HD_PRE_TREATMENT_SELF_TEST_DRY_STATE; - for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) - { - homeValve( valve ); - } - - homeBloodPump(); - homeDialInPump(); - homeDialOutPump(); - - // TODO: Prompt user to open door - - return HD_PRE_TREATMENT_CART_INSTALL_STATE; + return state; } /*********************************************************************//** * @brief * The handleSelfTestDryState function performs dry self-test. * @details Inputs: none - * @details Outputs: transition to prime sub-mode when blood pump finished homing + * @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_CART_INSTALL_STATE; + HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_SELF_TEST_DRY_STATE; - if ( FALSE == isBloodPumpRunning() ) + if ( STATE_OPEN == getFPGADoorState() ) { + activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); + } + + if ( TRUE == alarmActionResumeReceived ) + { + signalResumeSelfTests(); + } + + if ( TRUE == alarmActionStopReceived ) + { + signalStopSelfTests(); + } + + execDrySelfTests(); + + if ( TRUE == isDrySelfTestsPassed() ) + { transitionToPrime(); state = HD_PRE_TREATMENT_PRIME_STATE; } @@ -331,7 +319,8 @@ /*********************************************************************//** * @brief - * The handlePrimeState function handles priming the blood and dialysate circuits. + * The handlePrimeState function handles priming the blood and dialysate + * circuits. * @details Inputs: none * @details Outputs: transition to self test wet state after priming passed * @return current state (sub-mode) @@ -340,44 +329,35 @@ { 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 == isWetSelfTestsPassed() ) + if ( TRUE == isPrimeCompleted() ) { - state = HD_PRE_TREATMENT_RECIRCULATE_START_STATE; + state = HD_PRE_TREATMENT_RECIRCULATE_STATE; activateAlarmNoData( ALARM_ID_PRIME_COMPLETED_LOW_PRIORITY ); + transitionToPreTreatmentRecirc(); } return state; } /*********************************************************************//** * @brief - * The handleRecirculateStartState function change valves and heater settings - * for 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 handleRecirculateStartState( void ) -{ - setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); - setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); - setValvePosition( VBA, VALVE_POSITION_B_OPEN ); - setValvePosition( VBV, VALVE_POSITION_B_OPEN ); - setValveAirTrap( STATE_CLOSED ); - cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); - cmdStartDGTrimmerHeater(); - - setBloodPumpTargetFlowRate( BLOOD_PUMP_RECIRC_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setDialInPumpTargetFlowRate( DIALYSATE_PUMP_RECIRC_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - signalDialOutPumpHardStop(); - - return HD_PRE_TREATMENT_RECIRCULATE_STATE; -} - -/*********************************************************************//** - * @brief * The handleRecirculateState function handles blood and dialysate circuits * recirculation state during pre-treatment mode. * @details Inputs: none @@ -388,23 +368,26 @@ { HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_RECIRCULATE_STATE; - // TODO Add handler to UI interaction - patientConnectionStartReqReceived = TRUE; + if ( STATE_OPEN == getFPGADoorState() ) + { + activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); + } - if ( TRUE == patientConnectionStartReqReceived ) + if ( TRUE == alarmActionResumeReceived ) { - state = HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; + signalResumePreTreatmentRecirc(); } if ( TRUE == alarmActionStopReceived ) { - signalDialOutPumpHardStop(); - signalDialInPumpHardStop(); - signalBloodPumpHardStop(); - cmdStopDGTrimmerHeater(); + signalStopPreTreatmentRecirc(); + } - state = HD_PRE_TREATMENT_PAUSE_STATE; - resumePreTreatmentState = HD_PRE_TREATMENT_RECIRCULATE_START_STATE; + execPreTreatmentRecirc(); + + if ( TRUE == isPatientConnectionRequested() ) + { + state = HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; } return state; @@ -420,32 +403,15 @@ *************************************************************************/ 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 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; -} - /**@}*/