Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r68dad5186cd45c433b81525a09957b9f8dc8d94e -rcd5be724d5a3ba7457e761191d82f278654d7f5c --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 68dad5186cd45c433b81525a09957b9f8dc8d94e) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.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 PresOccl.c * * @author (last) Darren Cox -* @date (last) 24-Aug-2023 +* @date (last) 08-Sep-2023 * * @author (original) Sean * @date (original) 15-Jan-2020 @@ -43,7 +43,7 @@ #define PRES_OCCL_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the pressure/occlusion data is published on the CAN bus. #define PRES_LIMIT_STABILIZATION_TIME_MS ( 60 * MS_PER_SECOND ) ///< Duration of pressure limit stabilization period (in ms). -#define PRES_LIMIT_SHORT_STABILIZE_TIME_MS ( 5 * MS_PER_SECOND ) ///< Duration of pressure limit short stabilization period (in ms). +#define PRES_LIMIT_SHORT_STABILIZE_TIME_MS ( 10 * MS_PER_SECOND ) ///< Duration of pressure limit short stabilization period (in ms). #define PRES_LIMIT_RESTABILIZE_TIME_MS ( 30 * SEC_PER_MIN * MS_PER_SECOND ) ///< Duration of pressure limit re-stabilize period (in ms). #define ARTERIAL_PRESSURE_CONVERSION_OFFSET 0x800000 ///< Arterial pressure conversion coefficient. @@ -169,9 +169,9 @@ static BOOL pressureLimitsActive; ///< Flag indicates whether arterial and venous pressure alarm limits are active. static U32 stabilizationStartTimeMs; ///< Timestamp taken when pressure limit stabilization began (ms). static F32 longFilteredArterialPressure; ///< Measured arterial pressure after long (10 s) filter. -static F32 shortFilteredArterialPressure; ///< Measured arterial pressure after short (1 s) filter. +static OVERRIDE_F32_T shortFilteredArterialPressure = { 0.0, 0.0, 0.0, 0 }; ///< Measured arterial pressure after short (1 s) filter. static F32 longFilteredVenousPressure; ///< Measured venous pressure after long (10 s) filter. -static F32 shortFilteredVenousPressure; ///< Measured venous pressure after short (1 s) filter. +static OVERRIDE_F32_T shortFilteredVenousPressure = { 0.0, 0.0, 0.0, 0 }; ///< Measured venous pressure after short (1 s) filter. static BOOL useShortStabilizeTime; ///< Flag to use short stabilize time. static U32 bloodPumpOcclusionAfterCartridgeInstall; ///< Measured blood pump occlusion reading taken after cartridge install. @@ -253,9 +253,9 @@ venLowPresExemptAfterAirTrapFillTimerCtr = 0; resetArtVenPressureOffsets(); longFilteredArterialPressure = 0.0F; - shortFilteredArterialPressure = 0.0F; + shortFilteredArterialPressure.data = 0.0F; longFilteredVenousPressure = 0.0F; - shortFilteredVenousPressure = 0.0F; + shortFilteredVenousPressure.data = 0.0F; presOcclDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; presOcclState = PRESSURE_WAIT_FOR_POST_STATE; presOcclPostState = PRESSURE_SELF_TEST_STATE_START; @@ -904,6 +904,7 @@ HD_OP_MODE_T hdMode = getCurrentOperationMode(); U32 hdSubMode = getCurrentSubMode(); BOOL ptxMode = ( MODE_PRET == hdMode && hdSubMode > HD_PRE_TREATMENT_CART_INSTALL_STATE ? TRUE : FALSE ); + BOOL txModeRecirc = ( ( MODE_TREA == hdMode ) && ( TREATMENT_RECIRC_STATE == getTreatmentState() ) ? TRUE : FALSE ); // Range check occlusion sensor (OB) if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BP_OCCLUSION_OUT_OF_RANGE, outOfRange ) ) @@ -913,7 +914,7 @@ // Check for occlusion in PreTreatment modes when the cartridge is installed // and setOcclusionInstallLevel has been called. - if ( MODE_PRET == getCurrentOperationMode() ) + if ( MODE_PRET == hdMode ) { if ( ( TRUE == isBloodPumpRunning() ) && ( getPreTreatmentSubState() > HD_PRE_TREATMENT_CART_INSTALL_STATE ) && ( getDrySelfTestsState() > DRY_SELF_TESTS_START_STATE ) ) @@ -928,7 +929,7 @@ } // Check for occlusion in Treatment modes where pumps are moving - else if ( MODE_TREA == getCurrentOperationMode() ) + else if ( MODE_TREA == hdMode ) { if ( TRUE == isBloodPumpRunning() ) { @@ -953,8 +954,9 @@ #endif { // only trigger alarm if BP is running if ( isBloodPumpRunning() != FALSE ) - { // must be in pre-treatment mode to trigger this alarm - if ( ( TRUE == ptxMode ) && ( venPres > VENOUS_PRESSURE_LIMIT_MAX_MMHG + VENOUS_PRESSURE_OCCL_OFFSET_MMHG ) ) + { // must be in pre-treatment OR treatment recirculation mode to trigger this alarm + if ( ( ( TRUE == ptxMode ) || ( TRUE == txModeRecirc ) ) + && ( venPres > VENOUS_PRESSURE_LIMIT_MAX_MMHG + VENOUS_PRESSURE_OCCL_OFFSET_MMHG ) ) { if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_LINE_OCCLUSION, TRUE ) ) { @@ -1002,7 +1004,7 @@ *************************************************************************/ F32 getFilteredArterialPressure( void ) { - return shortFilteredArterialPressure; + return getF32OverrideValue( &shortFilteredArterialPressure ); } /*********************************************************************//** @@ -1045,7 +1047,7 @@ *************************************************************************/ F32 getFilteredVenousPressure( void ) { - return shortFilteredVenousPressure; + return getF32OverrideValue( &shortFilteredVenousPressure ); } /*********************************************************************//** @@ -1116,7 +1118,7 @@ artPressureReadingsShortTotal += artPres; artPressureReadingsShortIdx = INC_WRAP( artPressureReadingsShortIdx, 0, SIZE_OF_SHORT_ART_ROLLING_AVG - 1 ); artPressureReadingsShortCount = INC_CAP( artPressureReadingsShortCount, SIZE_OF_SHORT_ART_ROLLING_AVG ); - shortFilteredArterialPressure = artPressureReadingsShortTotal / (F32)artPressureReadingsShortCount; + shortFilteredArterialPressure.data = artPressureReadingsShortTotal / (F32)artPressureReadingsShortCount; // Long filter for venous pressure. if ( venPressureReadingsLongCount >= SIZE_OF_LONG_VEN_ROLLING_AVG ) @@ -1138,7 +1140,7 @@ venPressureReadingsShortTotal += venPres; venPressureReadingsShortIdx = INC_WRAP( venPressureReadingsShortIdx, 0, SIZE_OF_SHORT_VEN_ROLLING_AVG - 1 ); venPressureReadingsShortCount = INC_CAP( artPressureReadingsShortCount, SIZE_OF_SHORT_VEN_ROLLING_AVG ); - shortFilteredVenousPressure = venPressureReadingsShortTotal / (F32)venPressureReadingsShortCount; + shortFilteredVenousPressure.data = venPressureReadingsShortTotal / (F32)venPressureReadingsShortCount; } /*********************************************************************//** @@ -1156,8 +1158,8 @@ { PRESSURE_OCCLUSION_DATA_T data; - data.arterialPressure = shortFilteredArterialPressure; - data.venousPressure = shortFilteredVenousPressure; + data.arterialPressure = getFilteredArterialPressure(); + data.venousPressure = getFilteredVenousPressure(); data.bldPumpOcclusion = getMeasuredBloodPumpOcclusion(); data.presLimitState = currPresLimitsState; data.artMinLimit = currentArterialMinLimit; @@ -1324,19 +1326,28 @@ * The testSetArterialPressureOverride function overrides the measured arterial * pressure. * @details Inputs: none - * @details Outputs: arterialPressure + * @details Outputs: arterialPressure, shortFilteredArterialPressure * @param value override arterial pressure (in mmHg) + * @param filtered override filtered value or raw value * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetArterialPressureOverride( F32 value ) +BOOL testSetArterialPressureOverride( F32 value, BOOL filtered ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { result = TRUE; - arterialPressure.ovData = value; - arterialPressure.override = OVERRIDE_KEY; + if ( FALSE == filtered ) + { + arterialPressure.ovData = value; + arterialPressure.override = OVERRIDE_KEY; + } + else + { + shortFilteredArterialPressure.ovData = value; + shortFilteredArterialPressure.override = OVERRIDE_KEY; + } } return result; @@ -1347,18 +1358,26 @@ * The testResetArterialPressureOverride function resets the override of the * arterial pressure. * @details Inputs: none - * @details Outputs: arterialPressure + * @details Outputs: arterialPressure, shortFilteredArterialPressure * @return TRUE if reset successful, FALSE if not *************************************************************************/ -BOOL testResetArterialPressureOverride( void ) +BOOL testResetArterialPressureOverride( BOOL filtered ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { result = TRUE; - arterialPressure.override = OVERRIDE_RESET; - arterialPressure.ovData = arterialPressure.ovInitData; + if ( FALSE == filtered ) + { + arterialPressure.override = OVERRIDE_RESET; + arterialPressure.ovData = arterialPressure.ovInitData; + } + else + { + shortFilteredArterialPressure.override = OVERRIDE_RESET; + shortFilteredArterialPressure.ovData = shortFilteredArterialPressure.ovInitData; + } } return result; @@ -1369,19 +1388,28 @@ * The testSetVenousPressureOverride function overrides the measured venous * pressure. * @details Inputs: none - * @details Outputs: venousPressure + * @details Outputs: venousPressure, shortFilteredVenousPressure * @param value override measured venous pressure with (in mmHg) + * @param filtered override filtered value or raw value * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetVenousPressureOverride( F32 value ) +BOOL testSetVenousPressureOverride( F32 value, BOOL filtered ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { result = TRUE; - venousPressure.ovData = value; - venousPressure.override = OVERRIDE_KEY; + if ( FALSE == filtered ) + { + venousPressure.ovData = value; + venousPressure.override = OVERRIDE_KEY; + } + else + { + shortFilteredVenousPressure.ovData = value; + shortFilteredVenousPressure.override = OVERRIDE_KEY; + } } return result; @@ -1392,18 +1420,26 @@ * The testResetVenousPressureOverride function resets the override of the * venous pressure. * @details Inputs: none - * @details Outputs: venousPressure + * @details Outputs: venousPressure, shortFilteredVenousPressure * @return TRUE if reset successful, FALSE if not *************************************************************************/ -BOOL testResetVenousPressureOverride( void ) +BOOL testResetVenousPressureOverride( BOOL filtered ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { result = TRUE; - venousPressure.override = OVERRIDE_RESET; - venousPressure.ovData = venousPressure.ovInitData; + if ( FALSE == filtered ) + { + venousPressure.override = OVERRIDE_RESET; + venousPressure.ovData = venousPressure.ovInitData; + } + else + { + shortFilteredVenousPressure.override = OVERRIDE_RESET; + shortFilteredVenousPressure.ovData = shortFilteredVenousPressure.ovInitData; + } } return result;