Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -rce8cdf93f8b3fe230bdc16e4e112d4af01024bab -rf5d1bb355b444e008cd495c354b1d9f714cd2ef9 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision ce8cdf93f8b3fe230bdc16e4e112d4af01024bab) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision f5d1bb355b444e008cd495c354b1d9f714cd2ef9) @@ -7,51 +7,52 @@ * * @file PresOccl.c * -* @author (last) Sean Nash -* @date (last) 06-Jul-2023 +* @author (last) Darren Cox +* @date (last) 24-Aug-2023 * * @author (original) Sean * @date (original) 15-Jan-2020 * ***************************************************************************/ - + #include "PresOccl.h" -#include "AirPump.h" +#include "AirPump.h" #include "AlarmMgmt.h" -#include "BloodFlow.h" +#include "BloodFlow.h" #include "FPGA.h" #include "ModeTreatment.h" #include "ModeTreatmentParams.h" -#include "NVDataMgmt.h" +#include "NVDataMgmt.h" #include "OperationModes.h" -#include "PersistentAlarm.h" +#include "PersistentAlarm.h" #include "SystemCommMessages.h" -#include "SelfTests.h" +#include "SelfTests.h" #include "TaskGeneral.h" -#include "Temperatures.h" +#include "Temperatures.h" #include "Timers.h" -#include "Valves.h" - -/** - * @addtogroup PressureOcclusion - * @{ - */ - -// ********** private definitions ********** - -/// Default publication interval for pressure and occlusion data. +#include "Valves.h" + +/** + * @addtogroup PressureOcclusion + * @{ + */ + +// ********** private definitions ********** + +/// Default publication interval for pressure and occlusion data. #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_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_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. -#define ARTERIAL_PRESSURE_V_BIAS ( 3.0F ) ///< Bias voltage for arterial pressure sensor. -#define ARTERIAL_PRESSURE_SENSITIVITY ( 0.000005F ) ///< Sensitivity for arterial pressure sensor is 5 uV / mmHg +#define ARTERIAL_PRESSURE_CONVERSION_OFFSET 0x800000 ///< Arterial pressure conversion coefficient. +#define ARTERIAL_PRESSURE_V_BIAS ( 3.0F ) ///< Bias voltage for arterial pressure sensor. +#define ARTERIAL_PRESSURE_SENSITIVITY ( 0.000005F ) ///< Sensitivity for arterial pressure sensor is 5 uV / mmHg #define ARTERIAL_PRESSURE_V_PER_BIT ( ARTERIAL_PRESSURE_V_BIAS / \ - (F32)ARTERIAL_PRESSURE_CONVERSION_OFFSET ) ///< Volts per bit in 24-bit arterial pressure sensor reading. - -#define VENOUS_PRESSURE_OFFSET ( 1638 ) ///< Offset for 14-bit venous pressure sensor reading. + (F32)ARTERIAL_PRESSURE_CONVERSION_OFFSET ) ///< Volts per bit in 24-bit arterial pressure sensor reading. + +#define VENOUS_PRESSURE_OFFSET ( 1638 ) ///< Offset for 14-bit venous pressure sensor reading. #define VENOUS_PRESSURE_SCALE ( 14745 - VENOUS_PRESSURE_OFFSET ) ///< Scale for venous pressure sensor. #define VENOUS_PRESSURE_MIN_PSI ( -30.0F ) ///< Minimum of scale for venous pressure sensor reading (in PSI). #define VENOUS_PRESSURE_MAX_PSI ( 30.0F ) ///< Maximum of scale for venous pressure sensor reading (in PSI). @@ -77,8 +78,11 @@ #define VENOUS_PRESSURE_LIMIT_MAX_MMHG ( 400.0F ) ///< Maximum venous pressure limit (in mmHg). #define VENOUS_PRESSURE_LIMIT_MIN_MMHG ( 20.0F ) ///< Minimum venous pressure limit (in mmHg). #define VENOUS_PRESSURE_OCCL_OFFSET_MMHG ( 50.0F ) ///< Venous pressure occlusion threshold offset from max alarm limit (in mmHg). -#define VENOUS_PRES_AIR_TRAP_FILL_DELAY_MS ( ( 5 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Venous pressure low exemption delay (in task intervals) following an air trap fill. +#define VENOUS_PRES_AT_FILL_DELAY_MAX_BLOOD_VOL_ML ( 41.667F ) ///< Venous pressure low exemption delay after air trap fill maximum blood volume (in mL). +/// Venous pressure low exemption period (in task intervals) conversion factor (from Qb in mL/min) following an air trap fill. +static const U32 VENOUS_PRES_AT_FILL_DELAY_FACTOR = (U32)( VENOUS_PRES_AT_FILL_DELAY_MAX_BLOOD_VOL_ML * (F32)SEC_PER_MIN * ( (F32)MS_PER_SECOND / (F32)TASK_GENERAL_INTERVAL ) ); + #define PSI_TO_MMHG ( 51.7149F ) ///< Conversion factor for converting PSI to mmHg. #define VENOUS_PRESSURE_NORMAL_OP 0 ///< Venous pressure status bits indicate normal operation. @@ -98,18 +102,22 @@ #define MIN_OCCLUSION_COUNTS 2000 ///< Minimum occlusion sensor reading for range check. #define OCCLUSION_CARTRIDGE_LOADED_PRESSURE_READING_MAX 24500 ///< Occlusion sensors maximum pressure reading limit when cartridge is considered loaded. +#define MAX_ART_VEN_OFFSET_MMHG 15.0F ///< Maximum arterial/venous offset allowed. + #define EMPTY_SALINE_BAG_THRESHOLD_MMHG -300.0F ///< Threshold below which the saline bag is considered empty (in mmHg). static const U32 EMPTY_SALINE_BAG_PERSISTENCE = ( 250 / TASK_GENERAL_INTERVAL ); ///< Time that saline bag looks empty before saying it is empty. #define PRES_ALARM_PERSISTENCE ( 1 * MS_PER_SECOND ) ///< Alarm persistence period for pressure alarms. #define PRES_OCCL_ALARM_PERSISTENCE ( 3 * MS_PER_SECOND ) ///< Alarm persistence period for occlusion alarms #define VEN_OCCL_ALARM_PERSISTENCE 100 ///< Alarm persistence period for venous occlusion alarm. -#define AIR_PUMP_TOLERANCE_TIMEOUT_MS (1 * MS_PER_SECOND ) ///< Time to allow increased maximum venous high limit +#define AIR_PUMP_TOLERANCE_TIMEOUT_MS (1 * MS_PER_SECOND ) ///< Time to allow increased maximum venous high limit /// Measured arterial pressure is filtered w/ 10 second moving average for pressure compensation of flow. #define SIZE_OF_LONG_ART_ROLLING_AVG ( ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) * 10 ) /// Measured arterial pressure is filtered w/ 1 second moving average for inline pressure. #define SIZE_OF_SHORT_ART_ROLLING_AVG ( ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) * 1 ) +/// Measured arterial pressure is filtered w/ 10 second moving average for pressure compensation of flow. +#define SIZE_OF_LONG_VEN_ROLLING_AVG ( ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) * 10 ) /// Measured venous pressure is filtered w/ 1 second moving average for inline pressure and unfiltered for occlusion detection. #define SIZE_OF_SHORT_VEN_ROLLING_AVG ( ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) * 1 ) @@ -120,49 +128,53 @@ #ifndef _RELEASE_ #define MIN_OCCLUSION_COUNTS_V3 1500 ///< Minimum occlusion count for v3 hardware -#endif -/// Defined states for the pressure and occlusion monitor state machine. -typedef enum PresOccl_States -{ - PRESSURE_WAIT_FOR_POST_STATE = 0, ///< Wait for POST state. - PRESSURE_CONTINUOUS_READ_STATE, ///< Continuous read sensors state. - NUM_OF_PRESSURE_STATES ///< Number of pressure/occlusion monitor states. -} PRESSURE_STATE_T; - -/// Defined states for the pressure and occlusion self-test state machine. -typedef enum PresOccl_Self_Test_States -{ - PRESSURE_SELF_TEST_STATE_START = 0, ///< Self test start state. - PRESSURE_TEST_STATE_IN_PROGRESS, ///< Self test in progress state. - PRESSURE_TEST_STATE_COMPLETE, ///< Self test completed state. - NUM_OF_PRESSURE_SELF_TEST_STATES ///< Number of pressure/occlusion self-test states. -} PRESSURE_SELF_TEST_STATE_T; - -// ********** private data ********** - -static PRESSURE_STATE_T presOcclState; ///< Current state of pressure monitor state machine. +#endif +/// Defined states for the pressure and occlusion monitor state machine. +typedef enum PresOccl_States +{ + PRESSURE_WAIT_FOR_POST_STATE = 0, ///< Wait for POST state. + PRESSURE_CONTINUOUS_READ_STATE, ///< Continuous read sensors state. + NUM_OF_PRESSURE_STATES ///< Number of pressure/occlusion monitor states. +} PRESSURE_STATE_T; + +/// Defined states for the pressure and occlusion self-test state machine. +typedef enum PresOccl_Self_Test_States +{ + PRESSURE_SELF_TEST_STATE_START = 0, ///< Self test start state. + PRESSURE_TEST_STATE_IN_PROGRESS, ///< Self test in progress state. + PRESSURE_TEST_STATE_COMPLETE, ///< Self test completed state. + NUM_OF_PRESSURE_SELF_TEST_STATES ///< Number of pressure/occlusion self-test states. +} PRESSURE_SELF_TEST_STATE_T; + +// ********** private data ********** + +static PRESSURE_STATE_T presOcclState; ///< Current state of pressure monitor state machine. static U32 presOcclDataPublicationTimerCounter = 0; ///< Used to schedule pressure data publication to CAN bus. -static U32 venLowPresExemptAfterAirTrapFillTimerCtr; ///< Exempt low ven pressure limit alarm for a time following an air trap fill. - +static U32 venLowPresExemptAfterAirTrapFillTimerCtr; ///< Exempt low ven pressure limit alarm for a time following an air trap fill. + /// Interval (in ms) at which to publish pressure/occlusion data to CAN bus. -static OVERRIDE_U32_T presOcclDataPublishInterval = { PRES_OCCL_DATA_PUB_INTERVAL, PRES_OCCL_DATA_PUB_INTERVAL, 0, 0 }; +static OVERRIDE_U32_T presOcclDataPublishInterval = { PRES_OCCL_DATA_PUB_INTERVAL, PRES_OCCL_DATA_PUB_INTERVAL, 0, 0 }; 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_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 F32 arterialPressureOffset; ///< Arterial pressure sensor offset (in mmHg). +static F32 venousPressureOffset; ///< Venous pressure sensor offset (in mmHg). 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). static S32 currentArterialMinLimit; ///< Minimum arterial pressure limit (in mmHg). static S32 currentVenousMaxLimit; ///< Maximum venous pressure limit (in mmHg). static S32 currentVenousMinLimit; ///< Minimum venous pressure limit (in mmHg). 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 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 F32 shortFilteredVenousPressure; ///< Measured venous 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 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. +static U32 bloodPumpOcclusionAfterCartridgeInstall; ///< Measured blood pump occlusion reading taken after cartridge install. static U32 emptySalineBagCtr = 0; ///< Timer counter for empty bag detection. @@ -176,37 +188,43 @@ static F32 artPressureReadingsShortTotal = 0.0; ///< Rolling total - used to calc average. static U32 artPressureReadingsShortCount = 0; ///< Number of samples in flow rolling average buffer. +static F32 venPressureReadingsLong[ SIZE_OF_LONG_VEN_ROLLING_AVG ]; ///< Holds flow samples for long venous pressure rolling average. +static U32 venPressureReadingsLongIdx = 0; ///< Index for next sample in rolling average array. +static F32 venPressureReadingsLongTotal = 0.0; ///< Rolling total - used to calc average. +static U32 venPressureReadingsLongCount = 0; ///< Number of samples in flow rolling average buffer. + static F32 venPressureReadingsShort[ SIZE_OF_SHORT_VEN_ROLLING_AVG ]; ///< Holds flow samples for long arterial pressure rolling average. static U32 venPressureReadingsShortIdx = 0; ///< Index for next sample in rolling average array. static F32 venPressureReadingsShortTotal = 0.0; ///< Rolling total - used to calc average. static U32 venPressureReadingsShortCount = 0; ///< Number of samples in flow rolling average buffer. + static PRESSURE_SELF_TEST_STATE_T presOcclPostState; ///< Pressure self test post state. static HD_PRESSURE_SENSORS_CAL_RECORD_T pressureSensorsCalRecord; ///< Pressure sensors calibration record. static HD_OCCLUSION_SENSORS_CAL_RECORD_T occlusionSensorsCalRecord; ///< Occlusion sensors calibration record. -// ********** private function prototypes ********** +// ********** private function prototypes ********** -static PRESSURE_STATE_T handlePresOcclWaitForPOSTState( void ); +static PRESSURE_STATE_T handlePresOcclWaitForPOSTState( void ); static PRESSURE_STATE_T handlePresOcclContReadState( void ); static void execPressureLimits( void ); static void convertInlinePressures( void ); static void convertOcclusionPressures( void ); static void checkArterialPressureInRange( void ); -static void checkVenousPressureInRange( void ); -static void checkOcclusions( void ); -static void publishPresOcclData( void ); +static void checkVenousPressureInRange( void ); +static void checkOcclusions( void ); +static void publishPresOcclData( void ); static void determineArtVenPressureLimits( void ); static void filterInlinePressureReadings( F32 artPres, F32 venPres ); - -/*********************************************************************//** - * @brief - * The initPresOccl function initializes the PresOccl module. - * @details Inputs: none - * @details Outputs: PresOccl module initialized. - * @return none - *************************************************************************/ -void initPresOccl( void ) -{ + +/*********************************************************************//** + * @brief + * The initPresOccl function initializes the PresOccl module. + * @details Inputs: none + * @details Outputs: PresOccl module initialized. + * @return none + *************************************************************************/ +void initPresOccl( void ) +{ // Initialize persistent pressure alarms initPersistentAlarm( ALARM_ID_HD_ARTERIAL_PRESSURE_LOW, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_ARTERIAL_PRESSURE_HIGH, 0, PRES_ALARM_PERSISTENCE ); @@ -233,17 +251,52 @@ stableArterialPressure = 0; stableVenousPressure = 0; venLowPresExemptAfterAirTrapFillTimerCtr = 0; + resetArtVenPressureOffsets(); longFilteredArterialPressure = 0.0F; - shortFilteredArterialPressure = 0.0F; - shortFilteredVenousPressure = 0.0F; + shortFilteredArterialPressure.data = 0.0F; + longFilteredVenousPressure = 0.0F; + shortFilteredVenousPressure.data = 0.0F; presOcclDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; presOcclState = PRESSURE_WAIT_FOR_POST_STATE; presOcclPostState = PRESSURE_SELF_TEST_STATE_START; bloodPumpOcclusionAfterCartridgeInstall = 0; -} - + useShortStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; +} + /*********************************************************************//** * @brief + * The resetArtVenPressureOffsets function resets the arterial and venous + * offsets to zero. + * @details Inputs: none + * @details Outputs: arterialPressureOffset, venousPressureOffset + * @return none + *************************************************************************/ +void resetArtVenPressureOffsets( void ) +{ + arterialPressureOffset = 0.0F; + venousPressureOffset = 0.0F; +} + +/*********************************************************************//** + * @brief + * The setArtVenPressureOffsets function sets the arterial and venous + * offsets to current readings. + * @details Inputs: none + * @details Outputs: arterialPressureOffset, venousPressureOffset + * @return none + *************************************************************************/ +void setArtVenPressureOffsets( void ) +{ + arterialPressureOffset = getMeasuredArterialPressure(); + venousPressureOffset = getMeasuredVenousPressure(); + if ( ( fabs( arterialPressureOffset ) > MAX_ART_VEN_OFFSET_MMHG ) || ( fabs( venousPressureOffset ) > MAX_ART_VEN_OFFSET_MMHG ) ) + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, arterialPressureOffset, venousPressureOffset ); + } +} + +/*********************************************************************//** + * @brief * The isCartridgeLoaded function determines whether a cartridge has been * properly loaded by looking at the BP occlusion pressure sensor. * @details Inputs: BP occlusion pressure @@ -352,17 +405,30 @@ * 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 Inputs: useShortStabilizeTime * @details Outputs: stableArterialPressure, stableVenousPressure * @return none *************************************************************************/ void updatePressureLimitWindows( void ) { - F32 filtArt = getFilteredArterialPressure(); - F32 filtVen = getFilteredVenousPressure(); - S32 curArtPres = FLOAT_TO_INT_WITH_ROUND( filtArt ); - S32 curVenPres = FLOAT_TO_INT_WITH_ROUND( filtVen ); + F32 filtArt; + F32 filtVen; + S32 curArtPres; + S32 curVenPres; + if ( USE_SHORT_STABILIZATION_PERIOD == useShortStabilizeTime ) + { + filtArt = getFilteredArterialPressure(); + filtVen = getFilteredVenousPressure(); + } + else + { + F32 filtArt = getLongFilteredArterialPressure(); + F32 filtVen = getLongFilteredVenousPressure(); + } + + curArtPres = FLOAT_TO_INT_WITH_ROUND( filtArt ); + curVenPres = FLOAT_TO_INT_WITH_ROUND( filtVen ); stableArterialPressure = curArtPres; stableVenousPressure = curVenPres; @@ -375,12 +441,17 @@ * The signalInitiatePressureStabilization function signals that user has * changed the blood and/or dialysate flow rate. If pressure limits state * was stable, a rate change will kick us back to stabilization state. - * @details Inputs: none - * @details Outputs: currPresLimitsState, stabilizationStartTimeMs + * Else reset stabilize counter. + * @details Inputs: currPresLimitsState + * @details Outputs: currPresLimitsState, stabilizationStartTimeMs, useShortStabilizeTime + * @param useShort Flag to use short stabilization period. Use defines: + * USE_NORMAL_STABILIZATION_PERIOD, USE_SHORT_STABILIZATION_PERIOD * @return none *************************************************************************/ -void signalInitiatePressureStabilization( void ) +void signalInitiatePressureStabilization( BOOL useShort ) { + useShortStabilizeTime = useShort; + // User update of blood/dialysate flow rate or UF rate or initiates/resets a stabilization period (if we were in stabilization or stable state) if ( PRESSURE_LIMITS_STATE_STABILIZATION == currPresLimitsState ) { @@ -428,33 +499,33 @@ pressureLimitsActive = ( currPresLimitsState > PRESSURE_LIMITS_STATE_IDLE ? TRUE : FALSE ); } -/*********************************************************************//** - * @brief - * The execPresOccl function executes the pressure and occlusion monitor. - * @details Inputs: presOcclState - * @details Outputs: presOcclState - * @return none - *************************************************************************/ -void execPresOccl( void ) -{ - // State machine - switch ( presOcclState ) - { - case PRESSURE_WAIT_FOR_POST_STATE: - presOcclState = handlePresOcclWaitForPOSTState(); - break; - - case PRESSURE_CONTINUOUS_READ_STATE: - presOcclState = handlePresOcclContReadState(); - break; - - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_PRES_OCCL_INVALID_STATE, presOcclState ) - break; - } - - // Publish pressure/occlusion data on interval - publishPresOcclData(); +/*********************************************************************//** + * @brief + * The execPresOccl function executes the pressure and occlusion monitor. + * @details Inputs: presOcclState + * @details Outputs: presOcclState + * @return none + *************************************************************************/ +void execPresOccl( void ) +{ + // State machine + switch ( presOcclState ) + { + case PRESSURE_WAIT_FOR_POST_STATE: + presOcclState = handlePresOcclWaitForPOSTState(); + break; + + case PRESSURE_CONTINUOUS_READ_STATE: + presOcclState = handlePresOcclContReadState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_PRES_OCCL_INVALID_STATE, presOcclState ) + break; + } + + // Publish pressure/occlusion data on interval + publishPresOcclData(); } /*********************************************************************//** @@ -475,18 +546,18 @@ } return result; -} - -/*********************************************************************//** - * @brief - * The handlePresOcclContReadState function handles the continuous read state - * of the pressure/occlusion monitor state machine. - * @details Inputs: FPGA pressure/occlusion readings - * @details Outputs: pressure sensor values updated - * @return next state - *************************************************************************/ -static PRESSURE_STATE_T handlePresOcclContReadState( void ) -{ +} + +/*********************************************************************//** + * @brief + * The handlePresOcclContReadState function handles the continuous read state + * of the pressure/occlusion monitor state machine. + * @details Inputs: FPGA pressure/occlusion readings + * @details Outputs: pressure sensor values updated + * @return next state + *************************************************************************/ +static PRESSURE_STATE_T handlePresOcclContReadState( void ) +{ PRESSURE_STATE_T result = PRESSURE_CONTINUOUS_READ_STATE; // Read latest in-line (arterial and venous) pressures @@ -503,12 +574,12 @@ // Check in-line pressures are in range checkArterialPressureInRange(); - checkVenousPressureInRange(); + checkVenousPressureInRange(); - // Check for occlusions + // Check for occlusions checkOcclusions(); - return result; + return result; } /*********************************************************************//** @@ -521,8 +592,10 @@ static void execPressureLimits( void ) { BOOL bpRunning = isBloodPumpRunning(); + BOOL bpRampComplete = isBloodPumpRampComplete(); HD_OP_MODE_T currMode = getCurrentOperationMode(); TREATMENT_STATE_T currTxState = getTreatmentState(); + U32 stabilizeTime = PRES_LIMIT_STABILIZATION_TIME_MS; if ( currMode != MODE_TREA ) { @@ -532,14 +605,14 @@ switch ( currPresLimitsState ) { case PRESSURE_LIMITS_STATE_OFF: - if ( MODE_TREA == currMode ) + if ( ( MODE_TREA == currMode ) && ( currTxState != TREATMENT_RECIRC_STATE ) ) { // Tx mode starts in blood prime - want wide limits in that state currPresLimitsState = PRESSURE_LIMITS_STATE_WIDE; } break; case PRESSURE_LIMITS_STATE_IDLE: - if ( TRUE == bpRunning ) + if ( TRUE == bpRampComplete ) { currPresLimitsState = PRESSURE_LIMITS_STATE_WIDE; } @@ -553,11 +626,25 @@ else if ( ( TREATMENT_DIALYSIS_STATE == currTxState ) || ( TREATMENT_STOP_STATE == currTxState ) ) { stabilizationStartTimeMs = getMSTimerCount(); + useShortStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION; } + else if ( currTxState == TREATMENT_RECIRC_STATE ) + { + currPresLimitsState = PRESSURE_LIMITS_STATE_OFF; + } break; case PRESSURE_LIMITS_STATE_STABILIZATION: + if ( USE_SHORT_STABILIZATION_PERIOD == useShortStabilizeTime ) + { + stabilizeTime = PRES_LIMIT_SHORT_STABILIZE_TIME_MS; + } + else + { + stabilizeTime = PRES_LIMIT_STABILIZATION_TIME_MS; + } + if ( bpRunning != TRUE ) { currPresLimitsState = PRESSURE_LIMITS_STATE_IDLE; @@ -566,10 +653,11 @@ { currPresLimitsState = PRESSURE_LIMITS_STATE_WIDE; } - else if ( TRUE == didTimeout( stabilizationStartTimeMs, PRES_LIMIT_STABILIZATION_TIME_MS ) ) + else if ( TRUE == didTimeout( stabilizationStartTimeMs, stabilizeTime ) ) { updatePressureLimitWindows(); stabilizationStartTimeMs = getMSTimerCount(); + useShortStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; currPresLimitsState = PRESSURE_LIMITS_STATE_STABLE; } break; @@ -586,6 +674,7 @@ else if ( TRUE == didTimeout( stabilizationStartTimeMs, PRES_LIMIT_RESTABILIZE_TIME_MS ) ) { stabilizationStartTimeMs = getMSTimerCount(); + useShortStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION; } break; @@ -594,7 +683,7 @@ SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_PRES_LIMITS_INVALID_STATE, currPresLimitsState ) break; } -} +} /*********************************************************************//** * @brief @@ -624,18 +713,24 @@ if ( ARTERIAL_PRESSURE_NORMAL_OP == artPresStatus ) { + F32 artPresPSI; + // If the arterial pressure status is normal, convert the counts to pressure in mmHg - arterialPressure.data = ( (F32)( artPres - ARTERIAL_PRESSURE_OFFSET ) * + artPresPSI = ( (F32)( artPres - ARTERIAL_PRESSURE_OFFSET ) * ( ARTERIAL_PRESSURE_MAX_PSI - ARTERIAL_PRESSURE_MIN_PSI ) / (F32)ARTERIAL_PRESSURE_SCALE ) + ARTERIAL_PRESSURE_MIN_PSI; - arterialPressure.data = arterialPressure.data * PSI_TO_MMHG; + artPresPSI = artPresPSI * PSI_TO_MMHG; + arterialPressure.data = artPresPSI - arterialPressureOffset; } if ( VENOUS_PRESSURE_NORMAL_OP == venPresStatus ) { + F32 venPresPSI; + // Convert venous pressure to PSI and then mmHg - F32 venPresPSI = ( (F32)( venPres - VENOUS_PRESSURE_OFFSET ) * ( VENOUS_PRESSURE_MAX_PSI - VENOUS_PRESSURE_MIN_PSI ) / (F32)VENOUS_PRESSURE_SCALE ) + - VENOUS_PRESSURE_MIN_PSI; - venousPressure.data = venPresPSI * PSI_TO_MMHG; + venPresPSI = ( (F32)( venPres - VENOUS_PRESSURE_OFFSET ) * + ( VENOUS_PRESSURE_MAX_PSI - VENOUS_PRESSURE_MIN_PSI ) / (F32)VENOUS_PRESSURE_SCALE ) + VENOUS_PRESSURE_MIN_PSI; + venPresPSI = venPresPSI * PSI_TO_MMHG; + venousPressure.data = venPresPSI - venousPressureOffset; } // Filter inline pressure readings @@ -748,12 +843,16 @@ if ( pressureLimitsActive != FALSE ) { BOOL venPresLow, venPresHigh; + S32 qB = abs( getTargetBloodFlowRate() ); + U32 qBx = ( 0 == qB ? MIN_SET_BLOOD_FLOW_RATE : (U32)qB ); + // compute exemption period (in general task intervals) for low venous pressure alarms after air trap fills + U32 exemptPeriod = VENOUS_PRES_AT_FILL_DELAY_FACTOR / qBx; venPresLow = ( venPres < (F32)currentVenousMinLimit ? TRUE : FALSE ); venPresHigh = ( venPres > (F32)currentVenousMaxLimit ? TRUE : FALSE ); // Check venous pressure is within alarm limits - if ( ( airTrapValveState != STATE_OPEN ) && ( venLowPresExemptAfterAirTrapFillTimerCtr > VENOUS_PRES_AIR_TRAP_FILL_DELAY_MS ) ) + if ( ( airTrapValveState != STATE_OPEN ) && ( venLowPresExemptAfterAirTrapFillTimerCtr > exemptPeriod ) ) { if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_LOW, venPresLow ) ) { @@ -777,16 +876,16 @@ } } -/*********************************************************************//** - * @brief - * The checkPressureLimits function gets the pressure/occlusion data - * publication interval. - * @details Inputs: occlusion pressures for the pumps - * @details Outputs: Alarm if occlusion limit exceeded - * @return none - *************************************************************************/ -static void checkOcclusions( void ) -{ +/*********************************************************************//** + * @brief + * The checkPressureLimits function gets the pressure/occlusion data + * publication interval. + * @details Inputs: occlusion pressures for the pumps + * @details Outputs: Alarm if occlusion limit exceeded + * @return none + *************************************************************************/ +static void checkOcclusions( void ) +{ U32 bpOccl = getMeasuredBloodPumpOcclusion(); BOOL outOfRange = ( bpOccl < MIN_OCCLUSION_COUNTS ? TRUE : FALSE ); @@ -804,7 +903,6 @@ F32 venPres = getMeasuredVenousPressure(); HD_OP_MODE_T hdMode = getCurrentOperationMode(); U32 hdSubMode = getCurrentSubMode(); - BOOL txMode = ( MODE_TREA == hdMode ? TRUE : FALSE ); BOOL ptxMode = ( MODE_PRET == hdMode && hdSubMode > HD_PRE_TREATMENT_CART_INSTALL_STATE ? TRUE : FALSE ); // Range check occlusion sensor (OB) @@ -820,11 +918,11 @@ if ( ( TRUE == isBloodPumpRunning() ) && ( getPreTreatmentSubState() > HD_PRE_TREATMENT_CART_INSTALL_STATE ) && ( getDrySelfTestsState() > DRY_SELF_TESTS_START_STATE ) ) { - // Check for occlusion - if ( bpOccl > ( OCCLUSION_THRESHOLD_OFFSET + bloodPumpOcclusionAfterCartridgeInstall ) ) + // Check for occlusion + if ( bpOccl > ( OCCLUSION_THRESHOLD_OFFSET + bloodPumpOcclusionAfterCartridgeInstall ) ) { - signalBloodPumpHardStop(); // Stop pump immediately - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_OCCLUSION_BLOOD_PUMP, bpOccl, OCCLUSION_THRESHOLD_OFFSET + bloodPumpOcclusionAfterCartridgeInstall ) + signalBloodPumpHardStop(); // Stop pump immediately + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_OCCLUSION_BLOOD_PUMP, bpOccl, OCCLUSION_THRESHOLD_OFFSET + bloodPumpOcclusionAfterCartridgeInstall ) } } } @@ -855,9 +953,8 @@ #endif { // only trigger alarm if BP is running if ( isBloodPumpRunning() != FALSE ) - { // must be in treatment or pre-treatment mode to trigger this alarm - if ( ( TRUE == txMode || TRUE == ptxMode ) && - ( venPres > VENOUS_PRESSURE_LIMIT_MAX_MMHG + VENOUS_PRESSURE_OCCL_OFFSET_MMHG ) ) + { // must be in pre-treatment mode to trigger this alarm + if ( ( TRUE == ptxMode ) && ( venPres > VENOUS_PRESSURE_LIMIT_MAX_MMHG + VENOUS_PRESSURE_OCCL_OFFSET_MMHG ) ) { if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_LINE_OCCLUSION, TRUE ) ) { @@ -874,16 +971,16 @@ isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_LINE_OCCLUSION, FALSE ); } } - } -} - -/*********************************************************************//** - * @brief - * The getMeasuredArterialPressure function gets the current arterial pressure. - * @details Inputs: arterialPressure - * @details Outputs: none - * @return the current arterial pressure (in mmHg). - *************************************************************************/ + } +} + +/*********************************************************************//** + * @brief + * The getMeasuredArterialPressure function gets the current arterial pressure. + * @details Inputs: arterialPressure + * @details Outputs: none + * @return the current arterial pressure (in mmHg). + *************************************************************************/ F32 getMeasuredArterialPressure( void ) { F32 result = arterialPressure.data; @@ -905,7 +1002,7 @@ *************************************************************************/ F32 getFilteredArterialPressure( void ) { - return shortFilteredArterialPressure; + return getF32OverrideValue( &shortFilteredArterialPressure ); } /*********************************************************************//** @@ -919,14 +1016,14 @@ { return longFilteredArterialPressure; } - -/*********************************************************************//** - * @brief - * The getMeasuredVenousPressure function gets the measured venous pressure. - * @details Inputs: venousPressure - * @details Outputs: none - * @return the current venous pressure (in mmHg). - *************************************************************************/ + +/*********************************************************************//** + * @brief + * The getMeasuredVenousPressure function gets the measured venous pressure. + * @details Inputs: venousPressure + * @details Outputs: none + * @return the current venous pressure (in mmHg). + *************************************************************************/ F32 getMeasuredVenousPressure( void ) { F32 result = venousPressure.data; @@ -948,17 +1045,30 @@ *************************************************************************/ F32 getFilteredVenousPressure( void ) { - return shortFilteredVenousPressure; + return getF32OverrideValue( &shortFilteredVenousPressure ); } - -/*********************************************************************//** - * @brief - * The getMeasuredBloodPumpOcclusion function gets the measured blood pump - * occlusion pressure. - * @details Inputs: bloodPumpOcclusion - * @details Outputs: none - * @return the current blood pump occlusion pressure (in mmHg). - *************************************************************************/ + +/*********************************************************************//** + * @brief + * The getLongFilteredVenousPressure function gets the current long filtered + * venous pressure. + * @details Inputs: longFilteredVenousPressure + * @details Outputs: none + * @return the current long filtered venous pressure (in mmHg). + *************************************************************************/ +F32 getLongFilteredVenousPressure( void ) +{ + return longFilteredVenousPressure; +} + +/*********************************************************************//** + * @brief + * The getMeasuredBloodPumpOcclusion function gets the measured blood pump + * occlusion pressure. + * @details Inputs: bloodPumpOcclusion + * @details Outputs: none + * @return the current blood pump occlusion pressure (in mmHg). + *************************************************************************/ U32 getMeasuredBloodPumpOcclusion( void ) { U32 result = bloodPumpOcclusion.data; @@ -970,7 +1080,7 @@ return result; } - + /*********************************************************************//** * @brief * The filterInlinePressureReadings function adds a new arterial and venous @@ -1006,8 +1116,19 @@ 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 ) + { + venPressureReadingsLongTotal -= venPressureReadingsLong[ venPressureReadingsLongIdx ]; + } + venPressureReadingsLong[ venPressureReadingsLongIdx ] = venPres; + venPressureReadingsLongTotal += venPres; + venPressureReadingsLongIdx = INC_WRAP( venPressureReadingsLongIdx, 0, SIZE_OF_LONG_VEN_ROLLING_AVG - 1 ); + venPressureReadingsLongCount = INC_CAP( venPressureReadingsLongCount, SIZE_OF_LONG_VEN_ROLLING_AVG ); + longFilteredVenousPressure = venPressureReadingsLongTotal / (F32)venPressureReadingsLongCount; + // Short filter for venous pressure. if ( venPressureReadingsShortCount >= SIZE_OF_SHORT_VEN_ROLLING_AVG ) { @@ -1017,51 +1138,53 @@ 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; } - -/*********************************************************************//** - * @brief - * The publishPresOcclData function publishes pressure/occlusion data at the - * set interval. - * @details Inputs: latest pressure and occlusion readings - * @details Outputs: Pressure/occlusion data are published to CAN bus. - * @return none - *************************************************************************/ -static void publishPresOcclData( void ) -{ - // Publish pressure/occlusion data on interval - if ( ++presOcclDataPublicationTimerCounter >= getU32OverrideValue( &presOcclDataPublishInterval ) ) + +/*********************************************************************//** + * @brief + * The publishPresOcclData function publishes pressure/occlusion data at the + * set interval. + * @details Inputs: latest pressure and occlusion readings + * @details Outputs: Pressure/occlusion data are published to CAN bus. + * @return none + *************************************************************************/ +static void publishPresOcclData( void ) +{ + // Publish pressure/occlusion data on interval + if ( ++presOcclDataPublicationTimerCounter >= getU32OverrideValue( &presOcclDataPublishInterval ) ) { PRESSURE_OCCLUSION_DATA_T data; - - data.arterialPressure = shortFilteredArterialPressure; - data.venousPressure = shortFilteredVenousPressure; - data.bldPumpOcclusion = getMeasuredBloodPumpOcclusion(); - data.presLimitState = currPresLimitsState; - data.artMinLimit = currentArterialMinLimit; - data.artMaxLimit = currentArterialMaxLimit; - data.venMinLimit = currentVenousMinLimit; - data.venMaxLimit = currentVenousMaxLimit; - + + data.arterialPressure = getFilteredArterialPressure(); + data.venousPressure = getFilteredVenousPressure(); + data.bldPumpOcclusion = getMeasuredBloodPumpOcclusion(); + data.presLimitState = currPresLimitsState; + data.artMinLimit = currentArterialMinLimit; + data.artMaxLimit = currentArterialMaxLimit; + data.venMinLimit = currentVenousMinLimit; + data.venMaxLimit = currentVenousMaxLimit; + data.arterialLongFilterPres = longFilteredArterialPressure; + data.venousLongFilterPres = longFilteredVenousPressure; + broadcastData( MSG_ID_PRESSURE_OCCLUSION_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( PRESSURE_OCCLUSION_DATA_T ) ); - presOcclDataPublicationTimerCounter = 0; - } -} - -/*********************************************************************//** - * @brief - * The execPresOcclTest function executes the PresOccl self-test. - * @details Inputs: none - * @details Outputs: Triggers fault when test case fails - * @return none - *************************************************************************/ -void execPresOcclTest( void ) + presOcclDataPublicationTimerCounter = 0; + } +} + +/*********************************************************************//** + * @brief + * The execPresOcclTest function executes the PresOccl self-test. + * @details Inputs: none + * @details Outputs: Triggers fault when test case fails + * @return none + *************************************************************************/ +void execPresOcclTest( void ) { #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRESSURE_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) #endif - { + { U32 bpPressure = getMeasuredBloodPumpOcclusion(); F32 arterialPressure = getFilteredArterialPressure(); F32 venousPressure = getFilteredVenousPressure(); @@ -1081,7 +1204,7 @@ SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_VENOUS_PRESSURE_SELF_TEST_FAILURE, venousPressure ); } } -} +} /*********************************************************************//** * @brief @@ -1141,194 +1264,228 @@ } return result; -} +} - -/************************************************************************* - * TEST SUPPORT FUNCTIONS - *************************************************************************/ - - -/*********************************************************************//** - * @brief - * The testSetPresOcclDataPublishIntervalOverride function overrides the - * pressure and occlusion data publish interval. - * @details Inputs: none - * @details Outputs: presOcclDataPublishInterval - * @param value override pressure and occlusion data publish interval with (in ms) - * @return TRUE if override successful, FALSE if not - *************************************************************************/ -BOOL testSetPresOcclDataPublishIntervalOverride( U32 value ) -{ - BOOL result = FALSE; - - if ( TRUE == isTestingActivated() ) - { - U32 intvl = value / TASK_GENERAL_INTERVAL; - - result = TRUE; - presOcclDataPublishInterval.ovData = intvl; - presOcclDataPublishInterval.override = OVERRIDE_KEY; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The testResetPresOcclDataPublishIntervalOverride function resets the override - * of the pressure and occlusion data publish interval. - * @details Inputs: none - * @details Outputs: presOcclDataPublishInterval - * @return TRUE if override reset successful, FALSE if not - *************************************************************************/ -BOOL testResetPresOcclDataPublishIntervalOverride( void ) -{ - BOOL result = FALSE; - - if ( TRUE == isTestingActivated() ) - { - result = TRUE; - presOcclDataPublishInterval.override = OVERRIDE_RESET; - presOcclDataPublishInterval.ovData = presOcclDataPublishInterval.ovInitData; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The testSetArterialPressureOverride function overrides the measured arterial - * pressure. - * @details Inputs: none - * @details Outputs: arterialPressure - * @param value override arterial pressure (in mmHg) - * @return TRUE if override successful, FALSE if not - *************************************************************************/ -BOOL testSetArterialPressureOverride( F32 value ) -{ - BOOL result = FALSE; - - if ( TRUE == isTestingActivated() ) - { - result = TRUE; - arterialPressure.ovData = value; - arterialPressure.override = OVERRIDE_KEY; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The testResetArterialPressureOverride function resets the override of the - * arterial pressure. - * @details Inputs: none - * @details Outputs: arterialPressure - * @return TRUE if reset successful, FALSE if not - *************************************************************************/ -BOOL testResetArterialPressureOverride( void ) -{ - BOOL result = FALSE; - - if ( TRUE == isTestingActivated() ) - { - result = TRUE; - arterialPressure.override = OVERRIDE_RESET; - arterialPressure.ovData = arterialPressure.ovInitData; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The testSetVenousPressureOverride function overrides the measured venous - * pressure. - * @details Inputs: none - * @details Outputs: venousPressure - * @param value override measured venous pressure with (in mmHg) - * @return TRUE if override successful, FALSE if not - *************************************************************************/ -BOOL testSetVenousPressureOverride( F32 value ) -{ - BOOL result = FALSE; - - if ( TRUE == isTestingActivated() ) - { - result = TRUE; - venousPressure.ovData = value; - venousPressure.override = OVERRIDE_KEY; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The testResetVenousPressureOverride function resets the override of the - * venous pressure. - * @details Inputs: none - * @details Outputs: venousPressure - * @return TRUE if reset successful, FALSE if not - *************************************************************************/ -BOOL testResetVenousPressureOverride( void ) -{ - BOOL result = FALSE; - - if ( TRUE == isTestingActivated() ) - { - result = TRUE; - venousPressure.override = OVERRIDE_RESET; - venousPressure.ovData = venousPressure.ovInitData; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The testSetBloodPumpOcclusionOverride function overrides the measured - * blood pump occlusion pressure. - * @details Inputs: none - * @details Outputs: bloodPumpOcclusion - * @param value override measured blood pump occlusion pressure with - * @return TRUE if override successful, FALSE if not - *************************************************************************/ -BOOL testSetBloodPumpOcclusionOverride( U32 value ) -{ - BOOL result = FALSE; - - if ( TRUE == isTestingActivated() ) - { - result = TRUE; - bloodPumpOcclusion.ovData = value; - bloodPumpOcclusion.override = OVERRIDE_KEY; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The testResetBloodPumpOcclusionOverride function resets the override of the - * measured blood pump occlusion pressure. - * @details Inputs: none - * @details Outputs: bloodPumpOcclusion - * @return TRUE if reset successful, FALSE if not - *************************************************************************/ -BOOL testResetBloodPumpOcclusionOverride( void ) -{ - BOOL result = FALSE; - - if ( TRUE == isTestingActivated() ) - { - result = TRUE; - bloodPumpOcclusion.override = OVERRIDE_RESET; - bloodPumpOcclusion.ovData = bloodPumpOcclusion.ovInitData; - } - - return result; + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetPresOcclDataPublishIntervalOverride function overrides the + * pressure and occlusion data publish interval. + * @details Inputs: none + * @details Outputs: presOcclDataPublishInterval + * @param value override pressure and occlusion data publish interval with (in ms) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetPresOcclDataPublishIntervalOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = value / TASK_GENERAL_INTERVAL; + + result = TRUE; + presOcclDataPublishInterval.ovData = intvl; + presOcclDataPublishInterval.override = OVERRIDE_KEY; + } + + return result; } -/**@}*/ +/*********************************************************************//** + * @brief + * The testResetPresOcclDataPublishIntervalOverride function resets the override + * of the pressure and occlusion data publish interval. + * @details Inputs: none + * @details Outputs: presOcclDataPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetPresOcclDataPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + presOcclDataPublishInterval.override = OVERRIDE_RESET; + presOcclDataPublishInterval.ovData = presOcclDataPublishInterval.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetArterialPressureOverride function overrides the measured arterial + * pressure. + * @details Inputs: none + * @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 filtered ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + if ( FALSE == filtered ) + { + arterialPressure.ovData = value; + arterialPressure.override = OVERRIDE_KEY; + } + else + { + shortFilteredArterialPressure.ovData = value; + shortFilteredArterialPressure.override = OVERRIDE_KEY; + } + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetArterialPressureOverride function resets the override of the + * arterial pressure. + * @details Inputs: none + * @details Outputs: arterialPressure, shortFilteredArterialPressure + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetArterialPressureOverride( BOOL filtered ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + if ( FALSE == filtered ) + { + arterialPressure.override = OVERRIDE_RESET; + arterialPressure.ovData = arterialPressure.ovInitData; + } + else + { + shortFilteredArterialPressure.override = OVERRIDE_RESET; + shortFilteredArterialPressure.ovData = shortFilteredArterialPressure.ovInitData; + } + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetVenousPressureOverride function overrides the measured venous + * pressure. + * @details Inputs: none + * @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 filtered ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + if ( FALSE == filtered ) + { + venousPressure.ovData = value; + venousPressure.override = OVERRIDE_KEY; + } + else + { + shortFilteredVenousPressure.ovData = value; + shortFilteredVenousPressure.override = OVERRIDE_KEY; + } + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetVenousPressureOverride function resets the override of the + * venous pressure. + * @details Inputs: none + * @details Outputs: venousPressure, shortFilteredVenousPressure + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetVenousPressureOverride( BOOL filtered ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + if ( FALSE == filtered ) + { + venousPressure.override = OVERRIDE_RESET; + venousPressure.ovData = venousPressure.ovInitData; + } + else + { + shortFilteredVenousPressure.override = OVERRIDE_RESET; + shortFilteredVenousPressure.ovData = shortFilteredVenousPressure.ovInitData; + } + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetBloodPumpOcclusionOverride function overrides the measured + * blood pump occlusion pressure. + * @details Inputs: none + * @details Outputs: bloodPumpOcclusion + * @param value override measured blood pump occlusion pressure with + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetBloodPumpOcclusionOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + bloodPumpOcclusion.ovData = value; + bloodPumpOcclusion.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetBloodPumpOcclusionOverride function resets the override of the + * measured blood pump occlusion pressure. + * @details Inputs: none + * @details Outputs: bloodPumpOcclusion + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetBloodPumpOcclusionOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + bloodPumpOcclusion.override = OVERRIDE_RESET; + bloodPumpOcclusion.ovData = bloodPumpOcclusion.ovInitData; + } + + return result; +} + +/**@}*/