Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r487d3524cbf3b50dad1308fc1f68b733cc00c4cd -r727f30438c094ec62abe1fad1f5a8962cd304a4d --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 487d3524cbf3b50dad1308fc1f68b733cc00c4cd) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 727f30438c094ec62abe1fad1f5a8962cd304a4d) @@ -152,6 +152,8 @@ 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). @@ -242,6 +244,7 @@ stableArterialPressure = 0; stableVenousPressure = 0; venLowPresExemptAfterAirTrapFillTimerCtr = 0; + resetArtVenPressureOffsets(); longFilteredArterialPressure = 0.0F; shortFilteredArterialPressure = 0.0F; longFilteredVenousPressure = 0.0F; @@ -254,6 +257,34 @@ /*********************************************************************//** * @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(); +} + +/*********************************************************************//** + * @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 @@ -634,18 +665,23 @@ 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 Index: firmware/App/Controllers/PresOccl.h =================================================================== diff -u -r487d3524cbf3b50dad1308fc1f68b733cc00c4cd -r727f30438c094ec62abe1fad1f5a8962cd304a4d --- firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 487d3524cbf3b50dad1308fc1f68b733cc00c4cd) +++ firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 727f30438c094ec62abe1fad1f5a8962cd304a4d) @@ -88,6 +88,9 @@ void updatePressureLimitWindows( void ); void signalInitiatePressureStabilization( void ); +void resetArtVenPressureOffsets( void ); +void setArtVenPressureOffsets( void ); + F32 getMeasuredArterialPressure( void ); F32 getFilteredArterialPressure( void ); F32 getLongFilteredArterialPressure( void ); Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r487d3524cbf3b50dad1308fc1f68b733cc00c4cd -r727f30438c094ec62abe1fad1f5a8962cd304a4d --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 487d3524cbf3b50dad1308fc1f68b733cc00c4cd) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 727f30438c094ec62abe1fad1f5a8962cd304a4d) @@ -1002,7 +1002,7 @@ setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); setValvePosition( VBA, VALVE_POSITION_B_OPEN ); - setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBV, VALVE_POSITION_A_INSERT_EJECT ); } if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -1033,6 +1033,7 @@ ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) && ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) ) { + resetArtVenPressureOffsets(); state = DRY_SELF_TESTS_CARTRIDGE_LOADED_CHECK_STATE; } else @@ -1073,10 +1074,11 @@ if ( SELF_TEST_STATUS_PASSED == execPresOcclDryTest() ) { + setArtVenPressureOffsets(); setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); setValvePosition( VBA, VALVE_POSITION_B_OPEN ); // need open path from PBA to VBT - setValvePosition( VBV, VALVE_POSITION_B_OPEN ); // need open path from PBA to VBT + setValvePosition( VBV, VALVE_POSITION_A_INSERT_EJECT ); // need open path from PBA to VBT setValveAirTrap( STATE_OPEN ); pressureSelfTestPreNormalStartTime = getMSTimerCount(); state = DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_SETUP_STATE; @@ -1564,6 +1566,7 @@ if ( TRUE == cartridgeUsedTestRun ) { doorClosedRequired( TRUE, TRUE ); + resetArtVenPressureOffsets(); state = DRY_SELF_TESTS_CARTRIDGE_LOADED_CHECK_STATE; } else if ( occlusionBaselineWasSet != TRUE )