Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r2c8547abb99803d8e09918db0e4c66d45c9a15ad -r6e3cc2783dd177a3e53589fcc73ff56f05da20d9 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 2c8547abb99803d8e09918db0e4c66d45c9a15ad) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 6e3cc2783dd177a3e53589fcc73ff56f05da20d9) @@ -20,6 +20,7 @@ #include "AlarmMgmt.h" #include "BloodFlow.h" #include "FPGA.h" +#include "ModeTreatment.h" #include "ModeTreatmentParams.h" #include "NVDataMgmt.h" #include "OperationModes.h" @@ -146,6 +147,7 @@ static OVERRIDE_F32_T arterialPressure = {0.0, 0.0, 0.0, 0 }; ///< Measured arterial pressure. static OVERRIDE_F32_T venousPressure = {0.0, 0.0, 0.0, 0 }; ///< Measured venous pressure. static OVERRIDE_U32_T bloodPumpOcclusion = {0, 0, 0, 0 }; ///< Measured blood pump occlusion pressure. +static PRESSURE_LIMITS_STATES_T currPresLimitsState; ///< Current pressure limits state. static S32 stableArterialPressure; ///< Arterial pressure that limit window is based on (in mmHg). static S32 stableVenousPressure; ///< Venous pressure that limit window is based on (in mmHg). static S32 currentArterialMaxLimit; ///< Maximum arterial pressure limit (in mmHg). @@ -189,6 +191,7 @@ static void checkVenousPressureInRange( void ); static void checkOcclusions( void ); static void publishPresOcclData( void ); +static void determineArtVenPressureLimits( void ); static void filterInlinePressureReadings( F32 artPres, F32 venPres ); /*********************************************************************//** @@ -218,12 +221,11 @@ initFPGAPersistentAlarm( FPGA_PERS_ERROR_VENOUS_PRESSURE_SESNOR, ALARM_ID_HD_VENOUS_SENSOR_FPGA_FAULT, PRES_SENSORS_FPGA_ERROR_TIMEOUT_MS, PRES_SENSORS_FPGA_ERROR_TIMEOUT_MS ); + setPressureLimitsToOuterBounds(); + + currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION; stableArterialPressure = 0; stableVenousPressure = 0; - currentArterialMaxLimit = 0; - currentArterialMinLimit = 0; - currentVenousMaxLimit = 0; - currentVenousMinLimit = 0; longFilteredArterialPressure = 0.0F; shortFilteredArterialPressure = 0.0F; shortFilteredVenousPressure = 0.0F; @@ -333,6 +335,80 @@ venPressureLimitDelayStart = getMSTimerCount(); } +/*********************************************************************//** + * @brief + * The setPressureLimitsToOuterBounds function sets the min/max pressure + * limits for arterial and venous pressure to their outer boundaries. + * @details Inputs: none + * @details Outputs: currentArterialMaxLimit, currentArterialMinLimit, + * currentVenousMaxLimit, currentVenousMinLimit + * @return none + *************************************************************************/ +void setPressureLimitsToOuterBounds( void ) +{ + currentArterialMaxLimit = (S32)ARTERIAL_PRESSURE_LIMIT_MAX_MMHG; + currentArterialMinLimit = (S32)ARTERIAL_PRESSURE_LIMIT_MIN_MMHG; + currentVenousMaxLimit = (S32)VENOUS_PRESSURE_LIMIT_MAX_MMHG; + currentVenousMinLimit = (S32)VENOUS_PRESSURE_LIMIT_MIN_MMHG; +} + +/*********************************************************************//** + * @brief + * The updatePressureLimitWindows function updates the pressure limit + * stable pressure levels when windows set/changed by user. + * If treatment in progress, windowed limits around new stable pressures + * will be in effect immediately (next monitor pass). If treatment paused, + * resume will start a new stabilization period ending in another set of + * stable pressures before windowed limits recalculated. + * @details Inputs: none + * @details Outputs: stableArterialPressure, stableVenousPressure, + * currPresLimitsState + * @param artPresWin new arterial pressure limit window setting + * @param venPresWin new venous pressure limit window setting + * @param venPresAsym new venous pressure limit asymmetric setting + * @return none + *************************************************************************/ +void updatePressureLimitWindows( S32 artPresWin, S32 venPresWin, S32 venPresAsym ) +{ + F32 filtArt = getFilteredArterialPressure(); + F32 filtVen = getFilteredVenousPressure(); + S32 curArtPres = FLOAT_TO_INT_WITH_ROUND( filtArt ); + S32 curVenPres = FLOAT_TO_INT_WITH_ROUND( filtVen ); + + stableArterialPressure = curArtPres; + stableVenousPressure = curVenPres; + // User update of pressure window(s) initiates a stabilization period + currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION; +} + +/*********************************************************************//** + * @brief + * The determineArtVenPressureLimits function determines current pressure + * limits based on whether we are in stabilization or stable situation. + * @details Inputs: currPresLimitsState + * @details Outputs: currentArterialMaxLimit, currentArterialMinLimit, + * currentVenousMaxLimit, currentVenousMinLimit + * @return none + *************************************************************************/ +static void determineArtVenPressureLimits( void ) +{ + S32 artOffset = getTreatmentParameterS32( TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ) / 2; // Arterial is symmetric + S32 venMinOffset = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ); // Venous is asymmetric + S32 venMaxOffset = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ) - venMinOffset; + + if ( PRESSURE_LIMITS_STATE_STABLE == currPresLimitsState ) + { // apply pressure windows when stable + currentArterialMaxLimit = stableArterialPressure + artOffset; + currentArterialMinLimit = stableArterialPressure - artOffset; + currentVenousMaxLimit = stableVenousPressure + venMaxOffset; + currentVenousMinLimit = stableVenousPressure - venMinOffset; + } + else + { // apply outer limits when stabilizing + setPressureLimitsToOuterBounds(); + } +} + /*********************************************************************//** * @brief * The execPresOccl function executes the pressure and occlusion monitor. @@ -400,6 +476,9 @@ // Read latest occlusion pressures convertOcclusionPressures(); + // Set arterial/venous pressure limits according to current pressure limits state + determineArtVenPressureLimits(); + // Check in-line pressures are in range checkArterialPressureInRange(); checkVenousPressureInRange(); @@ -879,8 +958,12 @@ PRESSURE_OCCLUSION_DATA_T data; data.arterialPressure = shortFilteredArterialPressure; - data.venousPressure = shortFilteredVenousPressure; - data.bldPumpOcclusion = getMeasuredBloodPumpOcclusion(); + data.venousPressure = shortFilteredVenousPressure; + data.bldPumpOcclusion = getMeasuredBloodPumpOcclusion(); + data.artMinLimit = currentArterialMinLimit; + data.artMaxLimit = currentArterialMaxLimit; + data.venMinLimit = currentVenousMinLimit; + data.venMaxLimit = currentVenousMaxLimit; broadcastData( MSG_ID_PRESSURE_OCCLUSION_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( PRESSURE_OCCLUSION_DATA_T ) ); presOcclDataPublicationTimerCounter = 0; Index: firmware/App/Controllers/PresOccl.h =================================================================== diff -u -r14d740bbb065f043daaa348bcda5f447e1c16a32 -r6e3cc2783dd177a3e53589fcc73ff56f05da20d9 --- firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 14d740bbb065f043daaa348bcda5f447e1c16a32) +++ firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 6e3cc2783dd177a3e53589fcc73ff56f05da20d9) @@ -47,14 +47,27 @@ OCCLUSION_SENSOR_DIAL_IN_PUMP, ///< Dialysate inlet pump occlusion sensor OCCLUSION_SENSOR_DIAL_OUT_PUMP, ///< Dialysate outlet pump occlusion sensor NUM_OF_OCCLUSION_SENSORS ///< Number of occlusion sensors -} OCCLUSION_SENSORS_T; +} OCCLUSION_SENSORS_T; + +/// Enumeration of arterial/venous pressure limits states. +typedef enum PressureLimitsStates +{ + PRESSURE_LIMITS_STATE_STABILIZATION = 0,///< Stabilization state + PRESSURE_LIMITS_STATE_STABLE, ///< Stable state + NUM_OF_PRESSURE_LIMITS_STATES +} PRESSURE_LIMITS_STATES_T; /// Payload record structure for the pressure & occlusions data message. typedef struct { F32 arterialPressure; ///< Latest arterial pressure (mmHg) F32 venousPressure; ///< Latest venous pressure (mmHg) U32 bldPumpOcclusion; ///< Latest BP occlusion (no units) + U32 presLimitState; ///< Current pressure limits state (enum-stabilization or stable) + S32 artMinLimit; ///< Current arterial minimum pressure limit (mmHg) + S32 artMaxLimit; ///< Current arterial maximum pressure limit (mmHg) + S32 venMinLimit; ///< Current venous minimum pressure limit (mmHg) + S32 venMaxLimit; ///< Current venous maximum pressure limit (mmHg) } PRESSURE_OCCLUSION_DATA_T; // ********** public function prototypes ********** @@ -64,7 +77,10 @@ void execPresOcclTest( void ); SELF_TEST_STATUS_T execPresOcclDryTest( void ); -SELF_TEST_STATUS_T execPresOcclSelfTest( void ); +SELF_TEST_STATUS_T execPresOcclSelfTest( void ); + +void setPressureLimitsToOuterBounds( void ); +void updatePressureLimitWindows( S32 artPresWin, S32 venPresWin, S32 venPresAsym ); F32 getMeasuredArterialPressure( void ); F32 getFilteredArterialPressure( void ); Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r2c8547abb99803d8e09918db0e4c66d45c9a15ad -r6e3cc2783dd177a3e53589fcc73ff56f05da20d9 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 2c8547abb99803d8e09918db0e4c66d45c9a15ad) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 6e3cc2783dd177a3e53589fcc73ff56f05da20d9) @@ -1367,6 +1367,9 @@ { sendTreatmentLogEventData( VENOUS_PRESSURE_LIMIT_ASYM_CHANGE_EVENT, (F32)venLimitAsymmetric, (F32)data->venPresLimitAsymmetricmmHg ); } + + // Update pressure driver with new settings - will apply windows to current pressures + updatePressureLimitWindows( data->artPresLimitWindowmmHg, data->venPresLimitWindowmmHg, data->venPresLimitAsymmetricmmHg ); } // Read back limits for transmit to UI. Index: firmware/App/Modes/ModeTreatment.h =================================================================== diff -u -r2c8547abb99803d8e09918db0e4c66d45c9a15ad -r6e3cc2783dd177a3e53589fcc73ff56f05da20d9 --- firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 2c8547abb99803d8e09918db0e4c66d45c9a15ad) +++ firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 6e3cc2783dd177a3e53589fcc73ff56f05da20d9) @@ -77,9 +77,9 @@ { BOOL accepted; U32 rejReasonCode; - S32 artPresLimitWindowmmHg; - S32 venPresLimitWindowmmHg; - S32 venPresLimitAsymmetricmmHg; + S32 artPresLimitWindowmmHg; + S32 venPresLimitWindowmmHg; + S32 venPresLimitAsymmetricmmHg; } PRESSURE_LIMIT_CHANGE_RESPONSE_T; /// Payload record structure for the treatment log 30 minutes periodic data. Index: firmware/App/Modes/ModeTreatmentParams.c =================================================================== diff -u -r2c8547abb99803d8e09918db0e4c66d45c9a15ad -r6e3cc2783dd177a3e53589fcc73ff56f05da20d9 --- firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision 2c8547abb99803d8e09918db0e4c66d45c9a15ad) +++ firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision 6e3cc2783dd177a3e53589fcc73ff56f05da20d9) @@ -68,9 +68,9 @@ { 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=100}, {.sInt=200}, {.sInt=100} }, // TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW + { 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=30}, {.sInt=20} }, // TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC + { 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 @@ -378,6 +378,9 @@ setHeparinOff(); } + // initialize pressure limit settings in pressure driver + setPressureLimitsToOuterBounds(); + // Go to pre-treatment mode requestNewOperationMode( MODE_PRET );