Index: firmware/App/Modes/ModeTreatmentParams.c =================================================================== diff -u -r709def41bcde8e2e59d83c5e9c5a06ab0ee74ec8 -rcd5be724d5a3ba7457e761191d82f278654d7f5c --- firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision 709def41bcde8e2e59d83c5e9c5a06ab0ee74ec8) +++ firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision cd5be724d5a3ba7457e761191d82f278654d7f5c) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2020-2023 Diality Inc. - All Rights Reserved. +* Copyright (c) 2020-2024 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file ModeTreatmentParams.c * -* @author (last) Sean Nash -* @date (last) 15-Mar-2023 +* @author (last) Darren Cox +* @date (last) 12-Jun-2023 * * @author (original) Sean Nash * @date (original) 29-May-2020 @@ -37,9 +37,12 @@ // ********** private definitions ********** #define MAX_DIALYSATE_VOLUME_ML ( 150 * ML_PER_LITER ) ///< Maximum dialysate volume (in mL) +#define MAX_HEPARIN_VOLUME_ML 10 ///< Maximum heparin volume ( in mL ) #define NO_HEPARIN_PRE_STOP_TIME_SET 0 ///< Zero value indicates no Heparin pre-stop time was set by user +#define NO_HEPARIN_TYPE_SET 0xFFFFFFFF ///< UI will send this value for Heparin type if Heparin not used + /// Record for range and default of treatment parameters. typedef struct { @@ -66,11 +69,10 @@ { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=5}, {.uInt=0} }, // TREATMENT_PARAM_DIALYZER_TYPE { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=0}, {.uInt=0} }, // TREATMENT_PARAM_HEPARIN_TYPE { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=60}, {.uInt=30} }, // TREATMENT_PARAM_BP_MEAS_INTERVAL - { CRITICAL_DATA_TYPE_U32, {.uInt=50}, {.uInt=150}, {.uInt=75} }, // TREATMENT_PARAM_RINSEBACK_FLOW_RATE - { CRITICAL_DATA_TYPE_S32, {.sInt=-300}, {.sInt=70}, {.sInt=-300} }, // TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT - { CRITICAL_DATA_TYPE_S32, {.sInt=-270}, {.sInt=100}, {.sInt=100} }, // TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT - { CRITICAL_DATA_TYPE_S32, {.sInt=20}, {.sInt=270}, {.sInt=20} }, // TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT - { CRITICAL_DATA_TYPE_S32, {.sInt=50}, {.sInt=300}, {.sInt=300} }, // TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT + { CRITICAL_DATA_TYPE_U32, {.uInt=100}, {.uInt=300}, {.uInt=200} }, // TREATMENT_PARAM_RINSEBACK_FLOW_RATE + { CRITICAL_DATA_TYPE_S32, {.sInt=120}, {.sInt=200}, {.sInt=120} }, // TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW + { CRITICAL_DATA_TYPE_S32, {.sInt=100}, {.sInt=200}, {.sInt=100} }, // TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW + { CRITICAL_DATA_TYPE_S32, {.sInt=20}, {.sInt=35}, {.sInt=20} }, // TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC { CRITICAL_DATA_TYPE_F32, {.sFlt=0.0}, {.sFlt=1.0}, {.sFlt=0.0} }, // TREATMENT_PARAM_HEPARIN_DISPENSE_RATE { CRITICAL_DATA_TYPE_F32, {.sFlt=0.0}, {.sFlt=2.0}, {.sFlt=0.0} }, // TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME { CRITICAL_DATA_TYPE_F32, {.sFlt=35.0}, {.sFlt=37.0}, {.sFlt=37.0} }, // TREATMENT_PARAM_DIALYSATE_TEMPERATURE @@ -129,14 +131,13 @@ // Reset treatment initTreatmentMode(); initDialysis(); - + setCurrentSubState( NO_SUB_STATE ); validTreatParamsReceived = FALSE; treatParamsConfirmed = FALSE; treatParamsRejected = FALSE; treatmentCancelled = FALSE; setTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME, 0.0 ); - // Set user alarm recovery actions allowed in this mode setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, FALSE ); @@ -180,10 +181,9 @@ origTreatmentParams.bloodFlowRate_mL_min = 0; origTreatmentParams.dialysateFlowRate_mL_min = 0; origTreatmentParams.treatmentDuration_min = 0; - origTreatmentParams.arterialPressureLowLimit_mmHg = 0; - origTreatmentParams.arterialPressureHighLimit_mmHg = 0; - origTreatmentParams.venousPressureLowLimit_mmHg = 0; - origTreatmentParams.venousPressureHighLimit_mmHg = 0; + origTreatmentParams.arterialPressureLimitWindow_mmHg = 0; + origTreatmentParams.venousPressureLimitWindow_mmHg = 0; + origTreatmentParams.venousPressureLimitAsymmetric_mmHg = 0; origTreatmentParams.uFVolume_L = 0.0; } @@ -305,7 +305,7 @@ if ( priorSubState != currentTreatmentParamsState ) { - SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentTreatmentParamsState ); + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_MODE_CHANGE, priorSubState, currentTreatmentParamsState ); } return (U32)currentTreatmentParamsState; @@ -367,10 +367,9 @@ origTreatmentParams.bloodFlowRate_mL_min = getCriticalData( &treatmentParameters[ TREATMENT_PARAM_BLOOD_FLOW ] ).uInt; origTreatmentParams.dialysateFlowRate_mL_min = getCriticalData( &treatmentParameters[ TREATMENT_PARAM_DIALYSATE_FLOW ] ).uInt; origTreatmentParams.treatmentDuration_min = getCriticalData( &treatmentParameters[ TREATMENT_PARAM_TREATMENT_DURATION ] ).uInt; - origTreatmentParams.arterialPressureLowLimit_mmHg = getCriticalData( &treatmentParameters[ TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT ] ).sInt; - origTreatmentParams.arterialPressureHighLimit_mmHg = getCriticalData( &treatmentParameters[ TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT ] ).sInt; - origTreatmentParams.venousPressureLowLimit_mmHg = getCriticalData( &treatmentParameters[ TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT ] ).sInt; - origTreatmentParams.venousPressureHighLimit_mmHg = getCriticalData( &treatmentParameters[ TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT ] ).sInt; + origTreatmentParams.arterialPressureLimitWindow_mmHg = getCriticalData( &treatmentParameters[ TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ] ).sInt; + origTreatmentParams.venousPressureLimitWindow_mmHg = getCriticalData( &treatmentParameters[ TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ] ).sInt; + origTreatmentParams.venousPressureLimitAsymmetric_mmHg = getCriticalData( &treatmentParameters[ TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ] ).sInt; // If using Heparin in this treatment, set state to stopped otherwise off if ( ( stagedParams[ TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ].sFlt > 0.0 ) || ( stagedParams[ TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ].sFlt > 0.0 ) ) @@ -382,6 +381,9 @@ setHeparinOff(); } + // initialize pressure limit settings in pressure driver + setPressureLimitsToOuterBounds(); + // Go to pre-treatment mode requestNewOperationMode( MODE_PRET ); @@ -424,11 +426,11 @@ if ( TRUE == accepted ) { + U32 treatmentDuration = getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); + // store the user set ultrafiltration volume in pre-treatment parameters setup, if it is validated, otherwise keep the initial 0.0 origTreatmentParams.uFVolume_L = uFVolumeL; - U32 treatmentDuration = getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); - if ( treatmentDuration > 0 ) { F32 uFRate = uFVolumeMl / (F32)treatmentDuration; @@ -454,6 +456,7 @@ uFVolumeL = getTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME ); uFVolumeMl = uFVolumeL * (F32)ML_PER_LITER; sendUFVolumeSetResponseMsg( accepted, rejReason, uFVolumeMl ); + setUserSetUFVolumeStatus( accepted ); return accepted; } @@ -473,6 +476,12 @@ BOOL paramsAreInRange, paramsAreConsistent; U32 rejReasons[ NUM_OF_TREATMENT_PARAMS ]; + // Special handling of Heparin Type - UI may send as -1 if Heparin not used - if so, confirm Heparin params not set and bring type into range before range check + if ( ( NO_HEPARIN_TYPE_SET == params.heparinType ) && ( params.heparinBolusVolume_mL < NEARLY_ZERO ) && ( params.heparinDispenseRate_mL_hr < NEARLY_ZERO ) ) + { + params.heparinType = 0; + } + // Extract treatment parameters from given payload to staging array so we can more easily work with them extractTreatmentParamsFromPayload( params ); @@ -552,10 +561,9 @@ BOOL result = TRUE; U32 dialysateVolume_mL = stagedParams[ TREATMENT_PARAM_DIALYSATE_FLOW ].uInt * \ stagedParams[ TREATMENT_PARAM_TREATMENT_DURATION ].uInt; - S32 arterialPresLimitDelta = stagedParams[ TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT ].sInt - \ - stagedParams[ TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT ].sInt; - S32 venousPresLimitDelta = stagedParams[ TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT ].sInt - \ - stagedParams[ TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT ].sInt; + F32 heparinVolume_mL = ( stagedParams[ TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ].sFlt * \ + ( (F32)( stagedParams[ TREATMENT_PARAM_TREATMENT_DURATION ].uInt - stagedParams[ TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME ].uInt ) / MIN_PER_HOUR ) ) + \ + stagedParams[ TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ].sFlt + SYRINGE_PUMP_PRIME_VOLUME_ML + SYRINGE_PUMP_FILL_VOLUME_OFFSET_ML; // Check max dialysate volume dependency if ( dialysateVolume_mL > MAX_DIALYSATE_VOLUME_ML ) @@ -581,22 +589,13 @@ result = FALSE; } - // Check arterial alarm limits dependency - if ( arterialPresLimitDelta < MIN_PRESSURE_ALARM_LIMIT_DELTA_MMHG ) + // Check max heparin volume dependency + if (heparinVolume_mL > MAX_HEPARIN_VOLUME_ML ) { - reasons[ TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT ] = REQUEST_REJECT_REASON_ARTERIAL_PRESSURE_LOW_VS_HIGH; - reasons[ TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT ] = REQUEST_REJECT_REASON_ARTERIAL_PRESSURE_LOW_VS_HIGH; + reasons[ TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME ] = REQUEST_REJECT_REASON_EXCEEDS_MAXIMUM_HEPARIN_VOLUME; result = FALSE; } - // Check venous alarm limits dependency - if ( venousPresLimitDelta < MIN_PRESSURE_ALARM_LIMIT_DELTA_MMHG ) - { - reasons[ TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT ] = REQUEST_REJECT_REASON_VENOUS_PRESSURE_LOW_VS_HIGH; - reasons[ TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT ] = REQUEST_REJECT_REASON_VENOUS_PRESSURE_LOW_VS_HIGH; - result = FALSE; - } - return result; } @@ -998,29 +997,28 @@ if ( TRUE == isTestingActivated() ) { // Test one parameter for set since all parameters are set after parameter validation. - if(TRUE == isCriticalDataSet( &treatmentParameters[TREATMENT_PARAM_BLOOD_FLOW] )) + if ( TRUE == isCriticalDataSet( &treatmentParameters[ TREATMENT_PARAM_BLOOD_FLOW ] ) ) { result = TRUE; current_treatment_params.accepted = TRUE; - current_treatment_params.treatment_parameters.bloodFlowRate_mL_min = getTreatmentParameterU32(TREATMENT_PARAM_BLOOD_FLOW); - current_treatment_params.treatment_parameters.dialysateFlowRate_mL_min = getTreatmentParameterU32(TREATMENT_PARAM_DIALYSATE_FLOW); - current_treatment_params.treatment_parameters.treatmentDuration_min = getTreatmentParameterU32(TREATMENT_PARAM_TREATMENT_DURATION); - current_treatment_params.treatment_parameters.heparinPreStop_min = getTreatmentParameterU32(TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME); - current_treatment_params.treatment_parameters.salineBolusVolume_mL = getTreatmentParameterU32(TREATMENT_PARAM_SALINE_BOLUS_VOLUME); - current_treatment_params.treatment_parameters.acidConcentrate = getTreatmentParameterU32(TREATMENT_PARAM_ACID_CONCENTRATE); - current_treatment_params.treatment_parameters.bicarbConcentrate = getTreatmentParameterU32(TREATMENT_PARAM_BICARB_CONCENTRATE); - current_treatment_params.treatment_parameters.dialyzerType = getTreatmentParameterU32(TREATMENT_PARAM_DIALYZER_TYPE); - current_treatment_params.treatment_parameters.heparinType = getTreatmentParameterU32(TREATMENT_PARAM_HEPARIN_TYPE); - current_treatment_params.treatment_parameters.bloodPressureMeasurementInterval_min = getTreatmentParameterU32(TREATMENT_PARAM_BP_MEAS_INTERVAL); - current_treatment_params.treatment_parameters.rinsebackFlowRate_mL_min = getTreatmentParameterU32(TREATMENT_PARAM_RINSEBACK_FLOW_RATE); - current_treatment_params.treatment_parameters.arterialPressureLowLimit_mmHg = getTreatmentParameterS32(TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT); - current_treatment_params.treatment_parameters.arterialPressureHighLimit_mmHg = getTreatmentParameterS32(TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT); - current_treatment_params.treatment_parameters.venousPressureLowLimit_mmHg = getTreatmentParameterS32(TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT); - current_treatment_params.treatment_parameters.venousPressureHighLimit_mmHg = getTreatmentParameterS32(TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT); - current_treatment_params.treatment_parameters.heparinDispenseRate_mL_hr = getTreatmentParameterF32(TREATMENT_PARAM_HEPARIN_DISPENSE_RATE); - current_treatment_params.treatment_parameters.heparinBolusVolume_mL = getTreatmentParameterF32(TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME); - current_treatment_params.treatment_parameters.dialysateTemperature_degC = getTreatmentParameterF32(TREATMENT_PARAM_DIALYSATE_TEMPERATURE); - current_treatment_params.uFVolume_L = getTreatmentParameterF32(TREATMENT_PARAM_UF_VOLUME); + current_treatment_params.treatment_parameters.bloodFlowRate_mL_min = getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ); + current_treatment_params.treatment_parameters.dialysateFlowRate_mL_min = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); + current_treatment_params.treatment_parameters.treatmentDuration_min = getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); + current_treatment_params.treatment_parameters.heparinPreStop_min = getTreatmentParameterU32( TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME ); + current_treatment_params.treatment_parameters.salineBolusVolume_mL = getTreatmentParameterU32( TREATMENT_PARAM_SALINE_BOLUS_VOLUME ); + current_treatment_params.treatment_parameters.acidConcentrate = getTreatmentParameterU32( TREATMENT_PARAM_ACID_CONCENTRATE ); + current_treatment_params.treatment_parameters.bicarbConcentrate = getTreatmentParameterU32( TREATMENT_PARAM_BICARB_CONCENTRATE ); + current_treatment_params.treatment_parameters.dialyzerType = getTreatmentParameterU32( TREATMENT_PARAM_DIALYZER_TYPE ); + current_treatment_params.treatment_parameters.heparinType = getTreatmentParameterU32( TREATMENT_PARAM_HEPARIN_TYPE ); + current_treatment_params.treatment_parameters.bloodPressureMeasurementInterval_min = getTreatmentParameterU32( TREATMENT_PARAM_BP_MEAS_INTERVAL ); + current_treatment_params.treatment_parameters.rinsebackFlowRate_mL_min = getTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ); + current_treatment_params.treatment_parameters.arterialPressureLimitWindow_mmHg = getTreatmentParameterS32( TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ); + current_treatment_params.treatment_parameters.venousPressureLimitWindow_mmHg = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ); + current_treatment_params.treatment_parameters.venousPressureLimitAsymmetric_mmHg = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ); + current_treatment_params.treatment_parameters.heparinDispenseRate_mL_hr = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ); + current_treatment_params.treatment_parameters.heparinBolusVolume_mL = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); + current_treatment_params.treatment_parameters.dialysateTemperature_degC = getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ); + current_treatment_params.uFVolume_L = getTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME ); } else { @@ -1036,17 +1034,17 @@ current_treatment_params.treatment_parameters.heparinType = 0; current_treatment_params.treatment_parameters.bloodPressureMeasurementInterval_min = 0; current_treatment_params.treatment_parameters.rinsebackFlowRate_mL_min = 0; - current_treatment_params.treatment_parameters.arterialPressureLowLimit_mmHg = 0; - current_treatment_params.treatment_parameters.arterialPressureHighLimit_mmHg = 0; - current_treatment_params.treatment_parameters.venousPressureLowLimit_mmHg = 0; - current_treatment_params.treatment_parameters.venousPressureHighLimit_mmHg = 0; - current_treatment_params.treatment_parameters.heparinDispenseRate_mL_hr = 0; - current_treatment_params.treatment_parameters.heparinBolusVolume_mL = 0; - current_treatment_params.treatment_parameters.dialysateTemperature_degC = 0; - current_treatment_params.uFVolume_L = 0; + current_treatment_params.treatment_parameters.arterialPressureLimitWindow_mmHg = 0; + current_treatment_params.treatment_parameters.venousPressureLimitWindow_mmHg = 0; + current_treatment_params.treatment_parameters.venousPressureLimitAsymmetric_mmHg = 0; + current_treatment_params.treatment_parameters.heparinDispenseRate_mL_hr = 0.0F; + current_treatment_params.treatment_parameters.heparinBolusVolume_mL = 0.0F; + current_treatment_params.treatment_parameters.dialysateTemperature_degC = 0.0F; + current_treatment_params.uFVolume_L = 0.0F; } sendTestCurrentTreatmentParametersResponse(current_treatment_params); } + return result; }