Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -re23087e0c17f6ea81d60641fdb52121a8dd5a099 -r27f3db92495948d4c1192421c1b0c20338c4a034 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision e23087e0c17f6ea81d60641fdb52121a8dd5a099) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 27f3db92495948d4c1192421c1b0c20338c4a034) @@ -17,9 +17,12 @@ #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" /** @@ -29,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 @@ -64,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(); } /*********************************************************************//** @@ -116,6 +112,7 @@ break; case HD_PRE_TREATMENT_WATER_SAMPLE_STATE: + transitionToNoCartSelfTests(); currentPreTreatmentState = HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; break; @@ -124,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: @@ -149,6 +146,9 @@ 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,97 +213,70 @@ /*********************************************************************//** * @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(); + } - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, (U32)currentPreTreatmentState ); - break; + if ( TRUE == alarmActionStopReceived ) + { + signalStopSelfTests(); } + + 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; } /*********************************************************************//** @@ -314,10 +288,27 @@ *************************************************************************/ 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; } @@ -336,44 +327,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_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 @@ -384,11 +366,25 @@ { 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 ) { + signalResumePreTreatmentRecirc(); + } + + if ( TRUE == alarmActionStopReceived ) + { + signalStopPreTreatmentRecirc(); + } + + execPreTreatmentRecirc(); + + if ( TRUE == isPatientConnectionRequested() ) + { state = HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; } @@ -405,8 +401,11 @@ *************************************************************************/ static HD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ) { + DG_RESERVOIR_ID_T const activeRes = getDGActiveReservoir(); + if ( TRUE == treatStartReqReceived ) { + setStartReservoirVolume( activeRes ); requestNewOperationMode( MODE_TREA ); }