Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -re5988dee900797f8e2b40b3e72d18f390d7b7402 -rf054fdd3579dacb03b5b41a363e259949ff63965 --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision e5988dee900797f8e2b40b3e72d18f390d7b7402) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision f054fdd3579dacb03b5b41a363e259949ff63965) @@ -18,6 +18,7 @@ #include "BloodFlow.h" #include "Buttons.h" #include "Ejector.h" +#include "Messaging.h" #include "ModePostTreat.h" #include "OperationModes.h" #include "PeristalticPump.h" @@ -39,20 +40,23 @@ // ********** private data ********** +static BOOL autoEjectReqReceived; /// Flag indicating that user confirmed to eject tubeset static BOOL autoEjectHomePosCleared; ///< Flag indicating BP rotor has left home position during ejection revolution static BOOL setEntryActuatorCmdIssued; ///< Flag indicates actuator command has been issued on current sub-state entry -static U32 autoEjectTimerCounter; ///< Timer counter shared across all auto-eject sub-states +static U32 autoEjectTimerCounter; ///< Timer counter shared across all auto-eject sub-states static TD_POST_TREATMENT_STATE_T currentPostTreatmentState; ///< Current Post-Treatment sub-state static POST_TX_AUTO_EJECT_STATE_T currentPostTxAutoEjectState; ///< Current Post-Treatment Auto Eject sub-state // ********** private function prototypes ********** +static void setPostTreatStateTransition( TD_POST_TREATMENT_STATE_T state ); static TD_POST_TREATMENT_STATE_T handlePatientDisconnectionState( void ); static TD_POST_TREATMENT_STATE_T handleAutoEjectState( void ); static TD_POST_TREATMENT_STATE_T handleDisposableRemovalState(void ); static TD_POST_TREATMENT_STATE_T handleVerifyState( void ); +static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectAwaitConfirmState( void ); static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectHomingState( void ); static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectExtendingEjectorState( void ); static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectEjectingState( void ); @@ -68,10 +72,12 @@ void initPostTreatmentMode( void ) { currentPostTreatmentState = TD_POST_TREATMENT_AUTO_EJECT_STATE; - currentPostTxAutoEjectState = POST_TX_AUTO_EJECT_STATE_HOMING; + currentPostTxAutoEjectState = POST_TX_AUTO_EJECT_STATE_AWAIT_CONFIRMATION; + autoEjectReqReceived = FALSE; autoEjectHomePosCleared = FALSE; setEntryActuatorCmdIssued = FALSE; autoEjectTimerCounter = 0; + setPostTreatStateTransition( currentPostTreatmentState ); } /*********************************************************************//** @@ -91,6 +97,32 @@ return (U32)currentPostTreatmentState; } +static void setPostTreatStateTransition( TD_POST_TREATMENT_STATE_T state ) +{ + switch( state ) + { + case TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE: + //TODO: actuator configuration; + break; + + case TD_POST_TREATMENT_AUTO_EJECT_STATE: + signalBloodPumpHardStop(); + break; + + case TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE: + //TODO: actuator configuration; + break; + + case TD_POST_TREATMENT_VERIFY_STATE: + //TODO: actuator configuration; + 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 @@ -102,12 +134,8 @@ U32 execPostTreatmentMode( void ) { BOOL stop = isStopButtonPressed(); + TD_POST_TREATMENT_STATE_T prevPostTreatmentState = currentPostTreatmentState; - if ( TRUE == stop ) - { - activateAlarmNoData( ALARM_ID_TD_TREATMENT_STOPPED_BY_USER ); - } - // Execute mode state machine switch ( currentPostTreatmentState ) { @@ -132,6 +160,11 @@ break; } + if ( prevPostTreatmentState != currentPostTreatmentState) + { + setPostTreatStateTransition( currentPostTreatmentState ); + } + return (U32)currentPostTreatmentState; } @@ -151,6 +184,10 @@ switch ( currentPostTxAutoEjectState ) { + case POST_TX_AUTO_EJECT_STATE_AWAIT_CONFIRMATION: + currentPostTxAutoEjectState = handleAutoEjectAwaitConfirmState(); + break; + case POST_TX_AUTO_EJECT_STATE_HOMING: currentPostTxAutoEjectState = handleAutoEjectHomingState(); break; @@ -173,7 +210,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_POST_TREATMENT_INVALID_STATE, (U32)currentPostTxAutoEjectState ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_POST_TX_AUTO_EJECT_INVALID_STATE, (U32)currentPostTxAutoEjectState ); break; } @@ -189,6 +226,28 @@ /*********************************************************************//** * @brief + * The handleAutoEjectAwaitConfirmState function handles the Await confirm + * sub-state of the Post-Treatment Auto-Eject state machine. + * Waits for the user request to auto-eject + * @details Inputs: autoEjectConfirmRequest + * @details Outputs: autoEjectConfirmRequest + * @return next Auto-Eject sub-state + *************************************************************************/ +static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectAwaitConfirmState( void ) +{ + POST_TX_AUTO_EJECT_STATE_T subState = POST_TX_AUTO_EJECT_STATE_AWAIT_CONFIRMATION; + + if ( TRUE == autoEjectReqReceived) + { + autoEjectReqReceived = FALSE; + subState = POST_TX_AUTO_EJECT_STATE_HOMING; + } + + return subState; +} + +/*********************************************************************//** + * @brief * The handleAutoEjectHomingState function handles the Homing sub-state * of the Post-Treatment Auto-Eject state machine. * Homes both the blood pump (H4) and ejector (H5) @@ -338,10 +397,56 @@ } else if ( EJECTOR_STATE_RETRACTED == getEjectorState() ) { + // Send auto-eject completion message + UI_RESPONSE_PAYLOAD_T response; + response.accepted = TRUE; + response.rejectionReason = REQUEST_REJECT_REASON_NONE; + sendMessage( MSG_ID_TD_ADJUST_DISPOSABLES_REMOVAL_CONFIRM_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08*)(&response), sizeof( UI_RESPONSE_PAYLOAD_T ) ); + subState = NUM_OF_POST_TX_AUTO_EJECT_SUB_STATES; } return subState; } +/*********************************************************************//** + * @brief + * The handleAutoEjectRequest function handles a UI request to remove the + * disposable tubeset. + * @details Inputs: none + * @details Outputs: autoEjectConfirmRequest + * @param message UI message which includes the user confirmation to + * eject the tubeset + * @return TRUE if confirmation/rejection accepted, FALSE if not + *************************************************************************/ +BOOL handleAutoEjectRequest( MESSAGE_T *message ) +{ + BOOL confirmed = FALSE; + BOOL result = FALSE; + TD_OP_MODE_T mode = getCurrentOperationMode(); + UI_RESPONSE_PAYLOAD_T response; + + response.accepted = FALSE; + response.rejectionReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + + if ( sizeof( BOOL ) == message->hdr.payloadLen ) + { + memcpy( &confirmed, message->payload, sizeof( BOOL ) ); + BOOL notInValidState = ( ( TD_POST_TREATMENT_AUTO_EJECT_STATE != currentPostTreatmentState ) || + ( POST_TX_AUTO_EJECT_STATE_AWAIT_CONFIRMATION != currentPostTxAutoEjectState ) ); + + if ( ( mode != MODE_POST ) || ( TRUE == notInValidState ) ) + { + sendMessage( MSG_ID_TD_ADJUST_DISPOSABLES_REMOVAL_CONFIRM_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08*)(&response), sizeof( UI_RESPONSE_PAYLOAD_T ) ); + } + else if ( TRUE == confirmed ) + { + autoEjectReqReceived = TRUE; + result = TRUE; + } + } + + return result; +} + /**@}*/