Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -rc048e88d130c4c30f9538330e8fcf23fcc581806 -r00f98c3a603917bb25450e7686bc75a34c357e97 --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision c048e88d130c4c30f9538330e8fcf23fcc581806) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 00f98c3a603917bb25450e7686bc75a34c357e97) @@ -39,19 +39,18 @@ * @{ */ -#define POST_TREAT_STATE_BROADCAST_COUNT (MS_PER_SECOND / TASK_PRIORITY_INTERVAL) +#define POST_TREAT_STATE_DATA_PUB_INTERVAL (MS_PER_SECOND / TASK_PRIORITY_INTERVAL) // ********** private definitions ********** +static TD_POST_TREATMENT_STATE_T currentPostTreatmentState; ///< Current Post-Treatment sub-state 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 DISINFECT_SELECTION_T selectedDisinfectionSelection; ///< Selected disinfection option from UI.static BOOL disinfectionSelectionReceived; 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 - // ********** private function prototypes ********** static void setPostTreatStateTransition( void ); @@ -69,13 +68,13 @@ **************************************************************************/ void initPostTreatmentMode( void ) { - currentPostTreatmentState = TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE; - patientDisconnectionConfirmed = FALSE; - patientDisconnectHandled = FALSE; - disposableRemovalConfirmed = FALSE; - disinfectionSelectionReceived = FALSE; - selectedDisinfectionSelection = DISINFECT_SEL_SKIP; - postTreatmentStateBroadcastTimer = 0; + currentPostTreatmentState = TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE; + patientDisconnectionConfirmed = FALSE; + patientDisconnectHandled = FALSE; + disposableRemovalConfirmed = FALSE; + disinfectionSelectionReceived = FALSE; + selectedDisinfectionSelection = DISINFECT_SEL_SKIP; + postTreatmentStateBroadcastTimer = 0; } /*********************************************************************//** @@ -98,71 +97,6 @@ } /*********************************************************************//** -* @brief -* The setPostTreatStateTransition function sets the actuators and variables -* for the state transition in Post-Treatment mode. -* @details \b Inputs: Valve states, Pump speed -* @details \b Outputs: Actuate valves, pumps as desired -* @Param state Post-Treatment state enum -* @return none -**************************************************************************/ -static void setPostTreatStateTransition( void ) -{ - // Disable air trap level control. - resetAirTrap(); - // H12 Air Pump - Off. - setAirPumpState( AIR_PUMP_STATE_OFF, - AIR_PUMP_MOTOR_OFF ); - // H13 Air Trap Valve In - Closed. - set3WayValveState( H13_VALV, - VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - // H20 Air Trap Valve Out - Closed. - set3WayValveState( H20_VALV, - VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - //H10 Heparin/Syringe Pump - Off. - stopSyringePump(); - signalBloodPumpHardStop(); - - switch ( currentPostTreatmentState ) - { - case TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE: - setValvePosition( H1_VALV, - VALVE_POSITION_C_CLOSE ); - setValvePosition( H19_VALV, - VALVE_POSITION_C_CLOSE ); - break; - - case TD_POST_TREATMENT_AUTO_EJECT_STATE: - setValvePosition( H1_VALV, - VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( H19_VALV, - VALVE_POSITION_A_INSERT_EJECT ); - break; - - case TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE: - setValvePosition( H1_VALV, - VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( H19_VALV, - VALVE_POSITION_A_INSERT_EJECT ); - break; - - case TD_POST_TREATMENT_DISINFECTION_STATE: - setValvePosition( H1_VALV, - VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( H19_VALV, - VALVE_POSITION_A_INSERT_EJECT ); - break; - - default: - SET_ALARM_WITH_2_U32_DATA( - ALARM_ID_TD_SOFTWARE_FAULT, - SW_FAULT_ID_MODE_POST_TREATMENT_INVALID_STATE1, - currentPostTreatmentState ); - break; - } -} - -/*********************************************************************//** * @brief * The execPostTreatmentMode function executes the Post-Treatment * mode state machine. @@ -173,14 +107,14 @@ U32 execPostTreatmentMode( void ) { BOOL stop = isStopButtonPressed(); + TD_POST_TREATMENT_STATE_T prevPostTreatmentState = currentPostTreatmentState; + POST_TREATMENT_STATES_DATA_PAYLOAD_T payload = { 0 }; if ( TRUE == stop ) { // Ignore stop button in this mode. } - TD_POST_TREATMENT_STATE_T prevPostTreatmentState = currentPostTreatmentState; - // Execute mode state machine switch ( currentPostTreatmentState ) { @@ -203,16 +137,20 @@ default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_POST_TREATMENT_INVALID_STATE, - currentPostTreatmentState ); + (U32)currentPostTreatmentState ); break; } postTreatmentStateBroadcastTimer++; - if (postTreatmentStateBroadcastTimer >= POST_TREAT_STATE_BROADCAST_COUNT) + if (postTreatmentStateBroadcastTimer >= POST_TREAT_STATE_DATA_PUB_INTERVAL) { postTreatmentStateBroadcastTimer = 0U; - //TODO: need to broadcast currentstate on which msgid + payload.mSubMode = (U32)currentPostTreatmentState; + broadcastData( MSG_ID_TD_POST_TREATMENT_STATES_DATA, + COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08 *)&payload, + sizeof( POST_TREATMENT_STATES_DATA_PAYLOAD_T ) ); } + if ( prevPostTreatmentState != currentPostTreatmentState) { setPostTreatStateTransition(); @@ -222,6 +160,63 @@ } /*********************************************************************//** +* @brief +* The setPostTreatStateTransition function sets the actuators and variables +* for the state transition in Post-Treatment mode. +* @details \b Inputs: Valve states, Pump speed +* @details \b Outputs: Actuate valves, pumps as desired +* @Param state Post-Treatment state enum +* @return none +**************************************************************************/ +static void setPostTreatStateTransition( void ) +{ + signalBloodPumpHardStop(); + // Disable air trap level control. + resetAirTrap(); + // H12 Air Pump - Off. + setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); + // H13 Air Trap Valve In - Closed. + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + // H20 Air Trap Valve Out - Closed. + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + //H10 Heparin/Syringe Pump - Off. + stopSyringePump(); + // TODO: Set H5 ejector Off. + // Dialyzer - Bypassed. + // Qdt - 0. + // Quf - 0. + // Qs - 0. + switch ( currentPostTreatmentState ) + { + case TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE: + setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); + setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); + break; + + case TD_POST_TREATMENT_AUTO_EJECT_STATE: + setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); + break; + + case TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE: + setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); + break; + + case TD_POST_TREATMENT_DISINFECTION_STATE: + setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, + SW_FAULT_ID_MODE_POST_TREATMENT_INVALID_STATE1, + currentPostTreatmentState ); + break; + } +} + +/*********************************************************************//** * @brief * The handlePatientDisconnectionState function executes the Post-Treatment * mode Patient Disconnection state machine. @@ -320,7 +315,7 @@ { TD_POST_TREATMENT_STATE_T state = TD_POST_TREATMENT_DISINFECTION_STATE; - static DD_COMMAND_T command = DD_CMD_NONE; + DD_COMMAND_T command = DD_CMD_NONE; if ( TRUE == disinfectionSelectionReceived ) { @@ -345,16 +340,19 @@ command = DD_CMD_NONE; break; } -// command = selectedDisinfectionSelection + DD_CMD_START_DISINFECT_SKIP; - // Save selected disinfection option in Standby. - signalStandbyDisinfectionSelection( command ); - // Request DD transition to Standby. - cmdStopGenerateDialysate(); + if ( DD_CMD_NONE != command ) + { + // Save selected disinfection option in Standby. + signalStandbyDisinfectionSelection( command ); - // Transition TD to Standby. - requestNewOperationMode( MODE_STAN ); + // Request DD transition to Standby. + cmdStopGenerateDialysate(); + // Transition TD to Standby. + requestNewOperationMode( MODE_STAN ); + } + disinfectionSelectionReceived = FALSE; } @@ -363,42 +361,109 @@ /*********************************************************************//** * @brief - * The signalUserConfirmPatientDisconnection signals post-treatment mode - * user has confirmed patient disconnection. - * @details \b Inputs: none - * @details \b Outputs: patientDisconnectedConfirm - * @return none + * The signalUserConfirmDisinfection function signals Post-Treatment mode + * that the user has selected a disinfection option. + * @details \b Inputs: current operation mode, current Post-Treatment state, + * and selected disinfection option. + * @details \b Outputs: disinfectionSelectionReceived, + * selectedDisinfectionSelection. + * @param options Disinfection option selected by the user. + * @return TRUE if the selection is accepted, otherwise FALSE. *************************************************************************/ -void signalUserConfirmPatientDisconnection( void ) +BOOL signalUserConfirmDisinfection( DISINFECT_SELECTION_T options ) { - patientDisconnectionConfirmed = TRUE; + BOOL result = FALSE; + + if ( ( TD_POST_TREATMENT_DISINFECTION_STATE == currentPostTreatmentState ) && + ( (U32)options < (U32)NUM_OF_DISINFECT_SELECTIONS ) ) + { + selectedDisinfectionSelection = options; + disinfectionSelectionReceived = TRUE; + result = TRUE; + } + + return result; } /*********************************************************************//** * @brief - * The signalUserConfirmDisposableRemoval signals post-treatment mode - * user has confirmed disposable removal. - * @details \b Inputs: none - * @details \b Outputs: disposableRemovalConfirmed - * @return none + * The handlePatientDisconnectionConfirmCmd function handles user + * confirmation of patient disconnection. + * @details \b Inputs: Patient disconnection confirmation message. + * @details \b Outputs: Acceptance response and patient disconnection signal. + * @param message Pointer to the message to handle. + * @return TRUE if the confirmation is accepted, FALSE otherwise. *************************************************************************/ -void signalUserConfirmDisposableRemoval( void ) +BOOL handlePatientDisconnectionConfirmCmd( MESSAGE_T *message ) { - disposableRemovalConfirmed = TRUE; + TD_OP_MODE_T mode = getCurrentOperationMode(); + TD_POST_TREATMENT_STATE_T postTxState = currentPostTreatmentState; + U32 payloadLen = message->hdr.payloadLen; + BOOL accepted = FALSE; + UI_RESPONSE_PAYLOAD_T response; + + response.accepted = FALSE; + response.rejectionReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + + if ( ( 0U == payloadLen ) && ( MODE_POST == mode ) && + ( TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE == postTxState ) ) + { + patientDisconnectionConfirmed = TRUE; + + accepted = TRUE; + response.accepted = TRUE; + response.rejectionReason = REQUEST_REJECT_REASON_NONE; + } + else if ( 0U != payloadLen ) + { + response.rejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; + } + + sendMessage( MSG_ID_TD_PATIENT_DISCONNECT_CONFIRM_RESPONSE, + COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, + sizeof( UI_RESPONSE_PAYLOAD_T ) ); + + return accepted; } /*********************************************************************//** * @brief - * The signalUserConfirmDisinfection signals Post-Treatment mode that - * the user has confirmed the disinfection selection. - * @details \b Inputs: none - * @details \b Outputs: selectedDisinfectionCommand - * @return none + * The handleDisposableRemovalConfirmCmd function handles user confirmation + * of disposable removal. + * @details \b Inputs: Disposable removal confirmation message. + * @details \b Outputs: Acceptance response and disposable removal signal. + * @param message Pointer to the message to handle. + * @return TRUE if the confirmation is accepted, FALSE otherwise. *************************************************************************/ -void signalUserConfirmDisinfection( DISINFECT_SELECTION_T options ) +BOOL handleDisposableRemovalConfirmCmd( MESSAGE_T *message ) { - disinfectionSelectionReceived = TRUE; - selectedDisinfectionSelection = options; + TD_OP_MODE_T mode = getCurrentOperationMode(); + U32 payloadLen = message->hdr.payloadLen; + BOOL accepted = FALSE; + UI_RESPONSE_PAYLOAD_T response; + + response.accepted = FALSE; + response.rejectionReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + + if ( ( 0U == payloadLen ) && ( MODE_POST == mode ) && + ( TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE == currentPostTreatmentState ) ) + { + disposableRemovalConfirmed = TRUE; + + accepted = TRUE; + response.accepted = TRUE; + response.rejectionReason = REQUEST_REJECT_REASON_NONE; + } + else if ( 0U != payloadLen ) + { + response.rejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; + } + + sendMessage( MSG_ID_TD_POST_TREATMENT_DISPOSABLE_REMOVAL_CONFIRM_RESPONSE, + COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, + sizeof( UI_RESPONSE_PAYLOAD_T ) ); + + return accepted; } Index: firmware/App/Modes/ModePostTreat.h =================================================================== diff -u -rc048e88d130c4c30f9538330e8fcf23fcc581806 -r00f98c3a603917bb25450e7686bc75a34c357e97 --- firmware/App/Modes/ModePostTreat.h (.../ModePostTreat.h) (revision c048e88d130c4c30f9538330e8fcf23fcc581806) +++ firmware/App/Modes/ModePostTreat.h (.../ModePostTreat.h) (revision 00f98c3a603917bb25450e7686bc75a34c357e97) @@ -36,11 +36,11 @@ U32 transitionToPostTreatmentMode( void ); // Prepares for transition to post-treatment mode U32 execPostTreatmentMode( void ); // Execute the post-treatment mode state machine (call from OperationModes) -TD_POST_TREATMENT_STATE_T getPostTreatmentState( void ); +//TD_POST_TREATMENT_STATE_T getPostTreatmentState( void ); -void signalUserConfirmPatientDisconnection( void ); -void signalUserConfirmDisposableRemoval( void ); -void signalUserConfirmDisinfection( DISINFECT_SELECTION_T options ); +BOOL signalUserConfirmDisinfection( DISINFECT_SELECTION_T options ); +BOOL handlePatientDisconnectionConfirmCmd( MESSAGE_T *message ); +BOOL handleDisposableRemovalConfirmCmd( MESSAGE_T *message ); /**@}*/ Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r8492830da5862d7eeaea89d30efb5ea5dcc22572 -r00f98c3a603917bb25450e7686bc75a34c357e97 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 8492830da5862d7eeaea89d30efb5ea5dcc22572) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 00f98c3a603917bb25450e7686bc75a34c357e97) @@ -48,18 +48,6 @@ #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. @@ -68,7 +56,6 @@ 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_COMMAND_T requestedDisinfectionCommand = DD_CMD_NONE; // ********** private function prototypes ********** @@ -77,6 +64,9 @@ static TD_STANDBY_STATE_T handleStandbyModeWaitForTreatmentState( void ); static void setRequestedCleaningMode( DISINFECT_SELECTION_T opMode ); static TD_STANDBY_STATE_T handleStandbyModeWaitForDisinfectState( void ); +static TD_STANDBY_STATE_T handleStandbyModeWaitForDDCleaningModeCmdResponseState( void ); +static TD_STANDBY_STATE_T handleStandbyModeWaitForDDCleaningModeStartState( void ); +static TD_STANDBY_STATE_T handleStandbyModeDDCleaningModeInProgressState( void ); static void setStandbyStateTransition( void ); /*********************************************************************//** @@ -184,23 +174,16 @@ 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: - if ( DD_MODE_HEAT == getDDOpMode() ) - { - currentStandbyState = STANDBY_CLEANING_MODE_IN_PROGRESS_STATE; - } + currentStandbyState = handleStandbyModeWaitForDDCleaningModeStartState(); break; case STANDBY_CLEANING_MODE_IN_PROGRESS_STATE: - if ( ( DD_MODE_HEAT == getDDOpMode() ) && - ( DD_HEAT_DISINFECT_STATE_COMPLETE == getDDSubMode() ) ) - { - requestedDisinfectionCommand = DD_CMD_NONE; - heatDisinfectionStartConfirmed = FALSE; - - currentStandbyState = - STANDBY_WAIT_FOR_TREATMENT_STATE; - } + currentStandbyState = handleStandbyModeDDCleaningModeInProgressState(); break; default: @@ -256,25 +239,30 @@ setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); homingInitiated = FALSE; state = STANDBY_WAIT_FOR_TREATMENT_STATE; - } - switch ( requestedDisinfectionCommand ) - { - case DD_CMD_START_DISINFECT_SKIP: - state = STANDBY_WAIT_FOR_TREATMENT_STATE; - requestedDisinfectionCommand = DD_CMD_NONE; - break; + // Determine the next Standby state from the Post-Treatment + // disinfection selection. + switch ( requestedDisinfectionCommand ) + { + case DD_CMD_NONE: + state = STANDBY_WAIT_FOR_TREATMENT_STATE; + break; - case DD_CMD_START_DISINFECT_HEAT: - state = STANDBY_WAIT_FOR_DISINFECT_STATE; - requestedDisinfectionCommand = DD_CMD_NONE; - break; + case DD_CMD_START_DISINFECT_SKIP: + state = STANDBY_WAIT_FOR_TREATMENT_STATE; + requestedDisinfectionCommand = DD_CMD_NONE; + break; - default: - state = STANDBY_WAIT_FOR_TREATMENT_STATE; - requestedDisinfectionCommand = DD_CMD_NONE; - break; - } + case DD_CMD_START_DISINFECT_HEAT: + state = STANDBY_WAIT_FOR_DISINFECT_STATE; + break; + default: + state = STANDBY_WAIT_FOR_TREATMENT_STATE; + requestedDisinfectionCommand = DD_CMD_NONE; + break; + } + } + return state; } @@ -369,12 +357,12 @@ /*********************************************************************//** * @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 + * The handleStandbyModeWaitForDisinfectState function handles the + * Standby Wait For Disinfect state. + * @details \b Inputs: requestedDisinfectionCommand, + * heatDisinfectionStartConfirmed. + * @details \b Outputs: heatDisinfectionStartConfirmed. + * @return Next Standby mode state. *************************************************************************/ static TD_STANDBY_STATE_T handleStandbyModeWaitForDisinfectState( void ) { @@ -385,16 +373,95 @@ { heatDisinfectionStartConfirmed = FALSE; + // Request DD to start Heat Disinfection. cmdStartDDHeatDisinfect(); - state = STANDBY_WAIT_FOR_DD_CLEANING_MODE_TO_START_STATE; + state = STANDBY_WAIT_FOR_DD_CLEANING_MODE_CMD_RESPONSE_STATE; } return state; } /*********************************************************************//** * @brief + * The handleStandbyModeWaitForDDCleaningModeCmdResponseState function + * waits for the DD response to the Heat Disinfection start request. + * @details \b Inputs: DD Heat Disinfection command response. + * @details \b Outputs: Standby state transition. + * @return Next Standby mode state. + *************************************************************************/ +static TD_STANDBY_STATE_T handleStandbyModeWaitForDDCleaningModeCmdResponseState( void ) +{ + TD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DD_CLEANING_MODE_CMD_RESPONSE_STATE; + DD_CMD_RESPONSE_T ddCmdResp; + + if ( TRUE == getDDCommandResponse( DD_CMD_START_DISINFECT_HEAT, &ddCmdResp ) ) + { + if ( FALSE == ddCmdResp.rejected ) + { + state = STANDBY_WAIT_FOR_DD_CLEANING_MODE_TO_START_STATE; + } + else + { + // DD rejected the Heat Disinfection start request. + // Return to the setup confirmation state so the request + // may be retried. + state = STANDBY_WAIT_FOR_DISINFECT_STATE; + } + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleStandbyModeWaitForDDCleaningModeStartState function handles + * the standby mode wait for DD cleaning mode to start state. + * @details \b Inputs: DD operation mode + * @details \b 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; + + // Wait until DD reports that Heat Disinfection has started. + if ( DD_MODE_HEAT == getDDOpMode() ) + { + state = STANDBY_CLEANING_MODE_IN_PROGRESS_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleStandbyModeDDCleaningModeInProgressState function handles + * Heat Disinfection while DD cleaning is in progress. + * @details \b Inputs: DD operation mode and DD sub-mode. + * @details \b Outputs: requestedDisinfectionCommand, + * heatDisinfectionStartConfirmed. + * @return Next Standby mode state. + *************************************************************************/ +static TD_STANDBY_STATE_T handleStandbyModeDDCleaningModeInProgressState( void ) +{ + TD_STANDBY_STATE_T state = STANDBY_CLEANING_MODE_IN_PROGRESS_STATE; + + // Wait until DD reports Heat Disinfection complete. + if ( ( DD_MODE_HEAT == getDDOpMode() ) && + ( DD_HEAT_DISINFECT_STATE_COMPLETE == getDDSubMode() ) ) + { + requestedDisinfectionCommand = DD_CMD_NONE; + heatDisinfectionStartConfirmed = FALSE; + + state = STANDBY_WAIT_FOR_TREATMENT_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The setStandbyStateTransition function sets the actuators and variables * for Standby state transitions. * @details \b Inputs: newState @@ -404,20 +471,24 @@ *************************************************************************/ static void setStandbyStateTransition( void ) { - // Common Standby actuator settings. - resetAirTrap(); + if ( ( currentStandbyState == STANDBY_START_STATE ) || + ( currentStandbyState == STANDBY_WAIT_FOR_TREATMENT_STATE ) ) + { + // Common Standby actuator settings. + resetAirTrap(); - setAirPumpState( AIR_PUMP_STATE_OFF, - AIR_PUMP_MOTOR_OFF ); + setAirPumpState( AIR_PUMP_STATE_OFF, + AIR_PUMP_MOTOR_OFF ); - set3WayValveState( H13_VALV, - VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H13_VALV, + VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - set3WayValveState( H20_VALV, - VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, + VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - stopSyringePump(); - signalBloodPumpHardStop(); + stopSyringePump(); + signalBloodPumpHardStop(); + } switch ( currentStandbyState ) { @@ -440,6 +511,22 @@ // Qs 0 break; + case STANDBY_WAIT_FOR_DISINFECT_STATE: + // No additional actuator changes required. + break; + + case STANDBY_WAIT_FOR_DD_CLEANING_MODE_CMD_RESPONSE_STATE: + // No additional actuator changes required. + break; + + case STANDBY_WAIT_FOR_DD_CLEANING_MODE_TO_START_STATE: + // No additional actuator changes required. + break; + + case STANDBY_CLEANING_MODE_IN_PROGRESS_STATE: + // No additional actuator changes required. + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, @@ -473,36 +560,6 @@ /*********************************************************************//** * @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( DISINFECT_SELECTION_T opMode ) -{ - switch ( opMode ) - { - case DD_CMD_START_DISINFECT_SKIP: - break; - - 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.alarmID = ALARM_ID_TD_DISINFECT_HEAT; -// currentDDCleaningMode.stopRequestCmdID = GENERIC_CONFIRM_ID_DISINFECT_STOP_HEAT; - break; - - } -} - -/*********************************************************************//** - * @brief * The getFluidType function returns the current fluid type assigned * based on the user's treatment selection. * @details \b Inputs: none @@ -729,18 +786,10 @@ result = TRUE; } } - else if ( ( STANDBY_WAIT_FOR_DISINFECT_STATE == currentStandbyState ) && - ( DD_CMD_START_DISINFECT_HEAT == options ) ) - { - // User confirmed Heat Disinfection setup screen. - heatDisinfectionStartConfirmed = TRUE; - result = TRUE; - } } else if ( MODE_POST == getCurrentOperationMode() ) { - signalUserConfirmDisinfection( options ); - result = TRUE; + result = signalUserConfirmDisinfection( options ); } return result; @@ -765,7 +814,18 @@ if ( sizeof( U32 ) == message->hdr.payloadLen ) { - heatDisinfectionStartConfirmed = TRUE; + if ( ( STANDBY_WAIT_FOR_DISINFECT_STATE == currentStandbyState ) && + ( DD_CMD_START_DISINFECT_HEAT == requestedDisinfectionCommand ) ) + { + // User confirmed Heat Disinfection setup screen. + heatDisinfectionStartConfirmed = TRUE; + result = TRUE; + } + else + { + result = FALSE; + response.rejectionReason = REQUEST_REJECT_REASON_CONFIRMATION_NOT_EXPECTED; + } } else { @@ -807,7 +867,6 @@ BOOL handleUIDisinfectRequest( MESSAGE_T *message ) { BOOL result = FALSE; - TD_OP_MODE_T mode = getCurrentOperationMode(); UI_RESPONSE_PAYLOAD_T response; DISINFECT_SELECTION_T options = DISINFECT_SEL_SKIP; @@ -818,13 +877,18 @@ if ( TRUE == isDDCommunicating() ) { result = signalUserInitiateDisinfectionSelection( options ); - response.rejectionReason = - REQUEST_REJECT_REASON_NONE; + if ( result ) + { + response.rejectionReason = REQUEST_REJECT_REASON_NONE; + } + else + { + response.rejectionReason = REQUEST_REJECT_REASON_INVALID_COMMAND; + } } else { - response.rejectionReason = - REQUEST_REJECT_REASON_DD_COMM_LOST; + response.rejectionReason = REQUEST_REJECT_REASON_DD_COMM_LOST; } } else Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r8492830da5862d7eeaea89d30efb5ea5dcc22572 -r00f98c3a603917bb25450e7686bc75a34c357e97 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 8492830da5862d7eeaea89d30efb5ea5dcc22572) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 00f98c3a603917bb25450e7686bc75a34c357e97) @@ -565,51 +565,6 @@ } /*********************************************************************//** - * @brief - * The handlePatientDisconnectionConfirmCmd function handles user - * confirmation of patient disconnection. - * @details \b Inputs: Patient disconnection confirmation message. - * @details \b Outputs: Acceptance response and patient disconnection signal. - * @param message Pointer to the message to handle. - * @return TRUE if the confirmation is accepted, FALSE otherwise. - *************************************************************************/ -BOOL handlePatientDisconnectionConfirmCmd( MESSAGE_T *message ) -{ - BOOL result = FALSE; - BOOL modeValid = FALSE; - TD_OP_MODE_T mode = getCurrentOperationMode(); - UI_RESPONSE_PAYLOAD_T response; - - response.rejectionReason = REQUEST_REJECT_REASON_NONE; - - if ( 0 == message->hdr.payloadLen ) - { - modeValid = ( MODE_POST == mode ) ? TRUE : FALSE; - - if ( ( TRUE != modeValid ) ) - { - response.rejectionReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; - } - else - { - signalUserConfirmPatientDisconnection(); - result = TRUE; - } - } - else - { - response.rejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; - } - - response.accepted = result; - sendMessage( MSG_ID_TD_PATIENT_DISCONNECT_CONFIRM_RESPONSE, - COMM_BUFFER_OUT_CAN_TD_2_UI, (U08*)(&response), - sizeof( UI_RESPONSE_PAYLOAD_T ) ); - - return result; -} - -/*********************************************************************//** * The sendPOSTFinalResult function sends the overall TD POST result * and queues the message for transmit on the appropriate CAN channel. * @details \b Message \b Sent: MSG_ID_TD_POST_FINAL_TEST_RESULT @@ -626,55 +581,6 @@ /*********************************************************************//** * @brief - * The handleDisposableRemovalConfirmCmd function handles user confirmation - * of disposable removal. - * @details \b Inputs: Disposable removal confirmation message. - * @details \b Outputs: Acceptance response and disposable removal signal. - * @param message Pointer to the message to handle. - * @return TRUE if the confirmation is accepted, FALSE otherwise. - *************************************************************************/ -BOOL handleDisposableRemovalConfirmCmd( MESSAGE_T *message ) -{ - BOOL result = FALSE; - BOOL modeValid = FALSE; - TD_OP_MODE_T mode = getCurrentOperationMode(); - UI_RESPONSE_PAYLOAD_T response; - - response.rejectionReason = REQUEST_REJECT_REASON_NONE; - - if ( 0 == message->hdr.payloadLen ) - { - modeValid = ( MODE_POST == mode ) ? TRUE : FALSE; - - if ( FALSE == modeValid ) - { - response.rejectionReason = - REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; - } - else - { - signalUserConfirmDisposableRemoval(); - result = TRUE; - } - } - else - { - response.rejectionReason = - REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; - } - - response.accepted = result; - - sendMessage( MSG_ID_TD_POST_TREATMENT_DISPOSABLE_REMOVAL_CONFIRM_RESPONSE, - COMM_BUFFER_OUT_CAN_TD_2_UI, - (U08 *)&response, - sizeof( UI_RESPONSE_PAYLOAD_T ) ); - - return result; -} - -/*********************************************************************//** - * @brief * The handleUIConfirmationResponse function handles a UI response for a * confirmation request. * @details \b Inputs: none Index: firmware/App/Services/Messaging.h =================================================================== diff -u -r8492830da5862d7eeaea89d30efb5ea5dcc22572 -r00f98c3a603917bb25450e7686bc75a34c357e97 --- firmware/App/Services/Messaging.h (.../Messaging.h) (revision 8492830da5862d7eeaea89d30efb5ea5dcc22572) +++ firmware/App/Services/Messaging.h (.../Messaging.h) (revision 00f98c3a603917bb25450e7686bc75a34c357e97) @@ -83,6 +83,12 @@ U32 mPatientConnectionState; ///< Current Patient Connection state. } PRE_TREATMENT_STATES_DATA_PAYLOAD_T; +/// Payload record structure for Post-Treatment states broadcast. +typedef struct +{ + U32 mSubMode; ///< Current Post-Treatment state. +} POST_TREATMENT_STATES_DATA_PAYLOAD_T; + /// Institutional record structure containing treatment parameter range limits. typedef struct { @@ -144,8 +150,6 @@ BOOL handleTesterLogInRequest( MESSAGE_T *message ); BOOL handleUpdateAvailable( MESSAGE_T *message ); BOOL handleUIVersionResponse( MESSAGE_T *message ); -BOOL handlePatientDisconnectionConfirmCmd( MESSAGE_T *message ); -BOOL handleDisposableRemovalConfirmCmd( MESSAGE_T *message ); BOOL handleUIConfirmation( MESSAGE_T *message ); // Test send message helper functions