Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r39732559edf2c943e1ef206a393df435a19dc5c9 -r32d273feed8fd8c1278a2a9231b912aef37629ab --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 39732559edf2c943e1ef206a393df435a19dc5c9) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 32d273feed8fd8c1278a2a9231b912aef37629ab) @@ -17,8 +17,8 @@ #include "AirTrap.h" #include "BloodFlow.h" -#include "Buttons.h" #include "Bubbles.h" +#include "Buttons.h" #include "DDInterface.h" #include "Messaging.h" #include "ModeInitPOST.h" @@ -44,25 +44,10 @@ #define USER_COMMAND_CANCEL 0 ///< Cancel treatment workflow command code. #define USER_COMMAND_INITIATE 1 ///< Initiate treatment workflow command code. -/// DG cleaning mode status data structure -typedef struct -{ - BOOL startCleaningMode; ///< Flag to indicate to start cleaning mode. - DD_COMMAND_T startRequestCmdID; ///< DG cleaning mode start request command ID. - ALARM_ID_T alarmID; ///< The informative alarm to trigger for each cleaning mode. - DD_OP_MODE_T ddOpMode; ///< DG 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 DG 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 GENERIC_CONFIRM_ID_T disinfectCancelReqID; ///< ID of requested cancel disinfect mode. -static DD_CLEANING_MODE_STATUS_T currentDDCleaningMode; ///< Current DG cleaning mode status. -static BOOL flagNoDisinfectRequired = FALSE; ///< Flag indicates disinfect not required on next mode entry. 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. @@ -71,13 +56,7 @@ static TD_STANDBY_STATE_T handleStandbyModeStartState( void ); static TD_STANDBY_STATE_T handleStandbyModeWaitForTreatmentState( void ); -static void clearCurrentCleaningModeStatus( void ); -static void setStandbyWaitForTreatmentActuators( void ); -static TD_STANDBY_STATE_T handleStandbyModeWaitForDDCleaningModeStartState( void ); -static TD_STANDBY_STATE_T handleStandbyModeDDCleaningModeInProgressState( void ); -static void handleChemFlushSampleCollection( void ); -static void handleROPermeateSampleCollection( void ); -static TD_STANDBY_STATE_T handleStandbyModeWaitForDDCleaningModeCmdResponseState( void ); +static void setStandbyWaitForTreatmentActuators( TD_STANDBY_STATE_T state ); /*********************************************************************//** * @brief @@ -90,7 +69,6 @@ { currentStandbyState = STANDBY_START_STATE; treatStartReqReceived = FALSE; - disinfectCancelReqID = GENERIC_CONFIRM_ID_NONE; homingInitiated = FALSE; fluidType = FLUID_TYPE_UNKNOWN; modality = TREATMENT_MODALITY_HD_SALINE_FLUID; @@ -117,7 +95,6 @@ setVenousBubbleDetectionEnabled( H18_BBLD, FALSE ); setCurrentSubState( NO_SUB_STATE ); // clearNoRetriggerFlag(); // Alarm flag - clearCurrentCleaningModeStatus(); // Set user alarm recovery actions allowed in this mode setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); @@ -136,8 +113,6 @@ setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); } // Standby currently supports Start and Wait For Treatment states. - // Disinfect/cleaning states are not enabled until the handlers are implemented. - flagNoDisinfectRequired = FALSE; currentStandbyState = STANDBY_START_STATE; // Pumps should be off signalBloodPumpHardStop(); @@ -181,22 +156,6 @@ currentStandbyState = handleStandbyModeWaitForTreatmentState(); break; -// case STANDBY_WAIT_FOR_DISINFECT_STATE: -//// currentStandbyState = handleStandbyModeWaitForDisinfectState(); -// break; -// -// case STANDBY_WAIT_FOR_DD_CLEANING_MODE_CMD_RESPONSE_STATE: -// currentStandbyState = handleStandbyModeWaitForDDCleaningModeCmdResponseState(); -// break; -// -// case STANDBY_WAIT_FOR_DD_CLEANING_MODE_TO_START_STATE: -// currentStandbyState = handleStandbyModeWaitForDDCleaningModeStartState(); -// break; -// -// case STANDBY_CLEANING_MODE_IN_PROGRESS_STATE: -// currentStandbyState = handleStandbyModeDDCleaningModeInProgressState(); -// 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; @@ -244,7 +203,7 @@ { syringePumpVerifyForceSensorDACCalibration(); homingInitiated = FALSE; // reset for next time - setStandbyWaitForTreatmentActuators(); + setStandbyWaitForTreatmentActuators( STANDBY_WAIT_FOR_TREATMENT_STATE ); state = STANDBY_WAIT_FOR_TREATMENT_STATE; // Go to wait for treatment state after above check } } @@ -342,8 +301,9 @@ * @details \b Outputs: TD actuators set to standby state. * @return none *************************************************************************/ -static void setStandbyWaitForTreatmentActuators( void ) +static void setStandbyWaitForTreatmentActuators( TD_STANDBY_STATE_T state ) { + currentStandbyState = state; // Pumps should be off. signalBloodPumpHardStop(); stopSyringePump(); @@ -426,21 +386,22 @@ BOOL signalUserInitiateTreatment( MESSAGE_T *message ) { BOOL result = FALSE; - U32 cmd = 0; - TD_OP_MODE_T mode = getCurrentOperationMode(); + INITIATE_TREATMENT_REQUEST_PAYLOAD_T cmd; + TD_OP_MODE_T mode = getCurrentOperationMode(); REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NONE; INITIATE_TREATMENT_REQUEST_PAYLOAD_T request; UI_RESPONSE_PAYLOAD_T response; + memset( &cmd, 0, sizeof( INITIATE_TREATMENT_REQUEST_PAYLOAD_T ) ); memset( &response, 0, sizeof( UI_RESPONSE_PAYLOAD_T ) ); // Verify message payload length is valid if ( sizeof( INITIATE_TREATMENT_REQUEST_PAYLOAD_T ) == message->hdr.payloadLen ) { memcpy( &request, message->payload, sizeof( INITIATE_TREATMENT_REQUEST_PAYLOAD_T ) ); - cmd = request.command; + cmd.command = request.command; - if ( USER_COMMAND_INITIATE == cmd ) + if ( USER_COMMAND_INITIATE == cmd.command ) { // Verify TD is in Standby mode and waiting for treatment start request. if ( ( MODE_STAN != mode ) || ( STANDBY_WAIT_FOR_TREATMENT_STATE != currentStandbyState ) ) @@ -517,7 +478,7 @@ modality = (TREATMENT_TYPE_T)request.modality; } } - else if ( USER_COMMAND_CANCEL == cmd ) + else if ( USER_COMMAND_CANCEL == cmd.command ) { //Cancel is not currently supported here. //Keep rejected unless signalUserCancelTreatment() is implemented/enabled. @@ -580,274 +541,7 @@ } } -/*********************************************************************//** - * @brief - * The clearCurrentCleaningModeStatus function clears the DG cleaning mode - * variables. - * @details \b Inputs: none - * @details \b Outputs: currentDGCleaningMode - * @return none - *************************************************************************/ -static void clearCurrentCleaningModeStatus( void ) -{ - currentDDCleaningMode.startCleaningMode = FALSE; - currentDDCleaningMode.alarmID = ALARM_ID_NO_ALARM; - currentDDCleaningMode.startRequestCmdID = DD_CMD_NONE; - currentDDCleaningMode.ddOpMode = DD_MODE_FAUL; - currentDDCleaningMode.sampleRqstTrgrd = FALSE; - currentDDCleaningMode.sampleRequestID = GENERIC_CONFIRM_ID_NONE; - currentDDCleaningMode.stopRequestCmdID = GENERIC_CONFIRM_ID_NONE; -} -/*********************************************************************//** - * @brief - * The handleStandbyModeWaitForDDCleaningModeStartState function handles - * the standby mode wait for DD cleaning mode start state. - * @details Inputs: currentDDCleaningMode - * @details Outputs: none - * @return next state of the standby mode state machine - *************************************************************************/ -static TD_STANDBY_STATE_T handleStandbyModeWaitForDDCleaningModeStartState( void ) -{ - TD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DD_CLEANING_MODE_TO_START_STATE; - - if ( currentDDCleaningMode.ddOpMode == getDDOpMode() ) - { - state = STANDBY_CLEANING_MODE_IN_PROGRESS_STATE; - activateAlarmNoData( currentDDCleaningMode.alarmID ); - } - - return state; -} - -/*********************************************************************//** - * @brief - * The handleStandbyModeDDCleaningModeInProgressState function handles - * the standby mode DD cleaning mode in progress state. - * @details \b Inputs: currentDDCleaningMode - * @details \b Outputs: none - * @return next state of the standby mode state machine - *************************************************************************/ -static TD_STANDBY_STATE_T handleStandbyModeDDCleaningModeInProgressState( void ) -{ - TD_STANDBY_STATE_T state = STANDBY_CLEANING_MODE_IN_PROGRESS_STATE; - - if ( DD_MODE_CHFL == currentDDCleaningMode.ddOpMode ) - { - handleChemFlushSampleCollection(); - } - else if ( DD_MODE_ROPS == currentDDCleaningMode.ddOpMode ) - { - handleROPermeateSampleCollection(); - } - - if ( getDDOpMode() != currentDDCleaningMode.ddOpMode ) - { - state = STANDBY_WAIT_FOR_TREATMENT_STATE; - clearAlarm( currentDDCleaningMode.alarmID ); - // In case alarm 306 has been triggered, and it was not cleared, clear it upon exiting the disinfection mode. - clearAlarm( ALARM_ID_DD_TURN_OFF_INLET_WATER_VALVES ); - clearCurrentCleaningModeStatus(); - } - else - { - // If we are in the cleaning modes and the corresponding placeholder alarm is not active, reactivate it. - if ( FALSE == isAlarmActive( currentDDCleaningMode.alarmID ) ) - { - activateAlarmNoData( currentDDCleaningMode.alarmID ); - } - } - - return state; -} - -/*********************************************************************//** - * @brief - * The handleChemFlushSampleCollection function handles the chemical disinfect - * flush mode's sample collection. In this state of the chemical disinfect - * flush mode, user interaction is needed. - * @details \b Inputs: currentDDCleaningMode - * @details \b Outputs: currentDDCleaningMode - * @return none - *************************************************************************/ -static void handleChemFlushSampleCollection( void ) -{ - U08 sampleStatus = 0; - - if ( ( FALSE == currentDDCleaningMode.sampleRqstTrgrd ) - && ( TRUE == isAlarmActive( ALARM_ID_DD_CHEM_DISINFECT_FLUSH_FLUSH_SAMPLE ) ) ) - { - // Check if the flush sample alarm has been raised for the first time in the sample flush state - currentDDCleaningMode.sampleRqstTrgrd = TRUE; - } - else if ( ( TRUE == currentDDCleaningMode.sampleRqstTrgrd ) - && ( FALSE == isAlarmActive( ALARM_ID_DD_CHEM_DISINFECT_FLUSH_FLUSH_SAMPLE ) ) ) - { - GENERIC_CONFIRMATION_REQUEST_T genericConfRequest; - - // 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 - currentDDCleaningMode.sampleRqstTrgrd = FALSE; - - genericConfRequest.requestID = (U32)GENERIC_CONFIRM_ID_DISINFECT_CHEM_FLUSH_SAMPLE_PASS_FAIL; - genericConfRequest.requestType = (U32)GENERIC_CONFIRM_CMD_REQUEST_OPEN; - genericConfRequest.rejectReason = 0; - genericConfRequest.genericPayload1 = 0.0F; - genericConfRequest.genericPayload2 = 0.0F; - genericConfRequest.genericPayload3 = 0.0F; - genericConfRequest.genericPayload4 = 0.0F; - -// currentDDCleaningMode.sampleRequestID = addConfirmationRequest( &genericConfRequest ); //ToDo - } - - if ( currentDDCleaningMode.sampleRequestID != GENERIC_CONFIRM_ID_NONE ) - { - // There is a user confirm - CONFIRMATION_REQUEST_STATUS_T status = CONFIRMATION_REQUEST_STATUS_ACCEPTED; //getConfirmationRequestStatus( currentDDCleaningMode.sampleRequestID, 0.0F, 0.0F, 0.0F, 0.0F ); //Todo - - switch( status ) - { - // If the request status is accepted send a 1 to DG - case CONFIRMATION_REQUEST_STATUS_ACCEPTED: - sampleStatus = (U08)CONFIRMATION_REQUEST_STATUS_ACCEPTED; -// broadcastData( MSG_ID_TD_SEND_CHEM_FLUSH_SAMPLE_PASS_FAIL_TO_DD, COMM_BUFFER_OUT_CAN_TD_2_DD, (U08*) &sampleStatus, 1 ); //ToDo:Required payload - currentDDCleaningMode.sampleRequestID = GENERIC_CONFIRM_ID_NONE; - break; - - // If the request timed out or rejected, it is 0 or failure to DG - case CONFIRMATION_REQUEST_STATUS_TIMEOUT: - sampleStatus = (U08)CONFIRMATION_REQUEST_STATUS_TIMEOUT; -// broadcastData( MSG_ID_TD_SEND_CHEM_FLUSH_SAMPLE_PASS_FAIL_TO_DD, COMM_BUFFER_OUT_CAN_TD_2_DD, (U08*) &sampleStatus, 1 ); //ToDo:Required payload - currentDDCleaningMode.sampleRequestID = GENERIC_CONFIRM_ID_NONE; - break; - case CONFIRMATION_REQUEST_STATUS_REJECTED: - sampleStatus = (U08)CONFIRMATION_REQUEST_STATUS_REJECTED; -// broadcastData( MSG_ID_TD_SEND_CHEM_FLUSH_SAMPLE_PASS_FAIL_TO_DD, COMM_BUFFER_OUT_CAN_TD_2_DD, (U08*) &sampleStatus, 1 ); //ToDo:Required payload - currentDDCleaningMode.sampleRequestID = GENERIC_CONFIRM_ID_NONE; - break; - - case CONFIRMATION_REQUEST_STATUS_PENDING: - case CONFIRMATION_REQUEST_STATUS_UNUSED: - default: - // Nothing to do - break; - } - } -} - -/*********************************************************************//** - * @brief - * The handleROPermeateSampleCollection function handles the RO permeate - * sample collection with the user - * @details \b Inputs: currentDDCleaningMode - * @details \b Outputs: currentDDCleaningMode - * @return none - *************************************************************************/ -static void handleROPermeateSampleCollection( void ) -{ - UI_OFF_BUTTON_PAYLOAD_T cmd; - if ( ( FALSE == currentDDCleaningMode.sampleRqstTrgrd ) && ( TRUE == isAlarmActive( ALARM_ID_DD_RO_PERMEATE_SAMPLE_REMOVE_DIA_CAP ) ) ) - { - // Check if the flush sample alarm has been raised for the first time in the sample flush state - currentDDCleaningMode.sampleRqstTrgrd = TRUE; - } - else if ( ( TRUE == currentDDCleaningMode.sampleRqstTrgrd ) && ( FALSE == isAlarmActive( ALARM_ID_DD_RO_PERMEATE_SAMPLE_REMOVE_DIA_CAP ) ) ) - { - GENERIC_CONFIRMATION_REQUEST_T genericConfRequest; - - // 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 - currentDDCleaningMode.sampleRqstTrgrd = FALSE; - - genericConfRequest.requestID = (U32)GENERIC_CONFIRM_ID_RO_PERMEATE_SAMPLE_STOP_OR_DISPENSE; - genericConfRequest.requestType = (U32)GENERIC_CONFIRM_CMD_REQUEST_OPEN; - genericConfRequest.rejectReason = 0; - genericConfRequest.genericPayload1 = 0.0F; - genericConfRequest.genericPayload2 = 0.0F; - genericConfRequest.genericPayload3 = 0.0F; - genericConfRequest.genericPayload4 = 0.0F; - -// currentDDCleaningMode.sampleRequestID = addConfirmationRequest( &genericConfRequest ); - } - - if ( currentDDCleaningMode.sampleRequestID != GENERIC_CONFIRM_ID_NONE ) - { - // There is a user confirm - CONFIRMATION_REQUEST_STATUS_T status = CONFIRMATION_REQUEST_STATUS_ACCEPTED; //getConfirmationRequestStatus( currentDDCleaningMode.sampleRequestID, 0.0F, 0.0F, 0.0F, 0.0F ); - cmd.id = GENERIC_CONFIRM_ID_DISINFECT_STOP_RO_PERMEATE_SAMPLE; - - switch( status ) - { - // If the request status is accepted send a 1 to DG - case CONFIRMATION_REQUEST_STATUS_ACCEPTED: - cmd.command = GENERIC_CONFIRM_CMD_ACCEPT_CLOSE; - cmd.reason = REQUEST_REJECT_REASON_NONE; - sendMessage( MSG_ID_TD_SEND_RO_PERMEATE_SAMPLE_DISPENSE_REQUEST_TO_DD, COMM_BUFFER_OUT_CAN_TD_2_DD, (U08 *)&cmd, sizeof( UI_OFF_BUTTON_PAYLOAD_T ) ); - currentDDCleaningMode.sampleRequestID = GENERIC_CONFIRM_ID_NONE; - break; - - // If the request timed out or rejected, it is 0 or failure to DG - case CONFIRMATION_REQUEST_STATUS_TIMEOUT: - cmd.command = GENERIC_CONFIRM_CMD_TIMEOUT_CLOSE; - cmd.reason = REQUEST_REJECT_REASON_NONE; - sendMessage( MSG_ID_TD_SEND_RO_PERMEATE_SAMPLE_DISPENSE_REQUEST_TO_DD, COMM_BUFFER_OUT_CAN_TD_2_DD, (U08 *)&cmd, sizeof( UI_OFF_BUTTON_PAYLOAD_T ) ); - currentDDCleaningMode.sampleRequestID = GENERIC_CONFIRM_ID_NONE; - break; - - case CONFIRMATION_REQUEST_STATUS_REJECTED: - cmd.command = GENERIC_CONFIRM_CMD_REJECT; - cmd.reason = REQUEST_REJECT_REASON_NONE; - sendMessage( MSG_ID_TD_SEND_RO_PERMEATE_SAMPLE_DISPENSE_REQUEST_TO_DD, COMM_BUFFER_OUT_CAN_TD_2_DD, (U08 *)&cmd, sizeof( UI_OFF_BUTTON_PAYLOAD_T ) ); - currentDDCleaningMode.sampleRequestID = GENERIC_CONFIRM_ID_NONE; - break; - - case CONFIRMATION_REQUEST_STATUS_PENDING: - case CONFIRMATION_REQUEST_STATUS_UNUSED: - default: - // Nothing to do - break; - } - } -} - -/*********************************************************************//** - * @brief - * The handleStandbyModeWaitForDDCleaningModeCmdResponseState function handles - * the standby mode wait for DD cleaning mode command response state. - * @details \b Inputs: currentDDCleaningMode - * @details \b Outputs: currentDDCleaningMode - * @return next state of the standby mode state machine - *************************************************************************/ -static TD_STANDBY_STATE_T handleStandbyModeWaitForDDCleaningModeCmdResponseState( void ) -{ - DD_CMD_RESPONSE_T ddCmdResp; - TD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DD_CLEANING_MODE_CMD_RESPONSE_STATE; - UI_OFF_BUTTON_PAYLOAD_T cmd; - - if ( TRUE == getDDCommandResponse( currentDDCleaningMode.startRequestCmdID, &ddCmdResp ) ) - { - // Assume the command will be rejected and it goes back to wait for disinfect command - state = STANDBY_WAIT_FOR_DISINFECT_STATE; - currentDDCleaningMode.startCleaningMode = FALSE; - - if ( DD_CMD_REQUEST_REJECT_REASON_NONE == ddCmdResp.rejectCode ) - { - state = STANDBY_WAIT_FOR_DD_CLEANING_MODE_TO_START_STATE; - cmd.command = GENERIC_CONFIRM_CMD_ACCEPT_CLOSE; - } - else - { - cmd.command = GENERIC_CONFIRM_CMD_REJECT; - } - cmd.reason = ddCmdResp.rejectCode; - cmd.id = GENERIC_CONFIRM_ID_DISINFECT_STOP_WATERFLUSH; - sendMessage( MSG_ID_TD_DISINFECT_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&cmd, sizeof( UI_OFF_BUTTON_PAYLOAD_T ) ); - } - - return state; -} - - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/