Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -rceeba51c01b896855eb03ab81281a2b0f48c75d2 -ra6587c2ba0a40bdf12b5fdcf2ba8dec0cd958cfa --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision ceeba51c01b896855eb03ab81281a2b0f48c75d2) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision a6587c2ba0a40bdf12b5fdcf2ba8dec0cd958cfa) @@ -60,10 +60,13 @@ static BOOL flushStartReqReceived; ///< Flag indicates user has requested initiation of flush mode. static BOOL heatDisinfectStartReqReceived; ///< Flag indicates user has requested initiation of heat disinfect mode. static BOOL chemDisinfectStartReqReceived; ///< Flag indicates user has requested initiation of chemical disinfect mode. -static GENERIC_CONFIRM_ID_T disinfectCancelReqID; ///< ID of requested cancel disinfect mode. +static BOOL chemDisinfectFlushStartReqReceived; ///< Flag indicates user has requested initiation of chemical disinfect flush mode. +static GENERIC_CONFIRM_ID_T disinfectCancelReqID; ///< ID of requested cancel disinfect mode. static DG_DISINFECT_STATE_T dgDisinfectState; ///< DG disinfect state to be boadcast to UI. static U32 dataPublishCounter; ///< Disinfects data publish counter. static BOOL homingInitiated; ///< Boolean flag to indicate homing is initiated. +static BOOL hasChemFlushSampleAlarmBeenTrgrd; ///< Boolean flag to indicate whether chem flush sample alarm has been triggered or not. +static GENERIC_CONFIRM_ID_T chemFlushSampleID; ///< Chemical disinfect flush sample ID. /// Interval (in task intervals) at which to publish standby mode data to CAN bus. static OVERRIDE_U32_T standbyModePublishInterval = { DISINFECTS_DATA_PUB_INTERVAL, DISINFECTS_DATA_PUB_INTERVAL, DISINFECTS_DATA_PUB_INTERVAL, 0 }; @@ -90,6 +93,10 @@ static HD_STANDBY_STATE_T handleStandbyModeWaitForDGChemDisinfectStartState( void ); static HD_STANDBY_STATE_T handleStandbyModeDGChemDisininfectInProgressState( void ); +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGChemDisinfectFlushCmdResponseState( void ); +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGChemDisinfectFlushStartState( void ); +static HD_STANDBY_STATE_T handleStandbyModeDGChemDisininfectFlushInProgressState( void ); + static BOOL isDGDisinfectValid( void ); static BOOL haveHDDGServicesBeenExpired( REQUEST_REJECT_REASON_CODE_T* rejReason ); static void publishDisinfectData( void ); @@ -100,20 +107,25 @@ * @details Inputs: none * @details Outputs: currentStandbyState, treatStartReqReceived, * flushStartReqReceived, dataPublishCounter, heatDisinfectStartReqReceived, - * chemDisinfectStartReqReceived, dgDisinfectState, homingInitiated + * chemDisinfectStartReqReceived, dgDisinfectState, homingInitiated, + * chemDisinfectFlushStartReqReceived, hasChemFlushSampleAlarmBeenTrgrd, + * chemFlushSampleID * @return none *************************************************************************/ void initStandbyMode( void ) { - currentStandbyState = STANDBY_START_STATE; - treatStartReqReceived = FALSE; - flushStartReqReceived = FALSE; - dataPublishCounter = 0; - heatDisinfectStartReqReceived = FALSE; - chemDisinfectStartReqReceived = FALSE; - disinfectCancelReqID = GENERIC_CONFIRM_ID_NONE; - dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; - homingInitiated = FALSE; + currentStandbyState = STANDBY_START_STATE; + treatStartReqReceived = FALSE; + flushStartReqReceived = FALSE; + dataPublishCounter = 0; + heatDisinfectStartReqReceived = FALSE; + chemDisinfectStartReqReceived = FALSE; + chemDisinfectFlushStartReqReceived = FALSE; + disinfectCancelReqID = GENERIC_CONFIRM_ID_NONE; + dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; + homingInitiated = FALSE; + hasChemFlushSampleAlarmBeenTrgrd = FALSE; + chemFlushSampleID = GENERIC_CONFIRM_ID_NONE; } /*********************************************************************//** @@ -238,6 +250,18 @@ currentStandbyState = handleStandbyModeDGChemDisininfectInProgressState(); break; + case STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_FLUSH_CMD_RESPONSE_STATE: + currentStandbyState = handleStandbyModeWaitForDGChemDisinfectFlushCmdResponseState(); + break; + + case STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_FLUSH_TO_START_STATE: + currentStandbyState = handleStandbyModeWaitForDGChemDisinfectFlushStartState(); + break; + + case STANDBY_DG_CHEM_DISINFECT_FLUSH_IN_PROGRESS_STATE: + currentStandbyState = handleStandbyModeDGChemDisininfectFlushInProgressState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_STANDBY_INVALID_STATE, currentStandbyState ); currentStandbyState = STANDBY_START_STATE; @@ -470,6 +494,42 @@ /*********************************************************************//** * @brief + * The signalUserInitiateChemcialDisinfectFlushMode function handles user + * initiation of chemical disinfect flush mode. + * @details Inputs: currentStandbyState + * @details Outputs: chemDisinfectFlushStartReqReceived + * @return TRUE if signal accepted, FALSE if not + *************************************************************************/ +BOOL signalUserInitiateChemcialDisinfectFlushMode( void ) +{ + BOOL result = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + + if ( MODE_STAN == getCurrentOperationMode() ) + { + if ( ( STANDBY_WAIT_FOR_DISINFECT_STATE == currentStandbyState ) || ( STANDBY_WAIT_FOR_TREATMENT_STATE == currentStandbyState ) ) + { + if ( TRUE == isDGCommunicating() ) + { + chemDisinfectFlushStartReqReceived = TRUE; + result = TRUE; + currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + else + { + rejReason = REQUEST_REJECT_REASON_DG_COMM_LOST; + } + } + } + + sendDisinfectConfirmResponse( result, rejReason ); + + return result; +} + +/*********************************************************************//** + * @brief * The signalInitiateStandbyDisinfectSubmode function handles user * initiation of setting the disinfects submode. * @details Inputs: currentStandbyState @@ -539,7 +599,8 @@ if ( ( STANDBY_DG_FLUSH_IN_PROGRESS_STATE == currentStandbyState ) || ( STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE == currentStandbyState ) || - ( STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE == currentStandbyState ) ) + ( STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE == currentStandbyState ) || + ( STANDBY_DG_CHEM_DISINFECT_FLUSH_IN_PROGRESS_STATE == currentStandbyState ) ) { if ( ( TRUE == stop ) && ( GENERIC_CONFIRM_ID_NONE == disinfectCancelReqID ) ) { @@ -555,6 +616,10 @@ { confirm_id = GENERIC_CONFIRM_ID_DISINFECT_STOP_CHEMICAL; } + else if ( STANDBY_DG_CHEM_DISINFECT_FLUSH_IN_PROGRESS_STATE == currentStandbyState ) + { + confirm_id = GENERIC_CONFIRM_ID_DISINFECT_STOP_CHEMICAL_FLUSH; + } // Send message to UI to indicate user request to cancel disinfect disinfectCancelReqID = addConfirmationRequest( confirm_id, GENERIC_CONFIRM_CMD_REQUEST_OPEN, 0 ); } @@ -564,7 +629,7 @@ confirm_status = getConfirmationRequestStatus( disinfectCancelReqID ); switch ( confirm_status ) { - case CONFIRMATION_REQUEST_STATUS_ACCEPTED : + case CONFIRMATION_REQUEST_STATUS_ACCEPTED: // Clear request active status disinfectCancelReqID = GENERIC_CONFIRM_ID_NONE; @@ -582,21 +647,25 @@ cmdStopDGChemicalDisinfect(); break; + case STANDBY_DG_CHEM_DISINFECT_FLUSH_IN_PROGRESS_STATE: + cmdStopDGChemFlushDisinfect(); + break; + default: // UI Confirm already closed. Nothing to do. break; } break; - case CONFIRMATION_REQUEST_STATUS_TIMEOUT : - case CONFIRMATION_REQUEST_STATUS_REJECTED : + case CONFIRMATION_REQUEST_STATUS_TIMEOUT: + case CONFIRMATION_REQUEST_STATUS_REJECTED: // Clear request active status disinfectCancelReqID = GENERIC_CONFIRM_ID_NONE; break; case CONFIRMATION_REQUEST_STATUS_PENDING: case CONFIRMATION_REQUEST_STATUS_UNUSED: - default : + default: // Nothing to do break; } @@ -742,6 +811,11 @@ cmdStartDGChemicalDisinfect(); state = STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_CMD_RESPONSE_STATE; } + else if ( TRUE == chemDisinfectFlushStartReqReceived ) + { + cmdStartDGChememicalFlushDisinfect(); + state = STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_FLUSH_CMD_RESPONSE_STATE; + } return state; } @@ -986,6 +1060,128 @@ /*********************************************************************//** * @brief + * The handleStandbyModeWaitForDGChemDisinfectFlushCmdResponseState function handles + * DG chemical disinfect flush wait for command response state. + * @details Inputs: none + * @details Outputs: dgDisinfectState, chemDisinfectFlushStartReqReceived + * @return next state of the standby mode state machine + *************************************************************************/ +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGChemDisinfectFlushCmdResponseState( void ) +{ + DG_CMD_RESPONSE_T dgCmdResp; + HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_FLUSH_CMD_RESPONSE_STATE; + BOOL result = FALSE; + + if ( TRUE == getDGCommandResponse( DG_CMD_START_CHEM_DISINFECT_FLUSH, &dgCmdResp ) ) + { + state = STANDBY_WAIT_FOR_DISINFECT_STATE; + chemDisinfectFlushStartReqReceived = FALSE; + + if ( DG_CMD_REQUEST_REJECT_REASON_NONE == dgCmdResp.rejectCode ) + { + dgDisinfectState = DG_DISINFECT_CHEM_FLUSH_STATE; + state = STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_FLUSH_TO_START_STATE; + result = TRUE; + } + + sendDisinfectConfirmResponse( result, dgCmdResp.rejectCode ); + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleStandbyModeWaitForDGChemDisinfectFlushStartState function handles + * DG chemical disinfect flush wait for start state. + * @details Inputs: none + * @details Outputs: dgDisinfectState + * @return next state of the standby mode state machine + *************************************************************************/ +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGChemDisinfectFlushStartState( void ) +{ + HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_FLUSH_TO_START_STATE; + + if ( DG_MODE_CHFL == getDGOpMode() ) + { + dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; + state = STANDBY_DG_CHEM_DISINFECT_FLUSH_IN_PROGRESS_STATE; + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_DISINFECT_CHEM_FLUSH, 0 ); + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleStandbyModeDGChemDisininfectFlushInProgressState function handles + * DG chemical disinfect flush in progress state. + * @details Inputs: hasChemFlushSampleAlarmBeenTrgrd, chemFlushSampleID + * @details Outputs: dgDisinfectState, hasChemFlushSampleAlarmBeenTrgrd, + * chemFlushSampleID + * @return next state of the standby mode state machine + *************************************************************************/ +static HD_STANDBY_STATE_T handleStandbyModeDGChemDisininfectFlushInProgressState( void ) +{ + HD_STANDBY_STATE_T state = STANDBY_DG_CHEM_DISINFECT_FLUSH_IN_PROGRESS_STATE; + + if ( ( FALSE == hasChemFlushSampleAlarmBeenTrgrd ) && ( TRUE == isAlarmActive( ALARM_ID_DG_CHEM_DISINFECT_FLUSH_FLUSH_SAMPLE ) ) ) + { + // Check if the flush sample alarm has been raised for the first time in the sample flush state + hasChemFlushSampleAlarmBeenTrgrd = TRUE; + } + else if ( ( TRUE == hasChemFlushSampleAlarmBeenTrgrd ) && ( FALSE == isAlarmActive( ALARM_ID_DG_CHEM_DISINFECT_FLUSH_FLUSH_SAMPLE ) ) ) + { + // Sample flush alarm has been triggered and the user has cleared the alarm by pressing Ok. The user is collecting sample. + // Send the notification to the UI to prompt the pass/fail screen so the user can choose whether the sampling after flush passed or failed + hasChemFlushSampleAlarmBeenTrgrd = FALSE; + chemFlushSampleID = addConfirmationRequest( GENERIC_CONFIRM_ID_DISINFECT_CHEM_FLUSH_SAMPLE_PASS_FAIL, GENERIC_CONFIRM_CMD_REQUEST_OPEN, 0 ); + } + + if ( chemFlushSampleID != GENERIC_CONFIRM_ID_NONE ) + { + // There is a user confirm + CONFIRMATION_REQUEST_STATUS_T status = getConfirmationRequestStatus( chemFlushSampleID ); + U32 sampleStatus = 0; + + switch( status ) + { + // If the request status is accepted send a 1 to DG + case CONFIRMATION_REQUEST_STATUS_ACCEPTED: + sampleStatus = (U32)CONFIRMATION_REQUEST_STATUS_ACCEPTED; + chemFlushSampleID = GENERIC_CONFIRM_ID_NONE; + handleSendChemFlushPassFailToDG( sampleStatus ); + break; + + // If the request timed out or rejected, it is 0 or failure to DG + case CONFIRMATION_REQUEST_STATUS_TIMEOUT: + case CONFIRMATION_REQUEST_STATUS_REJECTED: + chemFlushSampleID = GENERIC_CONFIRM_ID_NONE; + handleSendChemFlushPassFailToDG( sampleStatus ); + break; + + case CONFIRMATION_REQUEST_STATUS_PENDING: + case CONFIRMATION_REQUEST_STATUS_UNUSED: + default: + // Nothing to do + break; + } + } + + if ( getDGOpMode() != DG_MODE_CHFL ) + { + dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; + state = STANDBY_WAIT_FOR_TREATMENT_STATE; + clearAlarm( ALARM_ID_HD_DISINFECT_CHEM_FLUSH ); + } + + publishDisinfectData(); + + return state; +} + +/*********************************************************************//** + * @brief * The isDGDisinfectValid function checks whether the DG disinfects is * acceptable to start another treatment. * @details Inputs: none @@ -1108,6 +1304,10 @@ case STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE: data.disinfectDGChemState = state.chemDisinfectUIState; break; + + case STANDBY_DG_CHEM_DISINFECT_FLUSH_IN_PROGRESS_STATE: + data.disinfectDGChemState = state.chemDisinfectUIState; // TDOD add chem flush + break; } data.disinfectSubModeHDState = (U32)dgDisinfectState;