Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r4add377f60d45effbdc064b110a59c1b8afd0ab8 -red3e4d4180a4c0f08af285426c247aadfc685847 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 4add377f60d45effbdc064b110a59c1b8afd0ab8) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision ed3e4d4180a4c0f08af285426c247aadfc685847) @@ -36,11 +36,15 @@ ///< Interval (ms/task time) at which the pre-treatment state data is published on the CAN bus. #define PRE_TREATMENT_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) +#define DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN 100 ///< Patient connection sub-mode dialysate inlet pump flow rate in mL/min. + // ********** private data ********** -static BOOL treatStartReqReceived = FALSE; ///< Flag indicates user requests treatment begin. static BOOL confirmInstallRequested = FALSE; ///< Flag indicates user confirms disposable installation. static BOOL continueToTreatmentRequested = FALSE; ///< Flag indicates user requests to continue to treatment from re-circ. +static BOOL setUFVolStatus; ///< The status of set UF volume operation. +static BOOL patientConnectionConfirm; ///< Flag indicates user has confirmed patient connection complete. +static BOOL treatmentStartRequested = FALSE; ///< Flag indicates user requests treatment begin. static BOOL alarmActionStopReceived = FALSE; ///< Flag indicates an alarm w/ stop property was triggered. static BOOL alarmActionResumeReceived = FALSE; ///< Flag indicates alarm action resume received. @@ -53,6 +57,7 @@ static void publishPreTreatmentState( void ); static void resetSignalFlags( void ); static void transitionToCartridgeInstallation( void ); +static void transitionToPatientConnection( void ); static HD_PRE_TREATMENT_MODE_STATE_T handleWaterSampleState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ); @@ -72,6 +77,8 @@ void initPreTreatmentMode( void ) { currentPreTreatmentState = HD_PRE_TREATMENT_START_STATE; + setUFVolStatus = FALSE; + patientConnectionConfirm = FALSE; initSampleWater(); initPrime(); @@ -163,7 +170,7 @@ * The signalUserConfirmInstallation function handles user confirmation of * disposable installation. * @details Inputs: none - * @details Outputs: treatStartReqReceived, send response to treatment start + * @details Outputs: confirmInstallRequested * @return TRUE if signal accepted, FALSE if not *************************************************************************/ void signalUserConfirmInstallation( void ) @@ -179,7 +186,7 @@ * The signalUserContinueToTreatment function handles user request to continue * to treatment. * @details Inputs: none - * @details Outputs: treatStartReqReceived, send response to treatment start + * @details Outputs: handled and send response to continue to treatment request * @return none *************************************************************************/ void signalUserContinueToTreatment( void ) @@ -199,26 +206,76 @@ /*********************************************************************//** * @brief - * The signalUserBeginningTreatment function handles user requests to begin - * treatment. + * The setUserSetUFVolumeStatus function sets the status for user sets UF + * volume operation. + * @details Inputs: set UF volume operation status + * @details Outputs: setUFVolStatus + * @return none + *************************************************************************/ +void setUserSetUFVolumeStatus( BOOL status ) +{ + setUFVolStatus = status; +} + +/*********************************************************************//** + * @brief + * The signalUserConfirmPatientConnection function handles user confirms + * patient connection message. * @details Inputs: none - * @details Outputs: treatStartReqReceived, send response to treatment start + * @details Outputs: handled and send response to patient connection confirmation + * @return none + *************************************************************************/ +void signalUserConfirmPatientConnection( void ) +{ + BOOL accepted = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_UF_VOLUME_NOT_SET; + + if ( TRUE == setUFVolStatus ) + { + if ( HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE == currentPreTreatmentState ) + { + patientConnectionConfirm = TRUE; + accepted = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + else + { + rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + } + } + + sendPatientConnectionConfirmCmdResponse( accepted, rejReason ); +} + +/*********************************************************************//** + * @brief + * The signalUserStartTreatment function handles user requests to start treatment. + * @details Inputs: patientConnectionConfirm, currentPreTreatmentState + * @details Outputs: handled and send response to treatment start request * @return TRUE if signal accepted, FALSE if not *************************************************************************/ -BOOL signalUserBeginningTreatment( void ) +BOOL signalUserStartTreatment( void ) { - BOOL result = FALSE; + BOOL accepted = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NO_PATIENT_CONNECTION_CONFIRM; - // TODO: check patient connection sub-mode state - if ( ( MODE_PRET == getCurrentOperationMode() ) && ( HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE == currentPreTreatmentState ) ) + if ( TRUE == patientConnectionConfirm ) { - treatStartReqReceived = TRUE; - result = TRUE; + if ( ( MODE_PRET == getCurrentOperationMode() ) && ( HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE == currentPreTreatmentState ) ) + { + treatmentStartRequested = TRUE; + accepted = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + else + { + rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + } } - sendTreatmentStartResponseMsg( result, 0 ); // TODO - provide reason code if rejected + sendTreatmentStartResponseMsg( accepted, rejReason ); - return result; + return accepted; } /*********************************************************************//** @@ -274,10 +331,10 @@ preTreatmentData.preTreatmentSubMode = currentPreTreatmentState; preTreatmentData.sampleWaterState = getSampleWaterState(); preTreatmentData.noCartSelfTestsState = getNoCartSelfTestsState(); - preTreatmentData.installState = 0; // TODO: Add install state from the module + preTreatmentData.installState = 0; preTreatmentData.drySelfTestsState = getDrySelfTestsState(); preTreatmentData.primeState = getPrimeState(); - preTreatmentData.patientConnectionState = 0; // TODO: Add patient connection state from the module + preTreatmentData.patientConnectionState = 0; broadcastPreTreatmentState( &preTreatmentData ); preTreatmentPublishTimerCounter = 0; @@ -293,7 +350,7 @@ *************************************************************************/ static void resetSignalFlags( void ) { - treatStartReqReceived = FALSE; + treatmentStartRequested = FALSE; confirmInstallRequested = FALSE; continueToTreatmentRequested = FALSE; @@ -323,6 +380,26 @@ /*********************************************************************//** * @brief + * The transitionToPatientConnection function prepares actuators before + * transition to pre-treatment patient connection state. + * @details Inputs: none + * @details Outputs: Stopped pumps + * @return none + *************************************************************************/ +static void transitionToPatientConnection( void ) +{ + setUFVolStatus = FALSE; + patientConnectionConfirm = FALSE; + treatmentStartRequested = FALSE; + + signalBloodPumpHardStop(); + signalDialOutPumpHardStop(); + + setDialInPumpTargetFlowRate( DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); +} + +/*********************************************************************//** + * @brief * The handleWaterSampleState function handles patient connection state * during pre-treatment mode. * @details Inputs: none @@ -337,8 +414,8 @@ if ( TRUE == isSampleWaterPassed() ) { - transitionToNoCartSelfTests(); state = HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; + transitionToNoCartSelfTests(); } return state; @@ -374,8 +451,8 @@ if ( TRUE == isNoCartSelfTestsPassed() ) { - transitionToCartridgeInstallation(); state = HD_PRE_TREATMENT_CART_INSTALL_STATE; + transitionToCartridgeInstallation(); } return state; @@ -432,8 +509,8 @@ if ( TRUE == isDrySelfTestsPassed() ) { - transitionToPrime(); state = HD_PRE_TREATMENT_PRIME_STATE; + transitionToPrime(); } return state; @@ -510,6 +587,7 @@ { continueToTreatmentRequested = FALSE; state = HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; + transitionToPatientConnection(); } return state; @@ -525,10 +603,9 @@ *************************************************************************/ static HD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ) { - DG_RESERVOIR_ID_T const activeRes = getDGActiveReservoir(); - - if ( TRUE == treatStartReqReceived ) + if ( TRUE == treatmentStartRequested ) { + DG_RESERVOIR_ID_T const activeRes = getDGActiveReservoir(); setStartReservoirVolume( activeRes ); requestNewOperationMode( MODE_TREA ); }