Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rc62f5bfffa8e54b86c8e320bee344308b368f96d -rd8b6a463f9e65c8ac145cf634d5d6641fb3bbd89 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision c62f5bfffa8e54b86c8e320bee344308b368f96d) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision d8b6a463f9e65c8ac145cf634d5d6641fb3bbd89) @@ -376,6 +376,12 @@ { HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_SELF_TEST_DRY_STATE; + if ( FALSE == getDoorState() ) + { + activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); + state = HD_PRE_TREATMENT_CART_INSTALL_STATE; + } + if ( FALSE == isBloodPumpRunning() ) { transitionToPrime(); Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r9e50725381de45b2a32044f73e32c2c3ba0cc27a -rd8b6a463f9e65c8ac145cf634d5d6641fb3bbd89 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 9e50725381de45b2a32044f73e32c2c3ba0cc27a) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision d8b6a463f9e65c8ac145cf634d5d6641fb3bbd89) @@ -18,6 +18,7 @@ #include "BloodFlow.h" #include "DialInFlow.h" #include "DialOutFlow.h" +#include "FPGA.h" #include "PresOccl.h" #include "SelfTests.h" #include "Timers.h" @@ -56,6 +57,8 @@ typedef enum Dry_Self_Tests_state { DRY_SELF_TESTS_START_STATE = 0, ///< Dry self-tests starting state. + DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE, ///< Bubble detectors dry self-tests state. + DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE, ///< Occlusion sensors dry self-tests state. DRY_SELF_TESTS_COMPLETE, ///< Dry self-test complete state. NUM_OF_DRY_SELF_TESTS_STATES ///< Number of no cartridge self-tests states. } DRY_SELF_TESTS_STATE_T; @@ -241,10 +244,30 @@ { SELF_TEST_STATUS_T result = SELF_TEST_STATUS_PASSED; - // execute no cartridge self-tests state machine + // execute dry self-tests state machine switch ( currentDrySelfTestsState ) { case DRY_SELF_TESTS_START_STATE: + currentDrySelfTestsState = DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE; + break; + + case DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE: + { + BOOL const isADADetectedAir = getFPGAArterialAirBubbleStatus(); + BOOL const isADVDetectedAir = getFPGAVenousAirBubbleStatus(); + + if ( ( TRUE == isADADetectedAir ) && ( TRUE == isADADetectedAir ) ) + { + currentDrySelfTestsState = DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE; + } + else + { + activateAlarmNoData( ALARM_ID_INSTALL_NEW_CARTRIDGE ); + } + } + break; + + case DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE: currentDrySelfTestsState = DRY_SELF_TESTS_COMPLETE; break; Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r5dc6f629ae40d8939fd3bd7c4e3dffb04fa137e7 -rd8b6a463f9e65c8ac145cf634d5d6641fb3bbd89 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 5dc6f629ae40d8939fd3bd7c4e3dffb04fa137e7) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision d8b6a463f9e65c8ac145cf634d5d6641fb3bbd89) @@ -81,6 +81,9 @@ #define FPGA_AIRTRAP_LEVEL_LOW_MASK 0x0008 ///< Bit mask for air trap lower level sensor. #define FPGA_AIRTRAP_LEVEL_HIGH_MASK 0x0004 ///< Bit mask for air trap upper level sensor. +#define FPGA_ADA_INPUT_STATUS_MASK 0x0001 ///< Bit mask for arterial air bubble detector input status. +#define FPGA_ADV_INPUT_STATUS_MASK 0x0002 ///< Bit mask for venous air bubble detector input status. + // FPGA Sensors Record #pragma pack(push,1) /// Record structure for FPGA header read. @@ -1400,6 +1403,36 @@ /*********************************************************************//** * @brief + * The getFPGAArterialAirBubbleStatus function gets the latest arterial air + * bubble detector status. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return TRUE if air bubble is detected, otherwise FALSE + *************************************************************************/ +BOOL getFPGAArterialAirBubbleStatus( void ) +{ + U16 const status = fpgaSensorReadings.fpgaGPIO & FPGA_ADA_INPUT_STATUS_MASK; + + return ( 0 == status ? FALSE : TRUE ); +} + +/*********************************************************************//** + * @brief + * The getFPGAVenousAirBubbleStatus function gets the latest venous air + * bubble detector status. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return TRUE if air bubble is detected, otherwise FALSE + *************************************************************************/ +BOOL getFPGAVenousAirBubbleStatus( void ) +{ + U16 const status = fpgaSensorReadings.fpgaGPIO & FPGA_ADV_INPUT_STATUS_MASK; + + return ( 0 == status ? FALSE : TRUE ); +} + +/*********************************************************************//** + * @brief * The setFPGAValvesControlMode function sets the valves control mode. * @details Inputs: fpgaActuatorSetPoints * @details Outputs: fpgaActuatorSetPoints Index: firmware/App/Services/FPGA.h =================================================================== diff -u -r5dc6f629ae40d8939fd3bd7c4e3dffb04fa137e7 -rd8b6a463f9e65c8ac145cf634d5d6641fb3bbd89 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision 5dc6f629ae40d8939fd3bd7c4e3dffb04fa137e7) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision d8b6a463f9e65c8ac145cf634d5d6641fb3bbd89) @@ -74,6 +74,8 @@ void getFPGAAccelStatus( U16 *cnt, U16 *accelFPGAFaultReg ); void getFPGAAirTrapLevels( BOOL *airAtLower, BOOL *airAtUpper ); +BOOL getFPGAArterialAirBubbleStatus( void ); +BOOL getFPGAVenousAirBubbleStatus( void ); void setFPGAValvesControlMode( U16 bits ); U16 getFPGAValvesStatus( void );