Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r977c9e90a086a057c60b6347e08e5494745c247f -rb4114c4cd078650769bf8a0379f47989660cc6e1 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 977c9e90a086a057c60b6347e08e5494745c247f) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision b4114c4cd078650769bf8a0379f47989660cc6e1) @@ -15,6 +15,7 @@ * ***************************************************************************/ +#include "AlarmMgmt.h" #include "ModePreTreat.h" #include "OperationModes.h" #include "Prime.h" @@ -25,18 +26,34 @@ * @{ */ +// ********** 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 +64,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,14 +82,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 = HD_PRE_TREATMENT_START_STATE; + initPreTreatmentMode(); } /*********************************************************************//** @@ -108,14 +128,10 @@ currentPreTreatmentState = handlePrimeState(); break; - /*case HD_PRE_TREATMENT_SELF_TEST_WET_STATE: - currentPreTreatmentState = HD_PRE_TREATMENT_RECIRC_STATE; + case HD_PRE_TREATMENT_RECIRCULATE_STATE: + currentPreTreatmentState = handleRecirculateState(); break; - case HD_PRE_TREATMENT_RECIRC_STATE: - currentPreTreatmentState = HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; - break;*/ - case HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE: currentPreTreatmentState = handlePatientConnectionState(); break; @@ -141,11 +157,12 @@ { 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; @@ -162,12 +179,101 @@ *************************************************************************/ void signalAlarmActionToPreTreatmentMode( ALARM_ACTION_T action ) { - // TODO - implement + 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 handleSelfTestNoCartState function handles self-test with no cartrige. + * 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) @@ -176,6 +282,13 @@ { // TODO: Prompt user to close door + VALVE_T valve; + + for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) + { + homeValve( valve ); + } + homeBloodPump(); homeDialInPump(); homeDialOutPump(); @@ -187,7 +300,7 @@ /*********************************************************************//** * @brief - * The handleSelfTestDryState function handles dry self-test. + * The handleSelfTestDryState function performs dry self-test. * @details Inputs: none * @details Outputs: transition to prime sub-mode when blood pump finished homing * @return current state (sub-mode) @@ -218,16 +331,72 @@ execPrime(); - if ( TRUE == isPrimingPassed() ) + if ( TRUE == isWetSelfTestsPassed() ) { - //state = HD_PRE_TREATMENT_SELF_TEST_WET_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; + } + + if ( TRUE == alarmActionStopReceived ) + { + signalDialOutPumpHardStop(); + signalDialInPumpHardStop(); + signalBloodPumpHardStop(); + cmdStopDGTrimmerHeater(); + } + + return state; +} + +/*********************************************************************//** + * @brief * The handlePatientConnectionState function handles patient connection state * during pre-treatment mode. * @details Inputs: none