Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -rbcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e -r176bb5bc32a18891912e179dc1bc9293b370bed4 --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision bcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 176bb5bc32a18891912e179dc1bc9293b370bed4) @@ -19,12 +19,15 @@ #include "AirTrap.h" #include "BloodFlow.h" #include "Buttons.h" +#include "DDInterface.h" #include "EjectorMotor.h" +#include "Messaging.h" #include "ModePostTreat.h" +#include "ModeStandby.h" #include "OperationModes.h" -#include "RotaryValve.h" #include "Switches.h" #include "SyringePump.h" +#include "TaskPriority.h" #include "Timers.h" #include "TubeSetAutoEject.h" #include "TxParams.h" @@ -36,13 +39,15 @@ * @{ */ +#define POST_TREAT_STATE_BROADCAST_COUNT (MS_PER_SECOND / TASK_PRIORITY_INTERVAL) + // ********** private definitions ********** static BOOL patientDisconnectionConfirmed; ///< Flag indicates user confirms patient disconnection. static BOOL patientDisconnectHandled; ///< Flag indicates patient disconnect actions have been handled static BOOL disposableRemovalConfirmed; ///< Flag indicates user confirms disposable removal. -static DD_COMMAND_T selectedDisinfectionCommand; ///< Flag indicates user confirms disinfection selection. -static volatile U32 postTreatmentStateBroadcastTimer; ///< Timer counter for pending power off request. +static DISINFECT_SELECTION_T selectedDisinfectionSelection; ///< Selected disinfection option from UI.static BOOL disinfectionSelectionReceived; +static volatile U32 postTreatmentStateBroadcastTimer; ///< Timer counter for pending power off request. static TD_POST_TREATMENT_STATE_T currentPostTreatmentState; ///< Current Post-Treatment sub-state @@ -63,11 +68,13 @@ **************************************************************************/ void initPostTreatmentMode( void ) { - patientDisconnectionConfirmed = FALSE; - patientDisconnectHandled = FALSE; - disposableRemovalConfirmed = FALSE; - selectedDisinfectionCommand = DD_CMD_NONE; - currentPostTreatmentState = TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE; + currentPostTreatmentState = TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE; + patientDisconnectionConfirmed = FALSE; + patientDisconnectHandled = FALSE; + disposableRemovalConfirmed = FALSE; + disinfectionSelectionReceived = FALSE; + selectedDisinfectionSelection = DISINFECT_SEL_SKIP; + postTreatmentStateBroadcastTimer = 0; } /*********************************************************************//** @@ -113,35 +120,32 @@ VALVE_3WAY_COMMON_TO_CLOSED_STATE ); //H10 Heparin/Syringe Pump - Off. stopSyringePump(); + signalBloodPumpHardStop(); switch ( currentPostTreatmentState ) { case TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE: - signalBloodPumpHardStop(); - disableEjectorMotor(); - //TODO check on valve positions setValvePosition( H1_VALV, VALVE_POSITION_C_CLOSE ); setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); break; case TD_POST_TREATMENT_AUTO_EJECT_STATE: - signalBloodPumpHardStop(); + setValvePosition( H1_VALV, + VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H19_VALV, + VALVE_POSITION_A_INSERT_EJECT ); break; case TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE: - signalBloodPumpHardStop(); - disableEjectorMotor(); setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); break; case TD_POST_TREATMENT_DISINFECTION_STATE: - signalBloodPumpHardStop(); - disableEjectorMotor(); setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); setValvePosition( H19_VALV, @@ -201,12 +205,13 @@ currentPostTreatmentState ); break; } - if ( TRUE == didTimeout( postTreatmentStateBroadcastTimer, POST_TREATMENT_STATE_BROADCAST_INTERVAL_MS ) ) + postTreatmentStateBroadcastTimer++; + + if (postTreatmentStateBroadcastTimer >= POST_TREAT_STATE_BROADCAST_COUNT) { - postTreatmentStateBroadcastTimer = getMSTimerCount(); - //TODO: broadcast current state to UI + postTreatmentStateBroadcastTimer = 0U; + //TODO: need to broadcast currentstate on which msgid } - if ( prevPostTreatmentState != currentPostTreatmentState) { setPostTreatStateTransition(); @@ -217,15 +222,16 @@ /*********************************************************************//** * @brief - * The checkPostTreatmentPatientDisconnect function checks UI patient - * disconnect and handles valve release, pump homing, door requirement. - * @details \b Inputs: patientDisconnectionConfirmed, patientDisconnectHandled - * @details \b Outputs: patientDisconnectHandled, home pumps, open valves, - * retract syringe, door closed requirement. - * @return none + * The handlePatientDisconnectionState function executes the Post-Treatment + * mode Patient Disconnection state machine. + * @details \b Inputs: none + * @details \b Outputs: processed patient disconnection confirmation + * @return next post-treatment mode state *************************************************************************/ -static void checkPostTreatmentPatientDisconnect( void ) +static TD_POST_TREATMENT_STATE_T handlePatientDisconnectionState( void ) { + TD_POST_TREATMENT_STATE_T state = TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE; + VALVE_T valve; if ( ( TRUE == patientDisconnectionConfirmed ) && ( FALSE == patientDisconnectHandled ) ) @@ -246,22 +252,6 @@ // Patient Disconnect State needs it to move to next state patientDisconnectHandled = TRUE; } -} - -/*********************************************************************//** - * @brief - * The handlePatientDisconnectionState function executes the Post-Treatment - * mode Patient Disconnection state machine. - * @details \b Inputs: none - * @details \b Outputs: processed patient disconnection confirmation - * @return next post-treatment mode state - *************************************************************************/ -static TD_POST_TREATMENT_STATE_T handlePatientDisconnectionState( void ) -{ - TD_POST_TREATMENT_STATE_T state = TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE; - - checkPostTreatmentPatientDisconnect(); - if ( TRUE == patientDisconnectionConfirmed ) { patientDisconnectionConfirmed = FALSE; @@ -322,39 +312,66 @@ * The handleDisinfectionState function executes the Post-Treatment * Disinfection state. * @details \b Inputs: User disinfection selection from UI. - * @details \b Outputs: Initiates the selected disinfection operation or - * transitions the system to Standby. + * @details \b Outputs: selectedDisinfectionSelection * @return Current Post-Treatment state. *************************************************************************/ static TD_POST_TREATMENT_STATE_T handleDisinfectionState( void ) { - TD_POST_TREATMENT_STATE_T state = TD_POST_TREATMENT_DISINFECTION_STATE; + TD_POST_TREATMENT_STATE_T state = + TD_POST_TREATMENT_DISINFECTION_STATE; - switch ( selectedDisinfectionCommand ) + if ( TRUE == disinfectionSelectionReceived ) { - case DD_CMD_NONE: - //TODO: transitionToStandbyMode - break; - case DD_CMD_START_FLUSH: - //TODO: Need to send info to DD - break; - case DD_CMD_START_DISINFECT_HEAT: - //TODO: Need to send info to DD - break; - case DD_CMD_START_DISINFECT_CITRIC_DD: - break; - case DD_CMD_START_DISINFECT_CITRIC_DD_IOFP: - break; - case DD_CMD_START_DISINFECT_SUBSTITUTION_PORT: - break; - default: - //TODO: do i need to set any alarm here - break; + // Save selected disinfection option in Standby. + signalStandbyDisinfectionSelection( + selectedDisinfectionSelection ); + + // Request DD transition to Standby. + cmdStopGenerateDialysate(); + + // Transition TD to Standby. + requestNewOperationMode( MODE_STAN ); + + disinfectionSelectionReceived = FALSE; } return state; } +/*********************************************************************//** + * @brief + * The handleDisinfectionConfirmCmd function handles user selection + * of the Post-Treatment disinfection operation. + * @details \b Inputs: Disinfection selection message. + * @details \b Outputs: Acceptance response and selected disinfection command. + * @param message Pointer to the message to handle. + * @return TRUE if the selection is accepted, FALSE otherwise. + *************************************************************************/ +BOOL handleDisinfectionConfirmCmd( MESSAGE_T *message ) +{ + BOOL result = FALSE; + TD_OP_MODE_T mode = getCurrentOperationMode(); + UI_RESPONSE_PAYLOAD_T response; + response.rejectionReason = REQUEST_REJECT_REASON_NONE; + + if ( sizeof( U32 ) == message->hdr.payloadLen ) + { + disinfectionSelectionReceived = TRUE; + } + else + { + response.rejectionReason = + REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; + } + + response.accepted = result; + + sendMessage( MSG_ID_TD_DISINFECT_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, + (U08 *)&response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); + + return result; +} + /*********************************************************************//** * @brief * The signalUserConfirmPatientDisconnection signals post-treatment mode @@ -389,9 +406,9 @@ * @details \b Outputs: selectedDisinfectionCommand * @return none *************************************************************************/ -void signalUserConfirmDisinfection( DD_COMMAND_T state ) +void signalUserConfirmDisinfection( DISINFECT_SELECTION_T selection ) { - selectedDisinfectionCommand = state; + selectedDisinfectionSelection = selection; } Index: firmware/App/Modes/ModePostTreat.h =================================================================== diff -u -rbcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e -r176bb5bc32a18891912e179dc1bc9293b370bed4 --- firmware/App/Modes/ModePostTreat.h (.../ModePostTreat.h) (revision bcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e) +++ firmware/App/Modes/ModePostTreat.h (.../ModePostTreat.h) (revision 176bb5bc32a18891912e179dc1bc9293b370bed4) @@ -30,8 +30,6 @@ * @{ */ -#define POST_TREATMENT_STATE_BROADCAST_INTERVAL_MS 1000 - // ********** public function prototypes ********** void initPostTreatmentMode( void ); // Initialize this module @@ -42,7 +40,8 @@ void signalUserConfirmPatientDisconnection( void ); void signalUserConfirmDisposableRemoval( void ); -void signalUserConfirmDisinfection( DD_COMMAND_T state ); +void signalUserConfirmDisinfection( DISINFECT_SELECTION_T selection ); +BOOL handleDisinfectionConfirmCmd( MESSAGE_T *message ); /**@}*/ Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -rbcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e -r176bb5bc32a18891912e179dc1bc9293b370bed4 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision bcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 176bb5bc32a18891912e179dc1bc9293b370bed4) @@ -47,7 +47,7 @@ typedef struct { BOOL startCleaningMode; ///< Flag to indicate to start cleaning mode. - DD_COMMAND_T startRequestCmdID; ///< DD cleaning mode start request command ID. + DD_DISINFECT_SEL_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). @@ -62,13 +62,15 @@ 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 BOOL heatDisinfectionStartConfirmed; static DD_CLEANING_MODE_STATUS_T currentDDCleaningMode; ///< Current DD cleaning mode status. +static DD_DISINFECT_SEL_COMMAND_T requestedDisinfectionCommand = DD_CMD_DISINFECT_INIT; // ********** private function prototypes ********** static TD_STANDBY_STATE_T handleStandbyModeStartState( void ); static TD_STANDBY_STATE_T handleStandbyModeWaitForTreatmentState( void ); -static void setRequestedCleaningMode( DD_OP_MODE_T opMode, BOOL isHeatDisPassiveCool ); +static void setRequestedCleaningMode( DD_DISINFECT_SEL_COMMAND_T opMode ); static TD_STANDBY_STATE_T handleStandbyModeWaitForDisinfectState( void ); /*********************************************************************//** @@ -83,6 +85,7 @@ currentStandbyState = STANDBY_START_STATE; treatStartReqReceived = FALSE; homingInitiated = FALSE; + heatDisinfectionStartConfirmed = FALSE; fluidType = FLUID_TYPE_UNKNOWN; modality = TREATMENT_MODALITY_HD_SALINE_FLUID; } @@ -165,6 +168,25 @@ currentStandbyState = handleStandbyModeWaitForDisinfectState(); break; + case STANDBY_WAIT_FOR_DD_CLEANING_MODE_TO_START_STATE: + if ( DD_MODE_HEAT == getDDOpMode() ) + { + currentStandbyState = STANDBY_CLEANING_MODE_IN_PROGRESS_STATE; + } + break; + + case STANDBY_CLEANING_MODE_IN_PROGRESS_STATE: + if ( ( DD_MODE_HEAT == getDDOpMode() ) && + ( DD_HEAT_DISINFECT_STATE_COMPLETE == getDDSubMode() ) ) + { + requestedDisinfectionCommand = DD_CMD_DISINFECT_INIT; + heatDisinfectionStartConfirmed = FALSE; + + currentStandbyState = + STANDBY_WAIT_FOR_TREATMENT_STATE; + } + 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; @@ -228,7 +250,24 @@ // } // } // } + switch ( requestedDisinfectionCommand ) + { + case DD_CMD_START_DISINFECT_SKIP: + case DD_CMD_DISINFECT_INIT: + state = STANDBY_WAIT_FOR_TREATMENT_STATE; + requestedDisinfectionCommand = DD_CMD_DISINFECT_INIT; + break; + case DD_CMD_START_DISINFECT_HEAT: + state = STANDBY_WAIT_FOR_DISINFECT_STATE; + break; + + default: + state = STANDBY_WAIT_FOR_TREATMENT_STATE; + requestedDisinfectionCommand = DD_CMD_DISINFECT_INIT; + break; + } + return state; } @@ -326,50 +365,16 @@ { TD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DISINFECT_STATE; - if ( TRUE == currentDDCleaningMode.startCleaningMode ) + if ( ( DISINFECT_SEL_HEAT == requestedDisinfectionSelection ) && + ( TRUE == heatDisinfectionStartConfirmed ) ) { - switch ( currentDDCleaningMode.ddOpMode ) - { - case DD_MODE_FLUS: - cmdStartDDFlush(); - break; + heatDisinfectionStartConfirmed = FALSE; - case DD_MODE_HEAT: -// if ( DD_CMD_START_HEAT_DISINFECT_ACTIVE_COOL == currentDDCleaningMode.startRequestCmdID ) -// { -// //cmdStartDDHeatDisinfectActiveCool(); -// } -// else -// { -// //cmdStartDDHeatDisinfectPassiveCool(); -// } - break; + cmdStartDDHeatDisinfect(); - case DD_MODE_HCOL: - //cmdStartDDActiveCool(); - break; - } - state = STANDBY_WAIT_FOR_DD_CLEANING_MODE_CMD_RESPONSE_STATE; + state = STANDBY_WAIT_FOR_DD_CLEANING_MODE_TO_START_STATE; } - else - { - switch ( getDDOpMode() ) - { - case DD_MODE_FLUS: - case DD_MODE_HEAT: - // 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; } @@ -406,63 +411,22 @@ * cool heat disinfect or not. * @return none *************************************************************************/ -static void setRequestedCleaningMode( DD_OP_MODE_T opMode, BOOL isHeatDisPassiveCool ) +static void setRequestedCleaningMode( DD_DISINFECT_SEL_COMMAND_T opMode ) { 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; + case DD_CMD_START_DISINFECT_SKIP: break; -// case DD_MODE_HEAT: -// currentDDCleaningMode.startCleaningMode = TRUE; + case DD_CMD_START_DISINFECT_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.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; + currentDDCleaningMode.stopRequestCmdID = GENERIC_CONFIRM_ID_DISINFECT_STOP_HEAT; + break; + } } @@ -613,42 +577,108 @@ /*********************************************************************//** * @brief - * The signalUserInitiateFlushMode function handles user initiation of flush + * The signalUserInitiateDisinfectionSelection 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 signalUserInitiateDisinfectionSelection( + DD_DISINFECT_SEL_COMMAND_T command ) { - 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 ) ); + BOOL result = FALSE; if ( MODE_STAN == getCurrentOperationMode() ) { - if ( ( STANDBY_WAIT_FOR_DISINFECT_STATE == currentStandbyState ) || ( STANDBY_WAIT_FOR_TREATMENT_STATE == currentStandbyState ) ) + if ( STANDBY_WAIT_FOR_TREATMENT_STATE == currentStandbyState ) { - if ( TRUE == isDDCommunicating() ) + if ( DD_CMD_START_DISINFECT_SKIP == command ) { - setRequestedCleaningMode( DD_MODE_FLUS, FALSE ); - result = TRUE; - currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; - rejReason = REQUEST_REJECT_REASON_NONE; + requestedDisinfectionCommand = DD_CMD_DISINFECT_INIT; + currentStandbyState = STANDBY_WAIT_FOR_TREATMENT_STATE; + result = TRUE; } - else + else if ( DD_CMD_START_DISINFECT_HEAT == command ) { - rejReason = REQUEST_REJECT_REASON_DD_COMM_LOST; + requestedDisinfectionCommand = command; + currentStandbyState = STANDBY_WAIT_FOR_DISINFECT_STATE; + result = TRUE; } } + else if ( ( STANDBY_WAIT_FOR_DISINFECT_STATE == currentStandbyState ) && + ( DD_CMD_START_DISINFECT_HEAT == command ) ) + { + // User confirmed Heat Disinfection setup screen. + heatDisinfectionStartConfirmed = TRUE; + result = TRUE; + } } + else if ( MODE_POST == getCurrentOperationMode() ) + { + signalUserConfirmDisinfection( command ); + result = TRUE; + } - // 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; +} +/*********************************************************************//** + * @brief + * The signalStandbyDisinfectionSelection function saves the selected + * disinfection option for use by Standby mode. + * @details \b Inputs: Selected disinfection command. + * @details \b Outputs: Updates requestedDisinfectionCommand. + * @param command Selected disinfection command. + * @return none + *************************************************************************/ +void signalStandbyDisinfectionSelection( DD_DISINFECT_SEL_COMMAND_T command ) +{ + requestedDisinfectionCommand = command; +} + +/*********************************************************************//** + * @brief + * The handleUIDisinfectRequest function handles a disinfect/flush user + * action command message from the UI. + * @details \b Inputs: none + * @details \b Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +BOOL handleUIDisinfectRequest( MESSAGE_T *message ) +{ + BOOL result = FALSE; + TD_OP_MODE_T mode = getCurrentOperationMode(); + UI_RESPONSE_PAYLOAD_T response; + DD_DISINFECT_SEL_COMMAND_T command = DD_CMD_DISINFECT_INIT; + + response.rejectionReason = REQUEST_REJECT_REASON_NONE; + if ( sizeof( U32 ) == message->hdr.payloadLen ) + { + memcpy( &command , &message->payload[ 0 ], sizeof(U32) ); + if ( TRUE == isDDCommunicating() ) + { + result = signalUserInitiateDisinfectionSelection( command ); + response.rejectionReason = + REQUEST_REJECT_REASON_NONE; + } + else + { + response.rejectionReason = + REQUEST_REJECT_REASON_DD_COMM_LOST; + } + } + else + { + response.rejectionReason = + REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; + } + + response.accepted = result; + + sendMessage( MSG_ID_TD_DISINFECT_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, + (U08 *)&response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); + return result; } Index: firmware/App/Modes/ModeStandby.h =================================================================== diff -u -rbcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e -r176bb5bc32a18891912e179dc1bc9293b370bed4 --- firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision bcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e) +++ firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 176bb5bc32a18891912e179dc1bc9293b370bed4) @@ -20,6 +20,7 @@ #include "TDCommon.h" #include "TDDefs.h" +#include "DDDefs.h" /** * @defgroup TDStandbyMode TDStandbyMode @@ -47,7 +48,9 @@ BOOL signalUserInitiateTreatment( MESSAGE_T *message ); // User has initiated/cancelled treatment workflow void signalAlarmActionToStandbyMode( ALARM_ACTION_T action ); // Execute alarm action as appropriate for Standby mode -BOOL signalUserInitiateFlushMode( void ); +BOOL signalUserInitiateDisinfectionSelection( DISINFECT_SELECTION_T command ); +void signalStandbyDisinfectionSelection( DISINFECT_SELECTION_T command ); +BOOL handleUIDisinfectRequest( MESSAGE_T *message ); void setFluidType( TREATMENT_TYPE_T modality ); // Set a specific fluid type FLUID_TYPE_T getFluidType( void ); // Get a specific fluid type Index: firmware/App/Services/DDInterface.c =================================================================== diff -u -rbcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e -r176bb5bc32a18891912e179dc1bc9293b370bed4 --- firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision bcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e) +++ firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision 176bb5bc32a18891912e179dc1bc9293b370bed4) @@ -15,7 +15,6 @@ * ***************************************************************************/ -#include "DDDefs.h" #include "DDInterface.h" #include "MessagePayloads.h" #include "Messaging.h" @@ -629,20 +628,23 @@ /*********************************************************************//** * @brief - * The cmdStartDDFlush function sends a start flush command message to - * the DD. + * The cmdStartDDHeatDisinfect function sends a Heat Disinfection start + * request to the DD. * @details \b Inputs: none - * @details \b Outputs: start flush mode command sent to DD. + * @details \b Outputs: Heat Disinfection start request sent to DD. * @return none *************************************************************************/ -void cmdStartDDFlush( void ) +void cmdStartDDHeatDisinfect( void ) { - UI_RESPONSE_PAYLOAD_T response; - memset( &response, 0, sizeof( UI_RESPONSE_PAYLOAD_T ) ); - response.accepted = TRUE; + DD_COMMAND_T command = DD_CMD_START_DISINFECT_HEAT; - ddCmdResp[ DD_CMD_START_FLUSH ].commandID = DD_CMD_NONE; - sendMessage( MSG_ID_TD_DD_FLUSH_REQUEST, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08*) &response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); + ddCmdResp[ DD_CMD_START_DISINFECT_HEAT ].commandID = DD_CMD_NONE; + +#ifndef TEST_UI_ONLY + sendMessage( MSG_ID_TD_DD_HEAT_DISINFECT_REQUEST, + COMM_BUFFER_OUT_CAN_TD_2_DD, + (U08 *)&command, sizeof( U32 ) ); +#endif } Index: firmware/App/Services/DDInterface.h =================================================================== diff -u -rbcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e -r176bb5bc32a18891912e179dc1bc9293b370bed4 --- firmware/App/Services/DDInterface.h (.../DDInterface.h) (revision bcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e) +++ firmware/App/Services/DDInterface.h (.../DDInterface.h) (revision 176bb5bc32a18891912e179dc1bc9293b370bed4) @@ -64,7 +64,7 @@ void cmdBypassDialyzer( BOOL bypass ); void cmdStopGenerateDialysate( void ); void cmdSubstitutionRate (F32 qs ); -void cmdStartDDFlush( void ); +void cmdStartDDHeatDisinfect( void ); void handleDDCommandResponse( DD_CMD_RESPONSE_T *ddCmdRespPtr ); BOOL getDDCommandResponse( U32 commandID, DD_CMD_RESPONSE_T *cmdRespPtr ); Index: firmware/App/Services/Messaging.c =================================================================== diff -u -rbcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e -r176bb5bc32a18891912e179dc1bc9293b370bed4 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision bcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 176bb5bc32a18891912e179dc1bc9293b370bed4) @@ -145,7 +145,7 @@ { MSG_ID_UI_DISINFECT_REQUEST, &handleUIDisinfectRequest }, { MSG_ID_UI_PATIENT_DISCONNECT_CONFIRM_REQUEST, &handlePatientDisconnectionConfirmCmd }, { MSG_ID_UI_POST_TREATMENT_DISPOSABLE_REMOVAL_CONFIRM_REQUEST, &handleDisposableRemovalConfirmCmd }, - { MSG_ID_UI_POST_TREATMENT_DISINFECTION_SELECTION_REQUEST, &handleDisinfectionConfirmCmd }, + { MSG_ID_TD_DISINFECT_RESPONSE, &handleDisinfectionConfirmCmd }, { MSG_ID_TD_SOFTWARE_RESET_REQUEST, &testTDSoftwareResetRequest }, { MSG_ID_TD_BUBBLE_OVERRIDE_REQUEST, &testBubbleDetectOverride }, { MSG_ID_TD_BUBBLE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testBubblesDataPublishIntervalOverride }, @@ -561,60 +561,6 @@ /*********************************************************************//** * @brief - * The handleUIDisinfectRequest function handles a disinfect/flush user - * action command message from the UI. - * @details \b Inputs: none - * @details \b Outputs: message handled - * @param message a pointer to the message to handle - * @return none - *************************************************************************/ -BOOL handleUIDisinfectRequest( MESSAGE_T *message ) -{ - BOOL result = FALSE; - - if ( message->hdr.payloadLen == sizeof(U32) ) - { - U32 cmd; - - memcpy( &cmd, message->payload, sizeof(U32) ); - - if ( DD_DISINFECT_FLUSH_STATE == cmd ) // Command 0 = Flush - { - result = signalUserInitiateFlushMode(); - } -// else if ( DD_DISINFECT_HEAT_STATE_ACTIVE_COOL == cmd ) // Command 1 = Heat disinfect active cool -// { -// result = signalUserInitiateHeatDisinfectActiveCoolMode(); -// } -// else if ( DD_DISINFECT_CHEM_STATE == cmd ) // Command 2 = chemical disinfect -// { -// result = signalUserInitiateChemicalDisinfectMode(); -// } -// else if ( DD_DISINFECT_CHEM_FLUSH_STATE == cmd ) // Command 3 = chemical disinfect flush -// { -// result = signalUserInitiateChemicalDisinfectFlushMode(); -// } -// else if ( DD_DISINFECT_RO_PERMEATE_SAMPLE_STATE == cmd ) // Command 4 = RO permeate sample -// { -// result = signalUserInitiateROPermeateSampleMode(); -// } -// else if ( DD_DISINFECT_HEAT_STATE_PASSIVE_COOL == cmd ) // Command 5 = Heat disinfect passive coode -// { -// result = signalUserInitiateHeatDisinfectPassiveCoolMode(); -// } -// else if ( DD_DISINFECT_ACTIVE_COOL == cmd ) // Command 6 = Active cool -// { -// result = signalUserInitiateActiveCoolMode(); -// } - } - - sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_TD_2_UI, result ); - - return result; -} - -/*********************************************************************//** - * @brief * The handlePatientDisconnectionConfirmCmd function handles user * confirmation of patient disconnection. * @details \b Inputs: Patient disconnection confirmation message. @@ -707,58 +653,7 @@ return result; } -/*********************************************************************//** - * @brief - * The handleDisinfectionConfirmCmd function handles user selection - * of the Post-Treatment disinfection operation. - * @details \b Inputs: Disinfection selection message. - * @details \b Outputs: Acceptance response and selected disinfection command. - * @param message Pointer to the message to handle. - * @return TRUE if the selection is accepted, FALSE otherwise. - *************************************************************************/ -BOOL handleDisinfectionConfirmCmd( MESSAGE_T *message ) -{ - BOOL result = FALSE; - BOOL modeValid = FALSE; - TD_OP_MODE_T mode = getCurrentOperationMode(); - UI_RESPONSE_PAYLOAD_T response; - DD_COMMAND_T command = DD_CMD_NONE; - response.rejectionReason = REQUEST_REJECT_REASON_NONE; - - if ( sizeof( U32 ) == message->hdr.payloadLen ) - { - modeValid = ( MODE_POST == mode ) ? TRUE : FALSE; - - if ( FALSE == modeValid ) - { - response.rejectionReason = - REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; - } - else - { - memcpy( &command , &message->payload[ 0 ], sizeof(U32) ); - signalUserConfirmDisinfection( command ); - result = TRUE; - } - } - else - { - response.rejectionReason = - REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; - } - - response.accepted = result; - - sendMessage( MSG_ID_TD_POST_TREATMENT_DISINFECTION_SELECTION_RESPONSE, - COMM_BUFFER_OUT_CAN_TD_2_UI, - (U08 *)&response, - sizeof( UI_RESPONSE_PAYLOAD_T ) ); - - return result; -} - - // *********************************************************************** // ***************** Message Sending Helper Functions ******************** // *********************************************************************** Index: firmware/App/Services/Messaging.h =================================================================== diff -u -rbcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e -r176bb5bc32a18891912e179dc1bc9293b370bed4 --- firmware/App/Services/Messaging.h (.../Messaging.h) (revision bcc80fde38b8b94c64a7ad615f9ca3cb6e98c77e) +++ firmware/App/Services/Messaging.h (.../Messaging.h) (revision 176bb5bc32a18891912e179dc1bc9293b370bed4) @@ -144,10 +144,8 @@ BOOL handleTesterLogInRequest( MESSAGE_T *message ); BOOL handleUpdateAvailable( MESSAGE_T *message ); BOOL handleUIVersionResponse( MESSAGE_T *message ); -BOOL handleUIDisinfectRequest( MESSAGE_T *message ); BOOL handlePatientDisconnectionConfirmCmd( MESSAGE_T *message ); BOOL handleDisposableRemovalConfirmCmd( MESSAGE_T *message ); -BOOL handleDisinfectionConfirmCmd( MESSAGE_T *message ); // Test send message helper functions BOOL sendEvent( TD_EVENT_ID_T event, EVENT_DATA_T dat1, EVENT_DATA_T dat2 );