Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -r00f98c3a603917bb25450e7686bc75a34c357e97 -ra57af2726f27208a2de96e9331678caf022d927d --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 00f98c3a603917bb25450e7686bc75a34c357e97) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision a57af2726f27208a2de96e9331678caf022d927d) @@ -47,7 +47,8 @@ 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 ddStandbyCommandSent; ///< Flag indicates DD Standby command has been sent. +static DISINFECT_SELECTION_T selectedDisinfectionSelection; ///< Selected disinfection option from UI. static BOOL disinfectionSelectionReceived; static volatile U32 postTreatmentStateBroadcastTimer; ///< Timer counter for pending power off request. @@ -72,6 +73,7 @@ patientDisconnectionConfirmed = FALSE; patientDisconnectHandled = FALSE; disposableRemovalConfirmed = FALSE; + ddStandbyCommandSent = FALSE; disinfectionSelectionReceived = FALSE; selectedDisinfectionSelection = DISINFECT_SEL_SKIP; postTreatmentStateBroadcastTimer = 0; @@ -244,15 +246,19 @@ retractSyringePump(); } doorClosedRequired( FALSE ); - // NOTE: patientDisconnectionConfirmed is NOT reset because - // Patient Disconnect State needs it to move to next state + + // Patient has been disconnected. DD no longer needs to remain + // in Generate Dialysate mode. + cmdSendDDCommand( DD_CMD_GOTO_POST_GENERATE ); + patientDisconnectHandled = TRUE; } if ( TRUE == patientDisconnectionConfirmed ) { patientDisconnectionConfirmed = FALSE; patientDisconnectHandled = FALSE; - state = TD_POST_TREATMENT_AUTO_EJECT_STATE; + + state = TD_POST_TREATMENT_AUTO_EJECT_STATE; } return state; @@ -285,19 +291,43 @@ /*********************************************************************//** * @brief * The handleDisposableRemovalState function executes the Post-Treatment - * mode Disposable Removal state machine. - * @details \b Inputs: disposableRemovalConfirmed - * @details \b Outputs: processed disposable removal confirmation - * @return next post-treatment mode state + * Disposable Removal state. + * @details \b Inputs: disposableRemovalConfirmed and DD operation mode. + * @details \b Outputs: Requests DD transition from Post-Generate to + * Standby and advances to Disinfection after DD reaches Standby. + * @return Next Post-Treatment mode state. *************************************************************************/ static TD_POST_TREATMENT_STATE_T handleDisposableRemovalState( void ) { TD_POST_TREATMENT_STATE_T state = TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE; + DD_CMD_RESPONSE_T ddCmdResp; if ( TRUE == disposableRemovalConfirmed ) { - disposableRemovalConfirmed = FALSE; - state = TD_POST_TREATMENT_DISINFECTION_STATE; + // Wait until DD has completed the transition to Post-Generate + // before requesting DD Standby. + if ( FALSE == ddStandbyCommandSent ) + { + if ( DD_MODE_POSG == getDDOpMode() ) + { + cmdSendDDCommand( DD_CMD_GOTO_STANDBY ); + ddStandbyCommandSent = TRUE; + } + } + else if ( TRUE == getDDCommandResponse( DD_CMD_GOTO_STANDBY, + &ddCmdResp ) ) + { + // Command was accepted. Wait for the DD operation-mode + // broadcast confirming DD has actually reached Standby. + if ( ( FALSE == ddCmdResp.rejected ) && + ( DD_MODE_STAN == getDDOpMode() ) ) + { + disposableRemovalConfirmed = FALSE; + ddStandbyCommandSent = FALSE; + + state = TD_POST_TREATMENT_DISINFECTION_STATE; + } + } } return state; @@ -346,9 +376,6 @@ // Save selected disinfection option in Standby. signalStandbyDisinfectionSelection( command ); - // Request DD transition to Standby. - cmdStopGenerateDialysate(); - // Transition TD to Standby. requestNewOperationMode( MODE_STAN ); } Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r00f98c3a603917bb25450e7686bc75a34c357e97 -ra57af2726f27208a2de96e9331678caf022d927d --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 00f98c3a603917bb25450e7686bc75a34c357e97) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision a57af2726f27208a2de96e9331678caf022d927d) @@ -374,7 +374,7 @@ heatDisinfectionStartConfirmed = FALSE; // Request DD to start Heat Disinfection. - cmdStartDDHeatDisinfect(); + cmdSendDDCommand( DD_CMD_START_DISINFECT_HEAT ); state = STANDBY_WAIT_FOR_DD_CLEANING_MODE_CMD_RESPONSE_STATE; } @@ -447,10 +447,12 @@ { 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() ) ) + // DD transitions back to Standby when Heat Disinfection is complete. + if ( DD_MODE_STAN == getDDOpMode() ) { + // Clear Heat Disinfection in-progress alarm. + // clearAlarm( ); + requestedDisinfectionCommand = DD_CMD_NONE; heatDisinfectionStartConfirmed = FALSE; @@ -477,14 +479,11 @@ // 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(); @@ -497,11 +496,9 @@ break; case STANDBY_WAIT_FOR_TREATMENT_STATE: - setValvePosition( H1_VALV, - VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( H19_VALV, - VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); // TODO: // H5 Ejector Off @@ -528,8 +525,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( - ALARM_ID_TD_SOFTWARE_FAULT, + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_STANDBY_INVALID_STATE, currentStandbyState ); break; @@ -711,7 +707,8 @@ // Respond to request to start treatment. response.accepted = result; response.rejectionReason = rejReason; - sendMessage( MSG_ID_TD_RESP_INITIATE_TREATMENT_WORKFLOW, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08*) &response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); + sendMessage( MSG_ID_TD_RESP_INITIATE_TREATMENT_WORKFLOW, COMM_BUFFER_OUT_CAN_TD_2_UI, + (U08*) &response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); return result; } @@ -829,8 +826,7 @@ } else { - response.rejectionReason = - REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; + response.rejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; } response.accepted = result; @@ -893,8 +889,7 @@ } else { - response.rejectionReason = - REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; + response.rejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; } response.accepted = result; Index: firmware/App/Services/DDInterface.c =================================================================== diff -u -r8492830da5862d7eeaea89d30efb5ea5dcc22572 -ra57af2726f27208a2de96e9331678caf022d927d --- firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision 8492830da5862d7eeaea89d30efb5ea5dcc22572) +++ firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision a57af2726f27208a2de96e9331678caf022d927d) @@ -506,6 +506,35 @@ /*********************************************************************//** * @brief + * The handleDDCommandResponseMsg function handles a DD command response + * message received by TD. + * @details \b Inputs: DD command response message. + * @details \b Outputs: DD command response recorded in DDInterface. + * @param message Pointer to the received DD command response message. + * @return TRUE if the response is valid, otherwise FALSE. + *************************************************************************/ +BOOL handleDDCommandResponseMsg( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( sizeof( DD_CMD_RESPONSE_T ) == message->hdr.payloadLen ) + { + DD_CMD_RESPONSE_T response; + + memcpy( &response, + &message->payload[ 0 ], + sizeof( DD_CMD_RESPONSE_T ) ); + + handleDDCommandResponse( &response ); + + result = TRUE; + } + + return result; +} + +/*********************************************************************//** + * @brief * The handleDDCommandResponse function processes the latest DD command response. * @details \b Alarm: ALARM_ID_TD_DD_COMMAND_INVALID_PARAMETER_FAULT if reported * response indicates DD rejected command due to invalid parameter. @@ -628,23 +657,29 @@ /*********************************************************************//** * @brief - * The cmdStartDDHeatDisinfect function sends a Heat Disinfection start - * request to the DD. - * @details \b Inputs: none - * @details \b Outputs: Heat Disinfection start request sent to DD. + * The cmdSendDDCommand function sends a command request to the DD. + * @details \b Inputs: command. + * @details \b Outputs: Previous response for the command cleared and + * command request sent to DD. + * @param command DD command requested by TD. * @return none *************************************************************************/ -void cmdStartDDHeatDisinfect( void ) +void cmdSendDDCommand( DD_COMMAND_T command ) { - DD_COMMAND_T command = DD_CMD_START_DISINFECT_HEAT; + U32 payload = (U32)command; - ddCmdResp[ DD_CMD_START_DISINFECT_HEAT ].commandID = DD_CMD_NONE; + if ( ( DD_CMD_NONE < command ) && ( command < NUM_OF_DD_COMMANDS ) ) + { + // Clear any previous response for this command. + ddCmdResp[ command ].commandID = DD_CMD_NONE; + ddCmdResp[ command ].rejected = TRUE; + ddCmdResp[ command ].rejectCode = DD_CMD_REQUEST_REJECT_REASON_NONE; #ifndef TEST_UI_ONLY - sendMessage( MSG_ID_TD_DD_HEAT_DISINFECT_REQUEST, - COMM_BUFFER_OUT_CAN_TD_2_DD, - (U08 *)&command, sizeof( U32 ) ); + sendMessage( MSG_ID_TD_DD_COMMAND_REQUEST, COMM_BUFFER_OUT_CAN_TD_2_DD, + (U08 *)&payload, sizeof( U32 ) ); #endif + } } Index: firmware/App/Services/DDInterface.h =================================================================== diff -u -r8492830da5862d7eeaea89d30efb5ea5dcc22572 -ra57af2726f27208a2de96e9331678caf022d927d --- firmware/App/Services/DDInterface.h (.../DDInterface.h) (revision 8492830da5862d7eeaea89d30efb5ea5dcc22572) +++ firmware/App/Services/DDInterface.h (.../DDInterface.h) (revision a57af2726f27208a2de96e9331678caf022d927d) @@ -64,10 +64,12 @@ void cmdBypassDialyzer( BOOL bypass ); void cmdStopGenerateDialysate( void ); void cmdSubstitutionRate (F32 qs ); -void cmdStartDDHeatDisinfect( void ); +void cmdSendDDCommand( DD_COMMAND_T command ); +// DD command response handling. void handleDDCommandResponse( DD_CMD_RESPONSE_T *ddCmdRespPtr ); BOOL getDDCommandResponse( U32 commandID, DD_CMD_RESPONSE_T *cmdRespPtr ); +BOOL handleDDCommandResponseMsg( MESSAGE_T *message ); /**@}*/ Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r00f98c3a603917bb25450e7686bc75a34c357e97 -ra57af2726f27208a2de96e9331678caf022d927d --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 00f98c3a603917bb25450e7686bc75a34c357e97) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision a57af2726f27208a2de96e9331678caf022d927d) @@ -116,6 +116,7 @@ { MSG_ID_FW_VERSIONS_REQUEST, &handleVersionRequestMessage }, { MSG_ID_UI_CHECK_IN, &handleUICheckIn }, { MSG_ID_DD_OP_MODE_DATA, &setDDOpMode }, + { MSG_ID_DD_COMMAND_RESPONSE, &handleDDCommandResponseMsg }, { MSG_ID_UI_VERSION_INFO_RESPONSE, &handleUIVersionResponse }, { MSG_ID_DD_GEN_DIALYSATE_MODE_DATA, &setDialysateData }, { MSG_ID_DD_PRESSURES_DATA, &setDialysatePressure },