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 ); } Index: firmware/App/Modes/ModePreTreat.h =================================================================== diff -u -r4add377f60d45effbdc064b110a59c1b8afd0ab8 -red3e4d4180a4c0f08af285426c247aadfc685847 --- firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision 4add377f60d45effbdc064b110a59c1b8afd0ab8) +++ firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision ed3e4d4180a4c0f08af285426c247aadfc685847) @@ -51,7 +51,9 @@ void signalUserConfirmInstallation( void ); // Signal that user confirms disposable has been installed void signalUserContinueToTreatment( void ); // Signal that user requests to continue to treatment -BOOL signalUserBeginningTreatment( void ); // Signal that user requests treatment begin +void setUserSetUFVolumeStatus( BOOL status ); // Set status that indicates UF volume setting has been set +void signalUserConfirmPatientConnection( void ); // Signal that user confirms patient connection has been completed +BOOL signalUserStartTreatment( void ); // Signal that user requests to start treatment void signalAlarmActionToPreTreatmentMode( ALARM_ACTION_T action ); // Execute alarm action as appropriate for pre-treatment mode /**@}*/ Index: firmware/App/Modes/SampleWater.c =================================================================== diff -u -r3d079c1d9ca782edcdf2bd962929a1adcfef9ade -red3e4d4180a4c0f08af285426c247aadfc685847 --- firmware/App/Modes/SampleWater.c (.../SampleWater.c) (revision 3d079c1d9ca782edcdf2bd962929a1adcfef9ade) +++ firmware/App/Modes/SampleWater.c (.../SampleWater.c) (revision ed3e4d4180a4c0f08af285426c247aadfc685847) @@ -17,7 +17,6 @@ #include "AlarmMgmt.h" #include "DGInterface.h" -#include "HDDefs.h" #include "SampleWater.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -190,13 +189,13 @@ * provided by the user. * @details Inputs: none * @details Outputs: action handled, request responded to - * @param isSampleWaterPassed sample water test result + * @param result sample water test result * @return none *************************************************************************/ -void setSampleWaterResult( BOOL isSampleWaterPassed ) +void setSampleWaterResult( BOOL result ) { sampleWaterEntered = TRUE; - sampleWaterResult = isSampleWaterPassed; + sampleWaterResult = result; } /*********************************************************************//** Index: firmware/App/Modes/SampleWater.h =================================================================== diff -u -r3d079c1d9ca782edcdf2bd962929a1adcfef9ade -red3e4d4180a4c0f08af285426c247aadfc685847 --- firmware/App/Modes/SampleWater.h (.../SampleWater.h) (revision 3d079c1d9ca782edcdf2bd962929a1adcfef9ade) +++ firmware/App/Modes/SampleWater.h (.../SampleWater.h) (revision ed3e4d4180a4c0f08af285426c247aadfc685847) @@ -41,7 +41,7 @@ BOOL isSampleWaterPassed( void ); void signalSampleWaterUserAction( REQUESTED_SAMPLE_WATER_USER_ACTIONS_T action ); // from user -void setSampleWaterResult( BOOL isSampleWaterPassed ); // from user +void setSampleWaterResult( BOOL result ); // from user /**@}*/ Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -rc0445144841904d5a6ea9d37af639e138e6a86b0 -red3e4d4180a4c0f08af285426c247aadfc685847 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision c0445144841904d5a6ea9d37af639e138e6a86b0) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision ed3e4d4180a4c0f08af285426c247aadfc685847) @@ -1211,6 +1211,14 @@ handleStartPrimeCmd( message ); break; + case MSG_ID_UI_CONTINUE_TO_TREATMENT_REQUEST: + handleContinueToTreatmentCmd( message ); + break; + + case MSG_ID_UI_PATIENT_CONNECTION_CONFIRM: + handlePatientConnectionConfirmCmd( message ); + break; + case MSG_ID_DG_COMMAND_RESPONSE: handleDGCmdResp( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r4add377f60d45effbdc064b110a59c1b8afd0ab8 -red3e4d4180a4c0f08af285426c247aadfc685847 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 4add377f60d45effbdc064b110a59c1b8afd0ab8) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision ed3e4d4180a4c0f08af285426c247aadfc685847) @@ -179,9 +179,9 @@ /*********************************************************************//** * @brief - * The sendTestAckResponseMsg function constructs a simple response - * message for a handled test message and queues it for transmit on the - * appropriate UART channel. + * The sendAckResponseMsg function constructs a simple response + * message for a handled message and queues it for transmit on the + * appropriate CAN channel. * @details Inputs: none * @details Outputs: response message constructed and queued for transmit. * @param msgID ID of handled message that we are responding to @@ -525,13 +525,10 @@ U32 cmd; memcpy( &cmd, &message->payload[0], sizeof( U32 ) ); - signalSampleWaterUserAction( (REQUESTED_SAMPLE_WATER_USER_ACTIONS_T)cmd ); } - else - { - sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); - } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); } /*********************************************************************//** @@ -565,13 +562,10 @@ U32 result; memcpy( &result, &message->payload[0], sizeof( U32 ) ); - setSampleWaterResult( (BOOL) result ); } - else - { - sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); - } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); } /*********************************************************************//** @@ -585,7 +579,12 @@ *************************************************************************/ void handleInstallationConfirm( MESSAGE_T *message ) { - signalUserConfirmInstallation(); + if ( 0 == message->hdr.payloadLen ) + { + signalUserConfirmInstallation(); + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); } /*********************************************************************//** @@ -599,7 +598,12 @@ *************************************************************************/ void handleStartPrimeCmd( MESSAGE_T *message ) { - signalStartPrime(); + if ( 0 == message->hdr.payloadLen ) + { + signalStartPrime(); + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); } /*********************************************************************//** @@ -628,7 +632,12 @@ *************************************************************************/ void handleContinueToTreatmentCmd( MESSAGE_T *message ) { - signalUserContinueToTreatment(); + if ( 0 == message->hdr.payloadLen ) + { + signalUserContinueToTreatment(); + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); } /*********************************************************************//** @@ -645,7 +654,41 @@ { return sendUIResponseMsg( MSG_ID_HD_CONTINUE_TO_TREATMENT_REQUEST_RESPONSE, accepted, reason ); } - + +/*********************************************************************//** + * @brief + * The handlePatientConnectionConfirmCmd function handles user confirms + * patient connection. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none. + *************************************************************************/ +void handlePatientConnectionConfirmCmd( MESSAGE_T *message ) +{ + if ( 0 == message->hdr.payloadLen ) + { + signalUserConfirmPatientConnection(); + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); +} + +/*********************************************************************//** + * @brief + * The sendPatientConnectionConfirmCmdResponse function constructs a patient connection confirm + * user action response to the UI and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: Patient connection confirm response msg constructed and queued. + * @param accepted T/F - was patient connection confirm accepted? + * @param reason reason why request was rejected (or zero if accepted) + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendPatientConnectionConfirmCmdResponse( BOOL accepted, U32 reason ) +{ + return sendUIResponseMsg( MSG_ID_HD_PATIENT_CONNECTION_CONFIRM_RESPONSE, accepted, reason ); +} + /*********************************************************************//** * @brief * The sendDialysateTempTargetsToDG function constructs a dialysate temperature @@ -1928,7 +1971,7 @@ } else if ( 2 == cmd ) // Start treatment { - result = signalUserBeginningTreatment(); + result = signalUserStartTreatment(); } } @@ -2075,6 +2118,7 @@ memcpy( &uFVolumeMl, message->payload, sizeof(F32) ); result = validateAndSetUFVolume( uFVolumeMl ); + setUserSetUFVolumeStatus( result ); } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, result ); Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r4add377f60d45effbdc064b110a59c1b8afd0ab8 -red3e4d4180a4c0f08af285426c247aadfc685847 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 4add377f60d45effbdc064b110a59c1b8afd0ab8) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision ed3e4d4180a4c0f08af285426c247aadfc685847) @@ -182,6 +182,12 @@ // MSG_ID_HD_CONTINUE_TO_TREATMENT_REQUEST_RESPONSE BOOL sendContinueToTreatmentCmdResponse( BOOL accepted, U32 reason ); +// MSG_ID_UI_PATIENT_CONNECTION_CONFIRM +void handlePatientConnectionConfirmCmd( MESSAGE_T *message ); + +// MSG_ID_HD_PATIENT_CONNECTION_CONFIRM_RESPONSE +BOOL sendPatientConnectionConfirmCmdResponse( BOOL accepted, U32 reason ); + // *********** public DG command functions ********** // MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS