Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rda59fa4a98dbc11c37677e92a66aa940d251678f -r222b05e39082f727dcfa2d144fa6e040501882f0 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision da59fa4a98dbc11c37677e92a66aa940d251678f) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 222b05e39082f727dcfa2d144fa6e040501882f0) @@ -164,7 +164,7 @@ presUFRateMlMin = ( presUFVolumeL * (F32)ML_PER_LITER ) / (F32)getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); // Direct DD to generate dialysate and bypass while priming blood cmdStartGenerateDialysate( (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presUFRateMlMin, - getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ), TRUE, + getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ), DD_GEND_DIALYSATE_BYPASS_STATE, getTreatmentParameterF32( TREATMENT_PARAM_ACID_CONCENTRATE_CONV_FACTOR ), bicarbConvFactor, getTreatmentParameterU32( TREATMENT_PARAM_SODIUM ), Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r96604b790636c66ef21980a4f13ee9f987f12fee -r222b05e39082f727dcfa2d144fa6e040501882f0 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 96604b790636c66ef21980a4f13ee9f987f12fee) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 222b05e39082f727dcfa2d144fa6e040501882f0) @@ -253,7 +253,7 @@ // Direct DD to generate dialysate and bypass while priming blood. cmdStartGenerateDialysate( (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presUFRateMlMin, - getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ), TRUE, + getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ), DD_GEND_DIALYSATE_BYPASS_STATE, getTreatmentParameterF32( TREATMENT_PARAM_ACID_CONCENTRATE_CONV_FACTOR ), bicarbConvFactor, getTreatmentParameterU32( TREATMENT_PARAM_SODIUM ), @@ -384,6 +384,8 @@ if ( TREATMENT_ISO_UF_STATE == currentTreatmentState ) { + cmdSetGenDialysateState( DD_GEND_ISOLATED_UF_STATE ); + if ( ISOLATED_UF_PAUSED_STATE == getCurrentIsolatedUFState() ) { cmdChangeQuf( 0.0F ); @@ -874,61 +876,43 @@ /*********************************************************************//** * @brief * The handleTreatmentIsoUFState function handles isolated ultrafiltration. - * @details \b Inputs: treatmentTimeMS, lastTreatmentTimeStamp - * @details \b Outputs: treatmentTimeMS, isolated UF sub-mode executed + * @details \b Inputs: lastTreatmentTimeStamp + * @details \b Outputs: isolated UF sub-mode executed * @return next treatment mode state *************************************************************************/ static TREATMENT_STATE_T handleTreatmentIsoUFState( void ) { TREATMENT_STATE_T result = TREATMENT_ISO_UF_STATE; U32 newTime = getMSTimerCount(); - U32 msSinceLast = calcTimeBetween( lastTreatmentTimeStamp, newTime ); - // Update treatment time - treatmentTimeMS += msSinceLast; + // Keep the main HD/HDF treatment timer paused while isolated UF tracks its own session time. lastTreatmentTimeStamp = newTime; - // Prescribed HD/HDF time elapsed during mid-treatment iso UF: end iso UF and wait in END for post-treatment iso UF or POST. - if ( ( TRUE == isIsolatedUFMidTreatment() ) && - ( CALC_ELAPSED_TREAT_TIME_IN_SECS() >= presTreatmentTimeSecs ) ) + execIsolatedUF(); + + if ( TRUE == isIsolatedUFCompleted() ) { - treatmentCompleted = TRUE; recordCompletedIsolatedUFSession(); - endIsolatedUFOnUserStop(); - isolatedUFMidTreatment = FALSE; - cmdBypassDialyzer( TRUE ); - cmdChangeQuf( 0.0F ); - cmdChangeQd( 0.0F ); - result = TREATMENT_END_STATE; - } - else - { - execIsolatedUF(); - if ( TRUE == isIsolatedUFCompleted() ) + if ( TRUE == isIsolatedUFMidTreatment() ) { - recordCompletedIsolatedUFSession(); - - if ( TRUE == isIsolatedUFMidTreatment() ) - { - resumeDialysisAfterIsolatedUF(); - result = TREATMENT_DIALYSIS_STATE; - } - else - { - treatmentCompleted = TRUE; - cmdBypassDialyzer( TRUE ); - cmdChangeQuf( 0.0F ); - requestNewOperationMode( MODE_POST ); - result = TREATMENT_END_STATE; - } + resumeDialysisAfterIsolatedUF(); + result = TREATMENT_DIALYSIS_STATE; } - // Handle alarm page - else if ( TRUE == doesAlarmStatusIndicateStop() ) + else { - result = enterTreatmentPausedState(); + treatmentCompleted = TRUE; + cmdBypassDialyzer( TRUE ); + cmdChangeQuf( 0.0F ); + requestNewOperationMode( MODE_POST ); + result = TREATMENT_END_STATE; } } + // Handle alarm page + else if ( TRUE == doesAlarmStatusIndicateStop() ) + { + result = enterTreatmentPausedState(); + } return result; } Index: firmware/App/Modes/StateTxDialysis.c =================================================================== diff -u -rda59fa4a98dbc11c37677e92a66aa940d251678f -r222b05e39082f727dcfa2d144fa6e040501882f0 --- firmware/App/Modes/StateTxDialysis.c (.../StateTxDialysis.c) (revision da59fa4a98dbc11c37677e92a66aa940d251678f) +++ firmware/App/Modes/StateTxDialysis.c (.../StateTxDialysis.c) (revision 222b05e39082f727dcfa2d144fa6e040501882f0) @@ -115,7 +115,7 @@ setAlarmUserActionEnabled( ALARM_USER_ACTION_END_TREATMENT, TRUE ); // Set actuators as appropriate for state - cmdStartGenerateDialysate( setDialysateFlowRate, setUFRateMlMin, dialTemp, FALSE, + cmdStartGenerateDialysate( setDialysateFlowRate, setUFRateMlMin, dialTemp, DD_GEND_DIALYSATE_DELIVERY_STATE, acidConvFactor, bicarbConvFactor, sodium, bicarbonate ); transitionToDialysisState( currentDialysisState ); Index: firmware/App/Modes/StateTxIsolatedUF.c =================================================================== diff -u -r96604b790636c66ef21980a4f13ee9f987f12fee -r222b05e39082f727dcfa2d144fa6e040501882f0 --- firmware/App/Modes/StateTxIsolatedUF.c (.../StateTxIsolatedUF.c) (revision 96604b790636c66ef21980a4f13ee9f987f12fee) +++ firmware/App/Modes/StateTxIsolatedUF.c (.../StateTxIsolatedUF.c) (revision 222b05e39082f727dcfa2d144fa6e040501882f0) @@ -93,6 +93,8 @@ doorClosedRequired( TRUE ); + currentIsolatedUFState = ISOLATED_UF_RUNNING_STATE; + // Set user alarm recovery actions allowed in this sub-mode. setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, TRUE ); @@ -109,7 +111,7 @@ setDialysateFlowMlMin = 0.0F; } - cmdStartGenerateDialysate( setDialysateFlowMlMin, ufRateMlMin, dialTemp, TRUE, acidConvFactor, bicarbConvFactor, sodium, bicarbonate ); + cmdStartGenerateDialysate( setDialysateFlowMlMin, ufRateMlMin, dialTemp, DD_GEND_ISOLATED_UF_STATE, acidConvFactor, bicarbConvFactor, sodium, bicarbonate ); transitionToIsolatedUFState( currentIsolatedUFState ); if ( FALSE == isolatedUFActive ) @@ -140,6 +142,7 @@ setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); setBloodPumpTargetFlowRate( getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ), MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + cmdSetGenDialysateState( DD_GEND_ISOLATED_UF_STATE ); cmdChangeQuf( getIsolatedUFRateMlMin() ); startAirTrapControl(); break; @@ -148,6 +151,7 @@ setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); setBloodPumpTargetFlowRate( getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ), MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + cmdSetGenDialysateState( DD_GEND_ISOLATED_UF_STATE ); cmdChangeQuf( 0.0F ); startAirTrapControl(); break; @@ -433,7 +437,7 @@ *************************************************************************/ static void updateIsolatedUFVolume( void ) { - isolatedUFVolumeDrawnL.data = 0.0F; // TODO: update when DD reports delivered UF volume. + isolatedUFVolumeDrawnL.data = getDDUFVolumeDeliveredLiters(); } /**@}*/ Index: firmware/App/Services/DDInterface.c =================================================================== diff -u -rda59fa4a98dbc11c37677e92a66aa940d251678f -r222b05e39082f727dcfa2d144fa6e040501882f0 --- firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision da59fa4a98dbc11c37677e92a66aa940d251678f) +++ firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision 222b05e39082f727dcfa2d144fa6e040501882f0) @@ -40,6 +40,7 @@ static DD_OP_MODE_T ddCurrentOpMode; ///< Current DD operation mode. static U32 ddSubMode; ///< Current state (sub-mode) of current DD operation mode. static F32 dialysatePressure; ///< Current dialysate pressure reported by DD. +static F32 ddUFVolumeDeliveredLiters; ///< Latest UF volume delivered reported by DD (L). static BOOL ddStartCommandSent; ///< Flag indicates command to start DD has been sent. static BOOL ddStarted; ///< Flag indicates whether we have commanded the DD to start or stop. static BOOL isDialysateGoodtoDeliver; ///< Flag indicating whether dialysate is good to deliver. @@ -72,6 +73,7 @@ ddCurrentOpMode = DD_MODE_INIT; ddSubMode = 0; dialysatePressure = 0.0F; + ddUFVolumeDeliveredLiters = 0.0F; isDialysateGoodtoDeliver = FALSE; ddOpModeDataFreshFlag = FALSE; @@ -115,7 +117,7 @@ dialysateDeliveryCmdSet.dialRate = 0.0F; dialysateDeliveryCmdSet.ufRate = 0.0F; dialysateDeliveryCmdSet.dialTemp = 0.0F; - dialysateDeliveryCmdSet.bypassDialyzer = TRUE; + dialysateDeliveryCmdSet.genDialysateState = DD_GEND_DIALYSATE_BYPASS_STATE; dialysateDeliveryCmdSet.acidConvFactor = 0.0F; dialysateDeliveryCmdSet.bicarbConvFactor = 0.0F; dialysateDeliveryCmdSet.sodium = 0; @@ -279,6 +281,43 @@ /*********************************************************************//** * @brief + * The setUFData function stores the latest DD ultrafiltration broadcast data. + * @details \b Inputs: message payload + * @details \b Outputs: ddUFVolumeDeliveredLiters + * @param message Pointer to the DD UF data broadcast message + * @return TRUE if message handled successfully, FALSE if not + *************************************************************************/ +BOOL setUFData( MESSAGE_T *message ) +{ + BOOL result = FALSE; + DD_UF_DATA_T payload; + + memcpy( &payload, &message->payload[ 0 ], sizeof( DD_UF_DATA_T ) ); + + if ( message->hdr.payloadLen == sizeof( DD_UF_DATA_T ) ) + { + ddUFVolumeDeliveredLiters = payload.ufVolumeDeliveredMl / (F32)ML_PER_LITER; + result = TRUE; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getDDUFVolumeDeliveredLiters function gets the latest DD-reported UF + * volume delivered. + * @details \b Inputs: ddUFVolumeDeliveredLiters + * @details \b Outputs: none + * @return Latest UF volume delivered in liters. + *************************************************************************/ +F32 getDDUFVolumeDeliveredLiters( void ) +{ + return ddUFVolumeDeliveredLiters; +} + +/*********************************************************************//** + * @brief * The getDialysatePressure function gets the latest reported dialysate * pressure. * @details \b Inputs: dialysatePressure @@ -382,24 +421,24 @@ * @param qd Target dialysate flow rate (Qd). * @param quf Target ultrafiltration rate (Quf) (in mL/min). * @param dialTemp Target dialysate temperature in deg C. - * @param bypass Flag indicating whether dialyzer should be bypassed. + * @param genDialysateState Requested DD gen dialysate sub-state (DD_GEND_MODE_STATE_T). * @param acidConvFactor Conversion factor for the acid used. * @param bicarbConvFactor Conversion factor for the bicarbonate used. * @param sodium Level of sodium used in mEq/L. * @param bicarbonate Level of bicarbonate used in mEq/L. * @return none *************************************************************************/ -void cmdStartGenerateDialysate( F32 qd, F32 quf, F32 dialTemp, BOOL bypass, F32 acidConvFactor, F32 bicarbConvFactor, U32 sodium, U32 bicarbonate ) +void cmdStartGenerateDialysate( F32 qd, F32 quf, F32 dialTemp, U32 genDialysateState, F32 acidConvFactor, F32 bicarbConvFactor, U32 sodium, U32 bicarbonate ) { - dialysateDeliveryCmdSet.start = TRUE; - dialysateDeliveryCmdSet.dialRate = qd; - dialysateDeliveryCmdSet.ufRate = quf; - dialysateDeliveryCmdSet.dialTemp = dialTemp; - dialysateDeliveryCmdSet.bypassDialyzer = bypass; - dialysateDeliveryCmdSet.acidConvFactor = acidConvFactor; - dialysateDeliveryCmdSet.bicarbConvFactor = bicarbConvFactor; - dialysateDeliveryCmdSet.sodium = sodium; - dialysateDeliveryCmdSet.bicarbonate = bicarbonate; + dialysateDeliveryCmdSet.start = TRUE; + dialysateDeliveryCmdSet.dialRate = qd; + dialysateDeliveryCmdSet.ufRate = quf; + dialysateDeliveryCmdSet.dialTemp = dialTemp; + dialysateDeliveryCmdSet.genDialysateState = genDialysateState; + dialysateDeliveryCmdSet.acidConvFactor = acidConvFactor; + dialysateDeliveryCmdSet.bicarbConvFactor = bicarbConvFactor; + dialysateDeliveryCmdSet.sodium = sodium; + dialysateDeliveryCmdSet.bicarbonate = bicarbonate; #ifndef TEST_UI_ONLY sendMessage( MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA, COMM_BUFFER_OUT_CAN_TD_2_DD, (U08*)(&dialysateDeliveryCmdSet), sizeof( DIALYSATE_DELIVERY_REQ_PAYLOAD_T ) ); @@ -459,20 +498,19 @@ /*********************************************************************//** * @brief - * The cmdBypassDialyzer function sends a generate dialysate command to the DD - * with a given flag indicating whether dialyzer should be bypassed. + * The cmdSetGenDialysateState function sends a generate dialysate command to + * the DD with a requested gen dialysate sub-state. * @details \b Inputs: none * @details \b Outputs: dialysateDeliveryCmdSet - * @details \b Message \b Sent: Continue generate dialysate command w/ new - * dialyzer bypass flag. - * @param bypass Flag indicating whether dialyzer should be bypassed. + * @details \b Message \b Sent: Continue generate dialysate command w/ new sub-state. + * @param genDialysateState Requested DD gen dialysate sub-state. * @return none *************************************************************************/ -void cmdBypassDialyzer( BOOL bypass ) +void cmdSetGenDialysateState( U32 genDialysateState ) { if ( TRUE == dialysateDeliveryCmdSet.start ) { - dialysateDeliveryCmdSet.bypassDialyzer = bypass; + dialysateDeliveryCmdSet.genDialysateState = genDialysateState; #ifndef TEST_UI_ONLY sendMessage( MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA, COMM_BUFFER_OUT_CAN_TD_2_DD, (U08*)(&dialysateDeliveryCmdSet), sizeof( DIALYSATE_DELIVERY_REQ_PAYLOAD_T ) ); #endif @@ -485,6 +523,23 @@ /*********************************************************************//** * @brief + * The cmdBypassDialyzer function sends a generate dialysate command to the DD + * requesting bypass or delivery sub-state. + * @details \b Inputs: none + * @details \b Outputs: dialysateDeliveryCmdSet + * @details \b Message \b Sent: Continue generate dialysate command w/ new sub-state. + * @param bypass Flag indicating whether dialyzer should be bypassed. + * @return none + *************************************************************************/ +void cmdBypassDialyzer( BOOL bypass ) +{ + U32 genDialysateState = ( TRUE == bypass ) ? DD_GEND_DIALYSATE_BYPASS_STATE : DD_GEND_DIALYSATE_DELIVERY_STATE; + + cmdSetGenDialysateState( genDialysateState ); +} + +/*********************************************************************//** + * @brief * The cmdStopGenerateDialysate function sends a stop generate dialysate command * to the DD. DD will transition back to standby mode. * @details \b Inputs: none Index: firmware/App/Services/DDInterface.h =================================================================== diff -u -rda59fa4a98dbc11c37677e92a66aa940d251678f -r222b05e39082f727dcfa2d144fa6e040501882f0 --- firmware/App/Services/DDInterface.h (.../DDInterface.h) (revision da59fa4a98dbc11c37677e92a66aa940d251678f) +++ firmware/App/Services/DDInterface.h (.../DDInterface.h) (revision 222b05e39082f727dcfa2d144fa6e040501882f0) @@ -14,23 +14,23 @@ * @date (original) 01-Aug-2024 * ***************************************************************************/ - -#ifndef __DD_INTERFACE_H__ -#define __DD_INTERFACE_H__ - + +#ifndef __DD_INTERFACE_H__ +#define __DD_INTERFACE_H__ + #include "TDCommon.h" #include "TDDefs.h" -#include "DDDefs.h" - -/** - * @defgroup DDInterface DDInterface - * @brief DD interface & monitor unit. Interfaces with and monitors the - * DD (dialysate delivery) sub-system. - * - * @addtogroup DDInterface - * @{ - */ - +#include "DDDefs.h" + +/** + * @defgroup DDInterface DDInterface + * @brief DD interface & monitor unit. Interfaces with and monitors the + * DD (dialysate delivery) sub-system. + * + * @addtogroup DDInterface + * @{ + */ + // ********** public definitions ********** /// DD command response data record structure. @@ -41,32 +41,45 @@ U32 rejectCode; ///< Reason code for rejecting the command } DD_CMD_RESPONSE_T; -// ********** public function prototypes ********** - +/// DD ultrafiltration broadcast data (matches DD UF_DATA_T layout). +typedef struct +{ + U32 ufExecState; ///< Ultrafiltration execution state + F32 ufRate; ///< Ultrafiltration rate from TD + F32 compUFrate; ///< Compensated UF rate + U32 isUFRequested; ///< Ultrafiltration run or pause request + F32 ufVolumeDeliveredMl; ///< UF volume delivered in mL +} DD_UF_DATA_T; + +// ********** public function prototypes ********** + void initDDInterface( void ); void resetDDInterface( void ); void execDDInterfaceMonitor( void ); DD_OP_MODE_T getDDOpMode( void ); -U32 getDDSubMode( void ); +U32 getDDSubMode( void ); F32 getDialysatePressure( void ); BOOL getDialysateGoodToDeliverStatus( void ); +F32 getDDUFVolumeDeliveredLiters( void ); BOOL setDDOpMode( MESSAGE_T *message ); BOOL setDialysateData( MESSAGE_T *message ); +BOOL setUFData( MESSAGE_T *message ); BOOL setDialysatePressure( MESSAGE_T *message ); void cmdStartPreGenerateDialysate( F32 qd, F32 dialTemp, F32 acidConvFactor, F32 bicarbConvFactor, U32 sodium, U32 bicarbonate ); -void cmdStartGenerateDialysate( F32 qd, F32 quf, F32 dialTemp, BOOL bypass, F32 acidConvFactor, F32 bicarbConvFactor, U32 sodium, U32 bicarbonate ); +void cmdStartGenerateDialysate( F32 qd, F32 quf, F32 dialTemp, U32 genDialysateState, F32 acidConvFactor, F32 bicarbConvFactor, U32 sodium, U32 bicarbonate ); void cmdChangeQd( F32 qd ); void cmdChangeQuf( F32 quf ); +void cmdSetGenDialysateState( U32 genDialysateState ); void cmdBypassDialyzer( BOOL bypass ); -void cmdStopGenerateDialysate( void ); +void cmdStopGenerateDialysate( void ); void handleDDCommandResponse( DD_CMD_RESPONSE_T *ddCmdRespPtr ); BOOL getDDCommandResponse( U32 commandID, DD_CMD_RESPONSE_T *cmdRespPtr ); -/**@}*/ - -#endif +/**@}*/ + +#endif