Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -rf054fdd3579dacb03b5b41a363e259949ff63965 -r981882ba5ad72f45d836aae606dadd273a888058 --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision f054fdd3579dacb03b5b41a363e259949ff63965) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 981882ba5ad72f45d836aae606dadd273a888058) @@ -40,13 +40,11 @@ // ********** 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 BOOL autoEjectReqReceived; ///< Flag indicating that user confirmed to eject tubeset 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 +static POST_TX_AUTO_EJECT_STATE_T currentPostTxAutoEjectState; ///< Current Post-Treatment Auto Eject sub-state // ********** private function prototypes ********** @@ -74,8 +72,6 @@ currentPostTreatmentState = TD_POST_TREATMENT_AUTO_EJECT_STATE; currentPostTxAutoEjectState = POST_TX_AUTO_EJECT_STATE_AWAIT_CONFIRMATION; autoEjectReqReceived = FALSE; - autoEjectHomePosCleared = FALSE; - setEntryActuatorCmdIssued = FALSE; autoEjectTimerCounter = 0; setPostTreatStateTransition( currentPostTreatmentState ); } @@ -92,11 +88,19 @@ U32 transitionToPostTreatmentMode( void ) { initPostTreatmentMode(); - signalBloodPumpHardStop(); return (U32)currentPostTreatmentState; } +/*********************************************************************//** +* @brief +* The setPostTreatStateTransition function sets the actuators and variables +* for the state transition in Post-Treatment mode. +* @details Inputs: Valve states, Pump speed +* @details Outputs: Actuate valves, pumps as desired +* @Param state Post-Treatment state enum +* @return none +**************************************************************************/ static void setPostTreatStateTransition( TD_POST_TREATMENT_STATE_T state ) { switch( state ) @@ -170,17 +174,34 @@ /*********************************************************************//** * @brief + * The handlePatientDisconnectionState function executes the Post-Treatment + * mode Patient Disconnection state machine. + * @details Inputs: TODO fill up if any + * @details Outputs: TODO fill up if any + * @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; + + // TODO: Transition to Auto Eject state on completion when implemented + // state = TD_POST_TREATMENT_AUTO_EJECT_STATE; + + return state; +} + +/*********************************************************************//** + * @brief * The handleAutoEjectState function executes the Post-Treatment * mode Auto Eject state machine. * @details Inputs: currentPostTxAutoEjectState * @details Outputs: Advances the Post-Treatment Auto Eject sub-state * and next Post-Treatment top-level state when eject is complete. - * @return current post-treatment sub-state + * @return next post-treatment mode state *************************************************************************/ static TD_POST_TREATMENT_STATE_T handleAutoEjectState( void ) { TD_POST_TREATMENT_STATE_T state = TD_POST_TREATMENT_AUTO_EJECT_STATE; - POST_TX_AUTO_EJECT_STATE_T prevAutoEjectSubState = currentPostTxAutoEjectState; switch ( currentPostTxAutoEjectState ) { @@ -214,33 +235,64 @@ break; } - if ( prevAutoEjectSubState != currentPostTxAutoEjectState ) - { - autoEjectTimerCounter = 0; - setEntryActuatorCmdIssued = FALSE; - } + return state; +} + +/*********************************************************************//** + * @brief + * The handleDisposableRemovalState function executes the Post-Treatment + * mode Disposable Removal state machine. + * @details Inputs: TODO fill up if any + * @details Outputs: TODO fill up if any + * @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; + + // TODO: Transition to Verify state on completion when implemented + // state = TD_POST_TREATMENT_VERIFY_STATE; + return state; +} +/*********************************************************************//** + * @brief + * The handleVerifyState function executes the Post-Treatment + * mode Verify state machine. + * @details Inputs: TODO fill up if any + * @details Outputs: TODO fill up if any + * @return next post-treatment mode state + *************************************************************************/ +static TD_POST_TREATMENT_STATE_T handleVerifyState( void ) +{ + TD_POST_TREATMENT_STATE_T state = TD_POST_TREATMENT_VERIFY_STATE; + + // TODO + + return state; } /*********************************************************************//** * @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 + * @details Inputs: autoEjectReqReceived + * @details Outputs: autoEjectReqReceived * @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) + if ( TRUE == autoEjectReqReceived ) { - autoEjectReqReceived = FALSE; - subState = POST_TX_AUTO_EJECT_STATE_HOMING; + homeBloodPump(); + autoEjectTimerCounter = 0; + autoEjectReqReceived = FALSE; + subState = POST_TX_AUTO_EJECT_STATE_HOMING; } return subState; @@ -250,48 +302,25 @@ * @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) - * @details Inputs: setEntryActuatorCmdIssued, autoEjectTimerCounter - * @details Outputs: setEntryActuatorCmdIssued, autoEjectTimerCounter + * Homes the blood pump (H4) + * @details Inputs: autoEjectTimerCounter + * @details Outputs: autoEjectTimerCounter * @return next Auto-Eject sub-state *************************************************************************/ static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectHomingState( void ) { POST_TX_AUTO_EJECT_STATE_T subState = POST_TX_AUTO_EJECT_STATE_HOMING; - // Issue both homing commands once on state entry - if ( FALSE == setEntryActuatorCmdIssued ) - { - homeBloodPump(); - homeEjector(); - setEntryActuatorCmdIssued = TRUE; - } - if ( ++autoEjectTimerCounter >= AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL) { signalBloodPumpHardStop(); - - if ( TRUE == isPumpHomeInProgress() ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, (U32)isPeristalticPumpHome(), autoEjectTimerCounter ); - } - - if ( EJECTOR_STATE_RETRACTED != getEjectorState() ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_EJECT_EJECTOR_TIMEOUT, (U32)getEjectorState(), autoEjectTimerCounter ); - } - - requestNewOperationMode( MODE_FAUL); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, (U32)isPeristalticPumpHome(), autoEjectTimerCounter ); } - else + else if ( TRUE == isPeristalticPumpHome() ) { - BOOL bpHomed = ( FALSE == isPumpHomeInProgress() ); - BOOL ejectorHomed = ( EJECTOR_STATE_RETRACTED == getEjectorState() ); - - if ( ( TRUE == bpHomed ) && ( TRUE == ejectorHomed ) ) - { - subState = POST_TX_AUTO_EJECT_STATE_EXTENDING_EJECTOR; - } + extendEjector(); + autoEjectTimerCounter = 0; + subState = POST_TX_AUTO_EJECT_STATE_EXTENDING_EJECTOR; } return subState; @@ -302,28 +331,23 @@ * The handleAutoEjectExtendingEjectorState function handles the * Extending Ejector sub-state of the Post-Treatment Auto-Eject * state machine. Extends the ejector pin (H5) to engage the tubeset. - * @details Inputs: setEntryActuatorCmdIssued, autoEjectTimerCounter - * @details Outputs: setEntryActuatorCmdIssued, autoEjectTimerCounter + * @details Inputs: autoEjectTimerCounter + * @details Outputs: autoEjectTimerCounter * @return next Auto-Eject sub-state *************************************************************************/ static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectExtendingEjectorState( void ) { POST_TX_AUTO_EJECT_STATE_T subState = POST_TX_AUTO_EJECT_STATE_EXTENDING_EJECTOR; - if ( FALSE == setEntryActuatorCmdIssued ) - { - extendEjector(); - setEntryActuatorCmdIssued = TRUE; - } - if ( ++autoEjectTimerCounter >= AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL ) { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_EJECT_EJECTOR_TIMEOUT, (U32)getEjectorState(), autoEjectTimerCounter ); - requestNewOperationMode( MODE_FAUL); } else if ( EJECTOR_STATE_EXTENDED == getEjectorState() ) { - subState = POST_TX_AUTO_EJECT_STATE_EJECTING; + setBloodPumpTargetFlowRate( AUTO_EJECT_BLOOD_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + autoEjectTimerCounter = 0; + subState = POST_TX_AUTO_EJECT_STATE_EJECTING; } return subState; @@ -335,36 +359,25 @@ * of the Post-Treatment Auto-Eject state machine. Rotates the blood pump (H4) * forward at 100 mL/min with the ejector extended to push the tubeset * out of the rotor. - * @details Inputs: autoEjectHomePosCleared, autoEjectTimerCounter - * @details Outputs: autoEjectHomePosCleared, autoEjectTimerCounter + * @details Inputs: autoEjectTimerCounter + * @details Outputs: autoEjectTimerCounter * @return next Auto-Eject sub-state *************************************************************************/ static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectEjectingState( void ) { POST_TX_AUTO_EJECT_STATE_T subState = POST_TX_AUTO_EJECT_STATE_EJECTING; - setBloodPumpTargetFlowRate( AUTO_EJECT_BLOOD_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - if ( ++autoEjectTimerCounter >= AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL ) { signalBloodPumpHardStop(); - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, autoEjectHomePosCleared, isPeristalticPumpHome() ); - requestNewOperationMode( MODE_FAUL); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, isPeristalticPumpHome(), autoEjectTimerCounter ); } - else + else if ( TRUE == isPeristalticPumpHome() ) { - if ( FALSE == autoEjectHomePosCleared ) - { - if ( FALSE == isPeristalticPumpHome() ) - { - autoEjectHomePosCleared = TRUE; - } - } - else if ( TRUE == isPeristalticPumpHome() ) - { - signalBloodPumpHardStop(); - subState = POST_TX_AUTO_EJECT_STATE_RETRACTING_EJECTOR; - } + signalBloodPumpHardStop(); + retractEjector(); + autoEjectTimerCounter = 0; + subState = POST_TX_AUTO_EJECT_STATE_RETRACTING_EJECTOR; } return subState; @@ -373,37 +386,24 @@ /*********************************************************************//** * @brief * The handleAutoEjectRetractingEjectorState function handles the - * Retracting Ejector sub-state of the Post-Treatment Auto-Eject - * state machine. Retracts the ejector pin (H5) after the tubeset has been - * ejected. - * @details Inputs: setEntryActuatorCmdIssued, autoEjectTimerCounter - * @details Outputs: setEntryActuatorCmdIssued, autoEjectTimerCounter + * Retracting Ejector sub-state of the Post-Treatment Auto-Eject state + * machine. Retracts the ejector pin (H5) after the tubeset has been ejected. + * @details Inputs: autoEjectTimerCounter + * @details Outputs: autoEjectTimerCounter * @return next Auto-Eject sub-state *************************************************************************/ static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectRetractingEjectorState( void ) { POST_TX_AUTO_EJECT_STATE_T subState = POST_TX_AUTO_EJECT_STATE_RETRACTING_EJECTOR; - if ( FALSE == setEntryActuatorCmdIssued ) - { - retractEjector(); - setEntryActuatorCmdIssued = TRUE; - } - if ( ++autoEjectTimerCounter >= AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL ) { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_EJECT_EJECTOR_TIMEOUT, (U32)getEjectorState(), autoEjectTimerCounter ); - requestNewOperationMode( MODE_FAUL); } 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; + autoEjectTimerCounter = 0; + subState = NUM_OF_POST_TX_AUTO_EJECT_SUB_STATES; } return subState; @@ -414,38 +414,40 @@ * The handleAutoEjectRequest function handles a UI request to remove the * disposable tubeset. * @details Inputs: none - * @details Outputs: autoEjectConfirmRequest + * @details Outputs: autoEjectReqReceived * @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; + BOOL notInValidState = FALSE; TD_OP_MODE_T mode = getCurrentOperationMode(); UI_RESPONSE_PAYLOAD_T response; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_INVALID_PAYLOAD_LENGTH; - response.accepted = FALSE; - response.rejectionReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; - - if ( sizeof( BOOL ) == message->hdr.payloadLen ) + if ( 0 == 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 ) ); + notInValidState = ( ( ( TD_POST_TREATMENT_AUTO_EJECT_STATE != currentPostTreatmentState ) || + ( POST_TX_AUTO_EJECT_STATE_AWAIT_CONFIRMATION != currentPostTxAutoEjectState ) ) ? TRUE : FALSE ); 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 ) ); + rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; } - else if ( TRUE == confirmed ) + else { autoEjectReqReceived = TRUE; - result = TRUE; + result = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; } } + response.accepted = result; + response.rejectionReason = rejReason; + sendMessage( MSG_ID_TD_ADJUST_DISPOSABLES_REMOVAL_CONFIRM_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08*)(&response), sizeof( UI_RESPONSE_PAYLOAD_T ) ); + return result; }