Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r351ae8d56096982a68f7df1b69a3bf4dd5785094 -rc282822f36836a8127f447c8ac5b8a50e851be63 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 351ae8d56096982a68f7df1b69a3bf4dd5785094) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision c282822f36836a8127f447c8ac5b8a50e851be63) @@ -15,6 +15,7 @@ * ***************************************************************************/ +#include "AlarmMgmt.h" #include "ModePreTreat.h" #include "OperationModes.h" #include "Prime.h" @@ -25,18 +26,33 @@ * @{ */ +// ********** 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 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 HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( 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 @@ -47,7 +63,12 @@ *************************************************************************/ void initPreTreatmentMode( void ) { + treatStartReqReceived = FALSE; + patientConnectionStartReqReceived = FALSE; + alarmActionStopReceived = FALSE; + alarmActionResumeReceived = FALSE; currentPreTreatmentState = HD_PRE_TREATMENT_START_STATE; + resumePreTreatmentState = HD_PRE_TREATMENT_START_STATE; } /*********************************************************************//** @@ -60,13 +81,17 @@ *************************************************************************/ void transitionToPreTreatmentMode( void ) { - treatStartReqReceived = FALSE; - currentPreTreatmentState = HD_PRE_TREATMENT_START_STATE; + // 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 ); + + initPreTreatmentMode(); } /*********************************************************************//** * @brief - * The execFaultMode function executes the Pre-Treatment Mode state machine. + * The execPreTreatmentMode function executes the Pre-Treatment Mode state machine. * @details Inputs: none * @details Outputs: none * @return current state (sub-mode) @@ -103,7 +128,7 @@ break; case HD_PRE_TREATMENT_RECIRCULATE_STATE: - currentPreTreatmentState = HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; + currentPreTreatmentState = handleRecirculateState(); break; case HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE: @@ -131,47 +156,165 @@ { BOOL result = FALSE; - if ( MODE_PRET == getCurrentOperationMode() ) + 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; } /*********************************************************************//** * @brief - * The handleSelfTestNoCartState function handles self-test with no cartrige. + * The signalAlarmActionToPreTreatmentMode function executes the given alarm action + * as appropriate while in PreTreatment Mode. * @details Inputs: none + * @details Outputs: given alarm action executed + * @param action ID of alarm action to execute + * @return none + *************************************************************************/ +void signalAlarmActionToPreTreatmentMode( ALARM_ACTION_T action ) +{ + switch( action ) + { + case ALARM_ACTION_STOP: + handleAlarmActionStop(); + break; + + case ALARM_ACTION_RESUME: + handleAlarmActionResume(); + break; + + case ALARM_ACTION_END_TREATMENT: + requestNewOperationMode( MODE_POST ); + break; + + case ALARM_ACTION_ACK: + // Nothing to be done here + break; + + default: + // Ignore + break; + } +} + +/*********************************************************************//** + * @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 + * @return none + *************************************************************************/ +static void handleAlarmActionStop( 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; + } +} + +/*********************************************************************//** + * @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; + + 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 * @return current state (sub-mode) *************************************************************************/ static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ) { // TODO: Prompt user to close door + VALVE_T valve; + + 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 HD_PRE_TREATMENT_CART_INSTALL_STATE; } /*********************************************************************//** * @brief - * The handleSelfTestDryState function handles dry self-tests after cartridge - * is loaded. + * 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 ) { - return HD_PRE_TREATMENT_PRIME_STATE; + HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_CART_INSTALL_STATE; + + if ( FALSE == isBloodPumpRunning() ) + { + transitionToPrime(); + state = HD_PRE_TREATMENT_PRIME_STATE; + } + + return state; } /*********************************************************************//** @@ -181,36 +324,85 @@ * @details Outputs: transition to self test wet state after priming passed * @return current state (sub-mode) *************************************************************************/ -static HD_PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ) +static HD_PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ) { - HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_PRIME_STATE; + HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_PRIME_STATE; execPrime(); - if ( TRUE == isPrimingPassed() ) + if ( TRUE == isWetSelfTestsPassed() ) { state = HD_PRE_TREATMENT_RECIRCULATE_STATE; + activateAlarmNoData( ALARM_ID_PRIME_COMPLETED_LOW_PRIORITY ); } 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 + * @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; + + // TODO Add handler to UI interaction + patientConnectionStartReqReceived = TRUE; + + if ( TRUE == patientConnectionStartReqReceived ) + { + 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 HD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ) +static HD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ) { if ( TRUE == treatStartReqReceived ) { requestNewOperationMode( MODE_TREA ); } - return HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; + return HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; } /**@}*/