Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r71d7c6359103b2bd22b2317f7d740c954476a34f -rf1b7fd13c6136989018e0907d037ab1c713620c6 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 71d7c6359103b2bd22b2317f7d740c954476a34f) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision f1b7fd13c6136989018e0907d037ab1c713620c6) @@ -19,6 +19,7 @@ #include "BloodFlow.h" #include "Bubbles.h" #include "Buttons.h" +#include "DDDefs.h" #include "DDInterface.h" #include "Messaging.h" #include "ModeInitPOST.h" @@ -44,19 +45,34 @@ #define USER_COMMAND_CANCEL 0 ///< Cancel treatment workflow command code. #define USER_COMMAND_INITIATE 1 ///< Initiate treatment workflow command code. +/// DD cleaning mode status data structure +typedef struct +{ + BOOL startCleaningMode; ///< Flag to indicate to start cleaning mode. + DD_COMMAND_T startRequestCmdID; ///< DD cleaning mode start request command ID. + ALARM_ID_T alarmID; ///< The informative alarm to trigger for each cleaning mode. + DD_OP_MODE_T ddOpMode; ///< DD operation mode. + BOOL sampleRqstTrgrd; ///< Flag to indicate the sample alarm has been triggered (for RO perm and chem flush). + GENERIC_CONFIRM_ID_T sampleRequestID; ///< Sample request pass/fail message status. + GENERIC_CONFIRM_ID_T stopRequestCmdID; ///< Stop DD cleaning request command ID +} DD_CLEANING_MODE_STATUS_T; + // ********** private data ********** static TD_STANDBY_STATE_T currentStandbyState; ///< Current state (sub-mode) of standby mode. static BOOL treatStartReqReceived; ///< Flag indicates user has requested initiation of a treatment. static BOOL homingInitiated; ///< Flag indicates actuators have been homed. static FLUID_TYPE_T fluidType; ///< Fluid type assigned based on user selection. static TREATMENT_TYPE_T modality; ///< Modality from the treatment initiation. +static DD_CLEANING_MODE_STATUS_T currentDDCleaningMode; ///< Current DD cleaning mode status. // ********** private function prototypes ********** static TD_STANDBY_STATE_T handleStandbyModeStartState( void ); static TD_STANDBY_STATE_T handleStandbyModeWaitForTreatmentState( void ); static void setStandbyWaitForTreatmentActuators( TD_STANDBY_STATE_T state ); +static void setRequestedCleaningMode( DD_OP_MODE_T opMode, BOOL isHeatDisPassiveCool ); +static TD_STANDBY_STATE_T handleStandbyModeWaitForDisinfectState( void ); /*********************************************************************//** * @brief @@ -157,6 +173,10 @@ currentStandbyState = handleStandbyModeWaitForTreatmentState(); break; + case STANDBY_WAIT_FOR_DISINFECT_STATE: + currentStandbyState = handleStandbyModeWaitForDisinfectState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_STANDBY_INVALID_STATE, currentStandbyState ); currentStandbyState = STANDBY_START_STATE; @@ -297,6 +317,67 @@ /*********************************************************************//** * @brief + * The handleStandbyModeWaitForDisinfectState function handles wait for + * disinfect state. + * @details \b Inputs: flushStartReqReceived, heatDisinfectStartReqReceived, + * chemDisinfectStartReqReceived + * @details \b Outputs: none + * @return next state of the standby mode state machine + *************************************************************************/ +static TD_STANDBY_STATE_T handleStandbyModeWaitForDisinfectState( void ) +{ + TD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DISINFECT_STATE; + + if ( TRUE == currentDDCleaningMode.startCleaningMode ) + { + switch ( currentDDCleaningMode.ddOpMode ) + { + case DD_MODE_FLUS: + cmdStartDDFlush(); + break; + + case DD_MODE_HEAT: + if ( DD_CMD_START_HEAT_DISINFECT_ACTIVE_COOL == currentDDCleaningMode.startRequestCmdID ) + { + //cmdStartDDHeatDisinfectActiveCool(); + } + else + { + //cmdStartDDHeatDisinfectPassiveCool(); + } + break; + + case DD_MODE_HCOL: + //cmdStartDDActiveCool(); + break; + } + state = STANDBY_WAIT_FOR_DD_CLEANING_MODE_CMD_RESPONSE_STATE; + } + else + { + switch ( getDDOpMode() ) + { + case DD_MODE_FLUS: + case DD_MODE_HEAT: + case DD_MODE_ROPS: + // This is for the situations that any of the disinfect modes are started using the proxy commands while the HD + // is in this state of the Standby Mode. + setRequestedCleaningMode( getDDOpMode(), FALSE ); + state = STANDBY_WAIT_FOR_DD_CLEANING_MODE_TO_START_STATE; + currentDDCleaningMode.startCleaningMode = FALSE; + break; + + default: + // Do nothing we are not in the cleaning mode + break; + } + } + + return state; +} + +/*********************************************************************//** + * @brief * The setStandbyWaitForTreatmentActuators function sets TD actuators to * the required Standby: Wait For Treatment state. * @details \b Inputs: none @@ -329,6 +410,7 @@ } /*********************************************************************//** + * @brief * The setFluidType function sets the fluid type based on the user's * treatment selection from the home screen. * @details \b Inputs: none @@ -351,6 +433,77 @@ /*********************************************************************//** * @brief + * The setRequestedCleaningMode function sets the variables for the requested + * DD cleaning mode. + * @details \b Inputs: currentDDCleaningMode + * @details \b Outputs: none + * @param opMode DD operation mode that has been requested (i.e. heat disinfect) + * @param isHeatDisPassiveCool boolean flag to indicate whether this is a passive + * cool heat disinfect or not. + * @return none + *************************************************************************/ +static void setRequestedCleaningMode( DD_OP_MODE_T opMode, BOOL isHeatDisPassiveCool ) +{ + switch ( opMode ) + { + case DD_MODE_FLUS: + currentDDCleaningMode.startCleaningMode = TRUE; + currentDDCleaningMode.startRequestCmdID = DD_CMD_START_FLUSH; + currentDDCleaningMode.ddOpMode = DD_MODE_FLUS; + currentDDCleaningMode.sampleRqstTrgrd = FALSE; +// currentDDCleaningMode.alarmID = ALARM_ID_TD_DISINFECT_FLUSH; + currentDDCleaningMode.stopRequestCmdID = GENERIC_CONFIRM_ID_DISINFECT_STOP_WATERFLUSH; + break; + +// case DD_MODE_HEAT: +// currentDDCleaningMode.startCleaningMode = TRUE; +// currentDDCleaningMode.startRequestCmdID = ( FALSE == isHeatDisPassiveCool ? DD_CMD_START_HEAT_DISINFECT_ACTIVE_COOL : DD_CMD_START_HEAT_DISINFECT_PASSIVE_COOL ); +// currentDDCleaningMode.ddOpMode = DD_MODE_HEAT; +// currentDDCleaningMode.sampleRqstTrgrd = FALSE; +// currentDDCleaningMode.alarmID = ALARM_ID_TD_DISINFECT_HEAT; +// currentDDCleaningMode.stopRequestCmdID = GENERIC_CONFIRM_ID_DISINFECT_STOP_HEAT; +// break; +// +// case DD_MODE_CHEM: +// currentDDCleaningMode.startCleaningMode = TRUE; +// currentDDCleaningMode.startRequestCmdID = DD_CMD_START_CHEM_DISINFECT; +// currentDDCleaningMode.ddOpMode = DD_MODE_CHEM; +// currentDDCleaningMode.sampleRqstTrgrd = FALSE; +// currentDDCleaningMode.alarmID = ALARM_ID_TD_DISINFECT_CHEM; +// currentDDCleaningMode.stopRequestCmdID = GENERIC_CONFIRM_ID_DISINFECT_STOP_CHEMICAL; +// break; +// +// case DD_MODE_CHFL: +// currentDDCleaningMode.startCleaningMode = TRUE; +// currentDDCleaningMode.startRequestCmdID = DD_CMD_START_CHEM_DISINFECT_FLUSH; +// currentDDCleaningMode.ddOpMode = DD_MODE_CHFL; +// currentDDCleaningMode.sampleRqstTrgrd = FALSE; +// currentDDCleaningMode.alarmID = ALARM_ID_TD_DISINFECT_CHEM_FLUSH; +// currentDDCleaningMode.stopRequestCmdID = GENERIC_CONFIRM_ID_DISINFECT_STOP_CHEMICAL_FLUSH; +// break; +// +// case DD_MODE_HCOL: +// currentDDCleaningMode.startCleaningMode = FALSE; +// currentDDCleaningMode.startRequestCmdID = DD_CMD_START_ACTIVE_COOL; +// currentDDCleaningMode.ddOpMode = DD_MODE_HCOL; +// currentDDCleaningMode.sampleRqstTrgrd = FALSE; +// currentDDCleaningMode.alarmID = ALARM_ID_TD_DISINFECT_HEAT_COOL; +// currentDDCleaningMode.stopRequestCmdID = GENERIC_CONFIRM_ID_DISINFECT_STOP_ACTIVE_COOL; +// break; +// +// case DD_MODE_ROPS: +// currentDDCleaningMode.startCleaningMode = TRUE; +// currentDDCleaningMode.startRequestCmdID = DD_CMD_START_RO_PERMEATE_SAMPLE; +// currentDDCleaningMode.ddOpMode = DD_MODE_ROPS; +// currentDDCleaningMode.sampleRqstTrgrd = FALSE; +// currentDDCleaningMode.alarmID = ALARM_ID_TD_RO_PERMEATE_SAMPLE; +// currentDDCleaningMode.stopRequestCmdID = GENERIC_CONFIRM_ID_DISINFECT_STOP_RO_PERMEATE_SAMPLE; +// break; + } +} + +/*********************************************************************//** + * @brief * The getFluidType function returns the current fluid type assigned * based on the user's treatment selection. * @details \b Inputs: none @@ -546,7 +699,48 @@ } } +/*********************************************************************//** + * @brief + * The signalUserInitiateFlushMode function handles user initiation of flush + * mode. + * @details \b Inputs: currentStandbyState + * @details \b Outputs: currentStandbyState + * @return TRUE if signal accepted, FALSE if not + *************************************************************************/ +BOOL signalUserInitiateFlushMode( void ) +{ + BOOL result = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + UI_RESPONSE_PAYLOAD_T response; + memset( &response, 0, sizeof( UI_RESPONSE_PAYLOAD_T ) ); + if ( MODE_STAN == getCurrentOperationMode() ) + { + if ( ( STANDBY_WAIT_FOR_DISINFECT_STATE == currentStandbyState ) || ( STANDBY_WAIT_FOR_TREATMENT_STATE == currentStandbyState ) ) + { + if ( TRUE == isDDCommunicating() ) + { + setRequestedCleaningMode( DD_MODE_FLUS, FALSE ); + result = TRUE; + currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + else + { + rejReason = REQUEST_REJECT_REASON_DD_COMM_LOST; + } + } + } + + // Respond to request to start treatment. + response.accepted = result; + response.rejectionReason = rejReason; + sendMessage( MSG_ID_TD_DISINFECT_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08*) &response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); + + return result; +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/