Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rf70ddc5911bffe11fc5e670c8566164af4b6c88f -r5ab2faa1fb5b29fd9e0e932131211048f29e34c1 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision f70ddc5911bffe11fc5e670c8566164af4b6c88f) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 5ab2faa1fb5b29fd9e0e932131211048f29e34c1) @@ -8,7 +8,7 @@ * @file ModeTreatment.c * * @author (last) Sean Nash -* @date (last) 22-Apr-2024 +* @date (last) 06-May-2024 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -213,6 +213,8 @@ *************************************************************************/ U32 transitionToTreatmentMode( void ) { + PRESSURE_LIMIT_CHANGE_RESPONSE_T respRecord; + if ( ( getTestConfigStatus( TEST_CONFIG_RECOVER_TREATMENT ) != TRUE ) || ( getPreviousOperationMode() != DG_MODE_FAUL ) ) { // Initialize treatment mode each time we transition to it @@ -234,6 +236,13 @@ // Enable venous bubble detection in treatment mode setVenousBubbleDetectionEnabled( TRUE ); + // Read back limits for transmit to UI. + respRecord.artPresLimitWindowmmHg = getTreatmentParameterS32( TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ); + respRecord.venPresLimitWindowmmHg = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ); + respRecord.venPresLimitAsymmetricmmHg = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ); + // Send response + sendPressureLimitsChangeResponse( &respRecord ); + return currentTreatmentState; } @@ -1289,14 +1298,16 @@ // Check if we are in treatment mode for settings change if ( MODE_TREA == currMode ) { - U32 dialVolume = dialRate * ( (U32)( (F32)presTreatmentTimeSecs / (F32)SEC_PER_MIN ) + 1 ); // In mL + F32 dialVolumeSoFar = (F32)( getTreatmentAvgDialysateFlowRate() * ( treatmentTimeMS / TREATMENT_PERIODIC_DATA_LOG_INTERVAL ) ) / (F32)( SEC_PER_MIN ); + F32 dialVolumeNowToEnd = (F32)( dialRate * CALC_TREAT_TIME_REMAINING_IN_SECS() ) / (F32)( SEC_PER_MIN ); + F32 dialVolume = dialVolumeSoFar + dialVolumeNowToEnd; // mL // Validate new rates if ( ( bloodRate >= getU32TreatmentParamLowerRangeLimit( TREATMENT_PARAM_BLOOD_FLOW ) ) && ( bloodRate <= getU32TreatmentParamUpperRangeLimit( TREATMENT_PARAM_BLOOD_FLOW ) ) && ( dialRate >= getU32TreatmentParamLowerRangeLimit( TREATMENT_PARAM_DIALYSATE_FLOW ) ) && ( dialRate <= getU32TreatmentParamUpperRangeLimit( TREATMENT_PARAM_DIALYSATE_FLOW ) ) && - ( dialVolume <= MAX_DIALYSATE_VOLUME_ML ) ) + ( dialVolume <= (F32)MAX_DIALYSATE_VOLUME_ML ) ) { result = TRUE; // handle blood pump flow rate change @@ -1504,25 +1515,28 @@ { if ( ++treatmentParamsRangesBroadcastTimerCtr >= getU32OverrideValue( &treatmentParamRangesPublishInterval ) ) { + // Compute values need to assess max dialysate rate with respect to 150L limit. + F32 dialVolumeSoFar = (F32)( getTreatmentAvgDialysateFlowRate() * ( treatmentTimeMS / TREATMENT_PERIODIC_DATA_LOG_INTERVAL ) ) / (F32)( SEC_PER_MIN ); + F32 maxQd = ( (F32)MAX_DIALYSATE_VOLUME_ML - dialVolumeSoFar ) / ( (F32)CALC_TREAT_TIME_REMAINING_IN_SECS() / (F32)SEC_PER_MIN ); // Compute minimum treatment duration U32 presTime = ( presTreatmentTimeSecs / SEC_PER_MIN ); U32 elapseTime = CALC_ELAPSED_TREAT_TIME_IN_MIN(); U32 minTime = MAX( (elapseTime + 2), getMinTreatmentTimeInMinutes() ); // Treatment duration cannot be < 1 hour. add two minutes to cover rounding and ensure it is valid for next minute // Compute maximum treatment duration (from both UF and dialysate volume perspectives) - U32 maxTimeRem = ( MAX_UF_VOLUME_ML - (U32)getUltrafiltrationReferenceVolume() ) / ( presUFRate > 0.0 ? (U32)presUFRate : 1 ); + U32 maxTimeRem = ( MAX_UF_VOLUME_ML - (U32)getUltrafiltrationReferenceVolume() ) / ( presUFRate > 0.0F ? (U32)presUFRate : 1 ); U32 maxTime1 = minTime + maxTimeRem; U32 maxTime2 = MAX_DIALYSATE_VOLUME_ML / getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); U32 maxTime = MAX( maxTime1, maxTime2 ); // Compute minimum UF volume F32 minUFVol = getUltrafiltrationReferenceVolume() + presUFRate; // Compute maximum UF volume (considering from adjustment of UF rate and time perspectives) F32 maxUFVol1 = minUFVol + ( (F32)( presTime - elapseTime ) * MAX_UF_RATE_ML_MIN ); - F32 maxUFVol2 = ( presUFRate > 0.0 ? minUFVol + ( (F32)( MAX_TREATMENT_TIME_MINUTES - elapseTime - 1 ) * presUFRate ) : minUFVol ); + F32 maxUFVol2 = ( presUFRate > 0.0F ? minUFVol + ( (F32)( MAX_TREATMENT_TIME_MINUTES - elapseTime - 1 ) * presUFRate ) : minUFVol ); F32 maxUFVol = MAX( maxUFVol1, maxUFVol2 ); // Compute minimum dialysate flow rate U32 minDialRate = MIN_DIAL_IN_FLOW_RATE; // Compute maximum dialysate flow rate from max dialysate volume perspective - U32 maxDialRate = MAX_DIALYSATE_VOLUME_ML / presTime; + U32 maxDialRate = ( maxQd > (F32)MIN_DIAL_IN_FLOW_RATE ? (U32)((S32)maxQd) : minDialRate ); // Now ensure maximums do not exceed the literal maximums maxTime = MIN( maxTime, MAX_TREATMENT_TIME_MINUTES ); @@ -1552,17 +1566,20 @@ F32 const arterialPres = getFilteredArterialPressure(); F32 const venousPres = getFilteredVenousPressure(); + if ( ( TREATMENT_DIALYSIS_STATE == getTreatmentState() ) && ( getDialysisState() != DIALYSIS_SALINE_BOLUS_STATE ) ) + { + treatmentBloodFlowRateTotal_mL_min += getMeasuredBloodFlowRate(); + treatmentDialysateFlowRateTotal_mL_min += getMeasuredDialInFlowRate(); + treatmentDialysateTempTotal_degree_C += getDialysateTemperature(); + treatmentArterialPressureTotal_mmHg += arterialPres; + treatmentVenousPressureTotal_mmHg += venousPres; + } + lastTreatmentPeriodicDataCollectTimeStamp = treatmentTimeMS; bloodFlowRateSum_mL_min += getMeasuredBloodFlowRate(); dialysateFlowRateSum_mL_min += getMeasuredDialInFlowRate(); arterialPressureSum_mmHg += arterialPres; venousPressureSum_mmHg += venousPres; - - treatmentBloodFlowRateTotal_mL_min += getMeasuredBloodFlowRate(); - treatmentDialysateFlowRateTotal_mL_min += getMeasuredDialInFlowRate(); - treatmentDialysateTempTotal_degree_C += getDialysateTemperature(); - treatmentArterialPressureTotal_mmHg += arterialPres; - treatmentVenousPressureTotal_mmHg += venousPres; } if ( ( timeElapsedSinceLastPublish_ms >= TREATMENT_PERIODIC_DATA_PUB_INTERVAL ) || ( TRUE == sendLastTreatmentPeriodicData ) )