Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -rd608769332d4ffe19f39a18caca14d6155f13e0a -r6f5bb3935a079cf48c836b2227db430c069bac40 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision d608769332d4ffe19f39a18caca14d6155f13e0a) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 6f5bb3935a079cf48c836b2227db430c069bac40) @@ -110,6 +110,8 @@ #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 ) @@ -160,6 +162,7 @@ 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 longFilteredVenousPressure; ///< Measured venous pressure after long (10 s) filter. static F32 shortFilteredVenousPressure; ///< Measured venous pressure after short (1 s) filter. static U32 bloodPumpOcclusionAfterCartridgeInstall; ///< Measured blood pump occlusion reading taken after cartridge install. @@ -176,10 +179,16 @@ 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. @@ -235,6 +244,7 @@ venLowPresExemptAfterAirTrapFillTimerCtr = 0; longFilteredArterialPressure = 0.0F; shortFilteredArterialPressure = 0.0F; + longFilteredVenousPressure = 0.0F; shortFilteredVenousPressure = 0.0F; presOcclDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; presOcclState = PRESSURE_WAIT_FOR_POST_STATE; @@ -358,8 +368,8 @@ *************************************************************************/ void updatePressureLimitWindows( void ) { - F32 filtArt = getFilteredArterialPressure(); - F32 filtVen = getFilteredVenousPressure(); + F32 filtArt = getLongFilteredArterialPressure(); + F32 filtVen = getLongFilteredVenousPressure(); S32 curArtPres = FLOAT_TO_INT_WITH_ROUND( filtArt ); S32 curVenPres = FLOAT_TO_INT_WITH_ROUND( filtVen ); @@ -950,6 +960,19 @@ { return shortFilteredVenousPressure; } + +/*********************************************************************//** + * @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 @@ -1008,6 +1031,17 @@ artPressureReadingsShortCount = INC_CAP( artPressureReadingsShortCount, SIZE_OF_SHORT_ART_ROLLING_AVG ); shortFilteredArterialPressure = 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 ) { @@ -1035,14 +1069,16 @@ { 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 = shortFilteredArterialPressure; + data.venousPressure = shortFilteredVenousPressure; + 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;