Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r8e2cfecc47bb3912078b29513f1717c1567f0071 -r5413ebeb2cb61163574550c7b2ca212ae3e307a3 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 8e2cfecc47bb3912078b29513f1717c1567f0071) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 5413ebeb2cb61163574550c7b2ca212ae3e307a3) @@ -35,16 +35,24 @@ 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 @@ -57,7 +65,10 @@ { treatStartReqReceived = FALSE; patientConnectionStartReqReceived = FALSE; + alarmActionStopReceived = FALSE; + alarmActionResumeReceived = FALSE; currentPreTreatmentState = HD_PRE_TREATMENT_START_STATE; + resumePreTreatmentState = HD_PRE_TREATMENT_START_STATE; } /*********************************************************************//** @@ -116,6 +127,10 @@ currentPreTreatmentState = handlePrimeState(); break; + case HD_PRE_TREATMENT_RECIRCULATE_START_STATE: + currentPreTreatmentState = handleRecirculateStartState(); + break; + case HD_PRE_TREATMENT_RECIRCULATE_STATE: currentPreTreatmentState = handleRecirculateState(); break; @@ -124,6 +139,10 @@ 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 ); @@ -150,6 +169,7 @@ treatStartReqReceived = TRUE; result = TRUE; } + sendTreatmentStartResponseMsg( result, 0 ); // TODO - provide reason code if rejected return result; @@ -166,32 +186,99 @@ *************************************************************************/ void signalAlarmActionToPreTreatmentMode( ALARM_ACTION_T action ) { - if ( HD_PRE_TREATMENT_PRIME_STATE == currentPreTreatmentState ) + switch( action ) { - signalAlarmActionToPrimeMode( 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; } - else +} + +/*********************************************************************//** + * @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 ) { - switch( action ) - { - case ALARM_ACTION_STOP: - break; + case HD_PRE_TREATMENT_PRIME_STATE: + signalAlarmActionToPrimeMode( ALARM_ACTION_STOP ); + break; - case ALARM_ACTION_RESUME: - break; + case HD_PRE_TREATMENT_RECIRCULATE_STATE: + // The corresponding sub-mode will handle the signal + alarmActionStopReceived = TRUE; + break; - case ALARM_ACTION_END_TREATMENT: - requestNewOperationMode( MODE_POST ); - 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; - case ALARM_ACTION_ACK: - // Nothing to be done here - break; + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, (U32)currentPreTreatmentState ); + break; + } +} - default: - // Ignore - 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; + + case HD_PRE_TREATMENT_PAUSE_STATE: + alarmActionResumeReceived = TRUE; + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, (U32)currentPreTreatmentState ); + break; } } @@ -257,27 +344,40 @@ if ( TRUE == isWetSelfTestsPassed() ) { - state = HD_PRE_TREATMENT_RECIRCULATE_STATE; + state = HD_PRE_TREATMENT_RECIRCULATE_START_STATE; activateAlarmNoData( ALARM_ID_PRIME_COMPLETED_LOW_PRIORITY ); - - 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 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 @@ -296,6 +396,17 @@ state = HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; } + if ( TRUE == alarmActionStopReceived ) + { + signalDialOutPumpHardStop(); + signalDialInPumpHardStop(); + signalBloodPumpHardStop(); + cmdStopDGTrimmerHeater(); + + state = HD_PRE_TREATMENT_PAUSE_STATE; + resumePreTreatmentState = HD_PRE_TREATMENT_RECIRCULATE_START_STATE; + } + return state; } @@ -317,4 +428,24 @@ 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; +} + /**@}*/