Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -re23087e0c17f6ea81d60641fdb52121a8dd5a099 -r27f3db92495948d4c1192421c1b0c20338c4a034 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision e23087e0c17f6ea81d60641fdb52121a8dd5a099) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 27f3db92495948d4c1192421c1b0c20338c4a034) @@ -40,10 +40,16 @@ #define ARTERIAL_PRESSURE_V_PER_BIT ( ARTERIAL_PRESSURE_V_BIAS / (F32)0x800000 ) ///< 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 ( -30.0 ) ///< Minimum of scale for venous pressure sensor reading (in PSI). +#define VENOUS_PRESSURE_SCALE ( 14745 - VENOUS_PRESSURE_OFFSET ) ///< Scale for venous pressure sensor. +#define VENOUS_PRESSURE_MIN ( -30.0 ) ///< Minimum of scale for venous pressure sensor reading (in PSI). #define VENOUS_PRESSURE_MAX ( 30.0 ) ///< Maximum of scale for venous pressure sensor reading (in PSI). +#define ARTERIAL_PRESSURE_SELF_TEST_MIN ( -300.0 ) ///< Minimum self-test value for arterial pressure sensor reading (in mmHg). +#define ARTERIAL_PRESSURE_SELF_TEST_MAX ( 100.0 ) ///< Maximum self-test value for arterial pressure sensor reading (in mmHg). + +#define VENOUS_PRESSURE_SELF_TEST_MIN ( -100.0 ) ///< Minimum self-test value for venous pressure sensor reading (in mmHg). +#define VENOUS_PRESSURE_SELF_TEST_MAX ( 600.0 ) ///< Maximum self-test value for venous pressure sensor reading (in mmHg). + #define PSI_TO_MMHG ( 51.7149 ) ///< Conversion factor for converting PSI to mmHg. #define VENOUS_PRESSURE_NORMAL_OP 0 ///< Venous pressure status bits indicate normal operation. @@ -58,6 +64,10 @@ #define EMPTY_SALINE_BAG_THRESHOLD_MMHG -300.0 ///< Threshold below which the saline bag is considered empty (in mmHg). TODO - get real threshold from Systems static const U32 EMPTY_SALINE_BAG_PERSISTENCE = ( 250 / TASK_GENERAL_INTERVAL ); ///< Time that saline bag looks empty before saying it is empty. TODO - use persistent alarm when updated +/// Occlusion sensors minimum pressure reading limit when no cartridge is loaded. +#define OCCLUSION_NO_CARTRIDGE_PRESSURE_READING_MIN 2000 +/// Occlusion sensors maximum pressure reading limit when cartridge is considered loaded. +#define OCCLUSION_CARTRIDGE_LOADED_PRESSURE_READING_MAX 20000 #define PRES_ALARM_PERSISTENCE ( 1 * MS_PER_SECOND ) ///< Alarm persistence period for pressure alarms. @@ -91,10 +101,6 @@ static OVERRIDE_U32_T dialInPumpOcclusion = {0, 0, 0, 0 }; ///< Measured dialysate inlet pump occlusion pressure. static OVERRIDE_U32_T dialOutPumpOcclusion = {0, 0, 0, 0 }; ///< Measured dialysate outlet pump occlusion pressure. -/// Current pressure self-test state. -static PRESSURE_SELF_TEST_STATE_T presOcclSelfTestState = PRESSURE_SELF_TEST_STATE_START; -static U32 bloodPumpSelfTestTimerCount = 0; ///< Timer counter for pressure self-test. - static U32 staleVenousPressureCtr = 0; ///< Timer counter for stale venous pressure reading. static U32 emptySalineBagCtr = 0; ///< Timer counter for empty bag detection. @@ -593,22 +599,95 @@ /*********************************************************************//** * @brief - * The execPresOcclTest function executes the state machine for the - * PresOccl self-test. + * The execPresOcclTest function executes the PresOccl self-test. * @details Inputs: none * @details Outputs: none - * @return the current state of the PresOccl self-test. + * @return the result of the PresOccl self-test. *************************************************************************/ SELF_TEST_STATUS_T execPresOcclTest( void ) { - SELF_TEST_STATUS_T result = SELF_TEST_STATUS_FAILED; + SELF_TEST_STATUS_T result = SELF_TEST_STATUS_PASSED; + + U32 const bpPressure = getMeasuredBloodPumpOcclusion(); + U32 const dialysateInPressure = getMeasuredDialInPumpOcclusion(); + U32 const dialysateOutPressure = getMeasuredDialOutPumpOcclusion(); + F32 const arterialPressure = getMeasuredArterialPressure(); + F32 const venousPressure = getMeasuredVenousPressure(); + + if ( ( bpPressure <= OCCLUSION_NO_CARTRIDGE_PRESSURE_READING_MIN ) || ( bpPressure >= OCCLUSION_THRESHOLD ) ) + { + result = SELF_TEST_STATUS_FAILED; + } + + if ( ( dialysateInPressure <= OCCLUSION_NO_CARTRIDGE_PRESSURE_READING_MIN ) || ( dialysateInPressure >= OCCLUSION_THRESHOLD ) ) + { + result = SELF_TEST_STATUS_FAILED; + } + + if ( ( dialysateOutPressure <= OCCLUSION_NO_CARTRIDGE_PRESSURE_READING_MIN ) || ( dialysateOutPressure >= OCCLUSION_THRESHOLD ) ) + { + result = SELF_TEST_STATUS_FAILED; + } + + if ( ( arterialPressure <= ARTERIAL_PRESSURE_SELF_TEST_MIN ) || ( arterialPressure >= ARTERIAL_PRESSURE_SELF_TEST_MAX ) ) + { + result = SELF_TEST_STATUS_FAILED; + } + + if ( ( venousPressure <= VENOUS_PRESSURE_SELF_TEST_MIN ) || ( venousPressure >= VENOUS_PRESSURE_SELF_TEST_MAX ) ) + { + result = SELF_TEST_STATUS_FAILED; + } - // TODO - implement self-test(s) - return result; } + +/*********************************************************************//** + * @brief + * The execPresOcclDryTest function executes the PresOccl dry self-test. + * @details Inputs: none + * @details Outputs: none + * @return the result of the PresOccl dry self-test. + *************************************************************************/ +SELF_TEST_STATUS_T execPresOcclDryTest( void ) +{ + SELF_TEST_STATUS_T result = SELF_TEST_STATUS_PASSED; + + U32 const bpPressure = getMeasuredBloodPumpOcclusion(); + U32 const dialysateInPressure = getMeasuredDialInPumpOcclusion(); + U32 const dialysateOutPressure = getMeasuredDialOutPumpOcclusion(); + + if ( ( bpPressure <= CARTRIDGE_LOADED_THRESHOLD ) || ( bpPressure >= OCCLUSION_CARTRIDGE_LOADED_PRESSURE_READING_MAX ) ) + { + result = SELF_TEST_STATUS_FAILED; + } + + if ( ( dialysateInPressure <= CARTRIDGE_LOADED_THRESHOLD ) || ( dialysateInPressure >= OCCLUSION_CARTRIDGE_LOADED_PRESSURE_READING_MAX ) ) + { + result = SELF_TEST_STATUS_FAILED; + } + + if ( ( dialysateOutPressure <= CARTRIDGE_LOADED_THRESHOLD ) || ( dialysateOutPressure >= OCCLUSION_CARTRIDGE_LOADED_PRESSURE_READING_MAX ) ) + { + result = SELF_TEST_STATUS_FAILED; + } + + if ( SELF_TEST_STATUS_FAILED == result ) + { + if ( ( bpPressure <= CARTRIDGE_LOADED_THRESHOLD ) && ( dialysateInPressure <= CARTRIDGE_LOADED_THRESHOLD ) && + ( dialysateOutPressure <= CARTRIDGE_LOADED_THRESHOLD ) ) + { + activateAlarmNoData( ALARM_ID_NO_CARTRIDGE_LOADED ); + } + else + { + activateAlarmNoData( ALARM_ID_CARTRIDGE_INSTALLED_IMPROPERLY ); + } + } + + return result; +} - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/