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; } Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rf054fdd3579dacb03b5b41a363e259949ff63965 -r981882ba5ad72f45d836aae606dadd273a888058 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision f054fdd3579dacb03b5b41a363e259949ff63965) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 981882ba5ad72f45d836aae606dadd273a888058) @@ -44,15 +44,22 @@ static BOOL confirmTubesetPlaced; ///< Flag indicating user has confirmed tubeset is placed static U32 autoLoadTimerCounter; ///< Auto-Load operation timer counter -static BOOL autoLoadHomePosCleared; ///< Flag indicating blood pump rotor has left home position during auto-load static TD_PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; ///< Current Pre-Treatment sub-state static PRE_TX_INSTALL_STATE_T currentPreTxInstallState; ///< Current Pre-Treatment Install sub-state // ********** private function prototypes ********** -static TD_PRE_TREATMENT_MODE_STATE_T handleRxState( void ); ///< Handle Confirm Rx state during Pre-Treatment +static TD_PRE_TREATMENT_MODE_STATE_T handleWaterSampleState( void ); ///< Handle Water Sample state during Pre-Treatment +static TD_PRE_TREATMENT_MODE_STATE_T handleSelfTestConsumableState( void ); ///< Handle Self Test Consumable state during Pre-Treatment +static TD_PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ); ///< Handle Self Test No Cart state during Pre-Treatment static TD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ); ///< Handle Install state during Pre-Treatment +static TD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ); ///< Handle Self Test Dry state during Pre-Treatment +static TD_PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ); ///< Handle Prime state during Pre-Treatment +static TD_PRE_TREATMENT_MODE_STATE_T handleRecirculateState( void ); ///< Handle Recirculate state during Pre-Treatment +static TD_PRE_TREATMENT_MODE_STATE_T handleRxState( void ); ///< Handle Confirm Rx state during Pre-Treatment +static TD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ); ///< Handle Patient Connection state during Pre-Treatment + static PRE_TX_INSTALL_STATE_T handleAwaitTubesetConfirmationState( void ); ///< Handle Await Tubset Install Confirmation sub-state static PRE_TX_INSTALL_STATE_T handleAutoLoadState( void ); ///< Handle Auto-Load sub-state @@ -70,9 +77,8 @@ resetTreatmentParameters(); currentPreTreatmentState = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; currentPreTxInstallState = PRE_TX_INSTALL_STATE_AWAIT_TUBING_SET_CONFIRMATION; - confirmTubesetPlaced = FALSE; - autoLoadTimerCounter = 0; - autoLoadHomePosCleared = FALSE; + confirmTubesetPlaced = FALSE; + autoLoadTimerCounter = 0; } /*********************************************************************//** @@ -159,37 +165,66 @@ /*********************************************************************//** * @brief - * The handleRxState function executes the Confirm Rx pre-treatment step. - * @details Inputs: none - * @details Outputs: Requests transition to Treatment mode when the prescription - * is valid and confirmed otherwise remains in Confirm Rx. - * @return next Pre-Treatment mode sub-state. + * The handleWaterSampleState function executes the Water Sample state of + * pre-treatment mode. + * @details Inputs: TODO fill up if any + * @details Outputs: TODO fill up if any + * @return next Pre-Treatment mode state. *************************************************************************/ -static TD_PRE_TREATMENT_MODE_STATE_T handleRxState( void ) +static TD_PRE_TREATMENT_MODE_STATE_T handleWaterSampleState( void ) { - BOOL paramsValid = getValidTreatParamsReceived(); - BOOL paramsConfirmed = getTreatParamsConfirmed(); - TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_CONFIRM_RX_STATE; + TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_WATER_SAMPLE_STATE; - // Valid + confirmed – move to next state: Patient Connection - if ( ( TRUE == paramsValid ) && ( TRUE == paramsConfirmed ) ) - { - // TODO: when additional Pre-Treatment states are implemented, change to TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE. - // state = TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; - requestNewOperationMode( MODE_TREA ); - } + // TODO: Transition to Self test consumable state on completion when implemented + // state = TD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE; return state; } /*********************************************************************//** * @brief + * The handleSelfTestConsumableState function executes the Self Test + * Consumable state of pre-treatment mode. + * @details Inputs: TODO fill up if any + * @details Outputs: TODO fill up if any + * @return next Pre-Treatment mode state. + *************************************************************************/ +static TD_PRE_TREATMENT_MODE_STATE_T handleSelfTestConsumableState( void ) +{ + TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE; + + // TODO: Transition to Self test no cart state on completion when implemented + // state = TD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; + + return state; +} + +/*********************************************************************//** + * @brief + * The handleSelfTestNoCartState function executes the Self Test No Cart + * state of pre-treatment mode. + * @details Inputs: TODO fill up if any + * @details Outputs: TODO fill up if any + * @return next Pre-Treatment mode state. + *************************************************************************/ +static TD_PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ) +{ + TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; + + // TODO: Transition to Tubing set install state on completion when implemented + // state = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; + + return state; +} + +/*********************************************************************//** + * @brief * The handleInstallState function executes the Pre-Treatment Install * state machine. * @details Inputs: currentPreTxInstallState * @details Outputs: Advances the Pre-Treatment Install sub-state and * next Pre-Treatment top-level state when install is complete. - * @return current Pre-Treatment sub-state. + * @return current Pre-Treatment state. *************************************************************************/ static TD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ) { @@ -220,32 +255,121 @@ /*********************************************************************//** * @brief + * The handleSelfTestDryState function executes the Self Test Dry state + * of pre-treatment mode. + * @details Inputs: TODO fill up if any + * @details Outputs: TODO fill up if any + * @return next Pre-Treatment mode state. + *************************************************************************/ +static TD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ) +{ + TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_SELF_TEST_DRY_STATE; + + // TODO: Transition to Prime state on completion when implemented + // state = TD_PRE_TREATMENT_PRIME_STATE; + + return state; +} + +/*********************************************************************//** + * @brief + * The handlePrimeState function executes the Prime state of + * pre-treatment mode. + * @details Inputs: TODO fill up if any + * @details Outputs: TODO fill up if any + * @return next Pre-Treatment mode state. + *************************************************************************/ +static TD_PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ) +{ + TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_PRIME_STATE; + + // TODO: Transition to Recirculate state on completion when implemented + // state = TD_PRE_TREATMENT_RECIRCULATE_STATE; + + return state; +} + +/*********************************************************************//** + * @brief + * The handleRecirculateState function executes the Recirculate state of + * pre-treatment mode. + * @details Inputs: TODO fill up if any + * @details Outputs: TODO fill up if any + * @return next Pre-Treatment mode state. + *************************************************************************/ +static TD_PRE_TREATMENT_MODE_STATE_T handleRecirculateState( void ) +{ + TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_RECIRCULATE_STATE; + + // TODO: Transition to Confirm RX state on completion when implemented + // state = TD_PRE_TREATMENT_CONFIRM_RX_STATE; + + return state; +} + +/*********************************************************************//** + * @brief + * The handleRxState function executes the Confirm Rx pre-treatment step. + * @details Inputs: none + * @details Outputs: Requests transition to Treatment mode when the prescription + * is valid and confirmed otherwise remains in Confirm Rx. + * @return next Pre-Treatment mode state. + *************************************************************************/ +static TD_PRE_TREATMENT_MODE_STATE_T handleRxState( void ) +{ + BOOL paramsValid = getValidTreatParamsReceived(); + BOOL paramsConfirmed = getTreatParamsConfirmed(); + TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_CONFIRM_RX_STATE; + + // Valid + confirmed – move to next state: Patient Connection + if ( ( TRUE == paramsValid ) && ( TRUE == paramsConfirmed ) ) + { + state = TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handlePatientConnectionState function executes the Patient + * Connection state of pre-treatment mode. + * @details Inputs: TODO fill up if any + * @details Outputs: TODO fill up if any + * @return next Pre-Treatment mode state. + *************************************************************************/ +static TD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ) +{ + TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; + + // TODO : after implementing this state, place the transition in the right place + + requestNewOperationMode( MODE_TREA ); + + return state; +} + +/*********************************************************************//** + * @brief * The handleAwaitTubesetConfirmationState function handles the Await * tubeset confirmation state of Pre-Treatement mode install state * machine. Should wait for the user to confirm the tubeset is placed, * and verifies that the blood pump door (H9) is closed. - * @details Inputs: confirmTubsetPlaced, H9_SWCH - * @details Outputs: confirmTubesetPlaced, autoLoadHomePosCleared - * return next Pre-Treatment install sub-state + * @details Inputs: confirmTubsetPlaced + * @details Outputs: confirmTubesetPlaced + * return next Pre-Treatment Install sub-state *************************************************************************/ static PRE_TX_INSTALL_STATE_T handleAwaitTubesetConfirmationState( void ) { PRE_TX_INSTALL_STATE_T subState = PRE_TX_INSTALL_STATE_AWAIT_TUBING_SET_CONFIRMATION; if ( TRUE == confirmTubesetPlaced ) { - //BP door close check - if ( STATE_CLOSED == getSwitchState( H9_SWCH ) ) - { - doorClosedRequired(TRUE); - confirmTubesetPlaced = FALSE; - autoLoadHomePosCleared = FALSE; - subState = PRE_TX_INSTALL_STATE_AUTO_LOAD; - } - else - { - activateAlarmNoData( ALARM_ID_TD_CARTRIDGE_DOOR_OPENED ); - } + // Door closed required from Auto-loading onwards, set to false if not required in subsequent states + doorClosedRequired( TRUE ); + confirmTubesetPlaced = FALSE; + setBloodPumpTargetFlowRate( AUTO_LOAD_BLOOD_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + subState = PRE_TX_INSTALL_STATE_AUTO_LOAD; } return subState; @@ -255,45 +379,25 @@ * @brief * The handleAutoLoadState function handles the Auto-Load state of * Pre-Treatement mode install state. - * @details Inputs: autoLoadHomePosCleared, autoLoadTimerCounter - * @details Outputs: autoLoadHomePosCleared, autoLoadTimerCounter - * return next Pre-Treatment install sub-state + * @details Inputs: autoLoadTimerCounter + * @details Outputs: autoLoadTimerCounter + * return next Pre-Treatment Install sub-state *************************************************************************/ static PRE_TX_INSTALL_STATE_T handleAutoLoadState( void ) { PRE_TX_INSTALL_STATE_T subState = PRE_TX_INSTALL_STATE_AUTO_LOAD; - // Set H4 to 100 mL/min forward - setBloodPumpTargetFlowRate( AUTO_LOAD_BLOOD_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - // Timeout check if ( ++autoLoadTimerCounter >= AUTO_LOAD_TIMEOUT_INTERVAL ) { signalBloodPumpHardStop(); - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, autoLoadHomePosCleared, isPeristalticPumpHome() ); - requestNewOperationMode( MODE_FAUL ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, isPeristalticPumpHome(), autoLoadTimerCounter ); } - else + else if ( TRUE == isPeristalticPumpHome() ) { - if ( FALSE == autoLoadHomePosCleared ) - { - if ( FALSE == isPeristalticPumpHome() ) - { - autoLoadHomePosCleared = TRUE; - } - } - else if ( TRUE == isPeristalticPumpHome() ) - { - signalBloodPumpHardStop(); - - // Send auto-load completion message - UI_RESPONSE_PAYLOAD_T response; - response.accepted = TRUE; - response.rejectionReason = REQUEST_REJECT_REASON_NONE; - sendMessage( MSG_ID_TD_ADJUST_DISPOSABLES_CONFIRM_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08*)(&response), sizeof( UI_RESPONSE_PAYLOAD_T ) ); - - subState = NUM_OF_PRE_TX_INSTALL_SUB_STATES; - } + signalBloodPumpHardStop(); + autoLoadTimerCounter = 0; + subState = NUM_OF_PRE_TX_INSTALL_SUB_STATES; } return subState; @@ -311,31 +415,33 @@ *************************************************************************/ BOOL handleAutoLoadRequest( 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_PRE_TREATMENT_TUBING_SET_INSTALL_STATE != currentPreTreatmentState ) || - ( PRE_TX_INSTALL_STATE_AWAIT_TUBING_SET_CONFIRMATION != currentPreTxInstallState ) ); + notInValidState = ( ( ( TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE != currentPreTreatmentState ) || + ( PRE_TX_INSTALL_STATE_AWAIT_TUBING_SET_CONFIRMATION != currentPreTxInstallState ) ) ? TRUE : FALSE ); if ( ( mode != MODE_PRET ) || ( TRUE == notInValidState ) ) { - sendMessage( MSG_ID_TD_ADJUST_DISPOSABLES_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 { confirmTubesetPlaced = TRUE; result = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; } } + response.accepted = result; + response.rejectionReason = rejReason; + sendMessage( MSG_ID_TD_ADJUST_DISPOSABLES_CONFIRM_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08*)(&response), sizeof( UI_RESPONSE_PAYLOAD_T ) ); + return result; } Index: firmware/App/Modes/ModePreTreat.h =================================================================== diff -u -rf054fdd3579dacb03b5b41a363e259949ff63965 -r981882ba5ad72f45d836aae606dadd273a888058 --- firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision f054fdd3579dacb03b5b41a363e259949ff63965) +++ firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision 981882ba5ad72f45d836aae606dadd273a888058) @@ -15,7 +15,6 @@ * ***************************************************************************/ - #ifndef __MODE_PRE_TREAT_H__ #define __MODE_PRE_TREAT_H__