Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r2cda58ab3f4f273b9afdbd95eeaa15f23777b5fd -rf7b149d8b8c9ea6ac58e4739101693d251d7a355 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 2cda58ab3f4f273b9afdbd95eeaa15f23777b5fd) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision f7b149d8b8c9ea6ac58e4739101693d251d7a355) @@ -32,40 +32,39 @@ // ********** private definitions ********** -#define PUMP_RUN_SELF_TEST_TIME ( 15 * MS_PER_SECOND ) ///< Self-test time to run pumps in ms. -#define PUMP_SELF_TEST_FLOW_RATE 100 ///< Self-test pump flow rate. +#define PUMP_RUN_SELF_TEST_TIME_MS ( 15 * MS_PER_SECOND ) ///< Self-test time to run pumps in ms. +#define PUMP_SELF_TEST_FLOW_RATE_ML 100 ///< Self-test pump flow rate in mL/min. -#define BLOOD_LEAK_SELF_TEST_SET 0x1 ///< Initiate blood leak self-test. -#define BLOOD_LEAK_NORMAL_OPERATION 0x0 ///< Return blood leak to normal operation. +#define BLOOD_LEAK_SELF_TEST_SET 0x1 ///< Initiate blood leak self-test. +#define BLOOD_LEAK_NORMAL_OPERATION 0x0 ///< Return blood leak to normal operation. -#define BLOOD_PUMP_RUN_TIME_PRESSURE_SELF_TEST ( 5 * MS_PER_SECOND ) ///< Pressure self-test time to run blood pump in ms. +#define BLOOD_PUMP_RUN_TIME_PRESSURE_SELF_TEST ( 5 * MS_PER_SECOND ) ///< Pressure self-test time to run blood pump in ms. -#define ARTERIAL_PRESSURE_SELF_TEST_LOW_LIMIT -50.0 ///< Arterial pressure low limit after running blood pump. -#define VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT 400 ///< Venous pressure high limit after running blood pump. +#define ARTERIAL_PRESSURE_SELF_TEST_LOW_LIMIT_MMHG -50.0 ///< Arterial pressure low limit after running blood pump. +#define VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG 400 ///< Venous pressure high limit after running blood pump. -#define NORMAL_PRESSURE_DIFF_TOLERANCE 5 ///< Difference in pressure readings after return to normal state tolerance (in mmHg). +#define NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG 5 ///< Difference in pressure readings after return to normal state tolerance (in mmHg). /// No cartridge self-tests state machine. typedef enum No_Cart_Self_Tests_State { NO_CART_SELF_TESTS_START_STATE = 0, ///< No cartridge self-tests starting state. + NO_CART_SELF_TESTS_WAIT_FOR_CLOSED_DOOR, ///< Wait for door to be closed before running self-tests. NO_CART_SELF_TESTS_OCCLUSION_SENSORS_STATE, ///< No cartridge occlusion sensors self-test state. NO_CART_SELF_TESTS_BLOOD_FLOW_METERS_STATE, ///< No cartridge blood flow meter self-test state. NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS_STATE, ///< No cartridge dialysate flow meter self-test state. - NO_CART_SELF_TESTS_PUMPS_START_STATE, ///< Start running blood pump, dialysate in pump, dialysate out pump state. NO_CART_SELF_TESTS_PUMPS_STATE, ///< No cartridge self-test for blood pump, dialysate in pump, dialysate out pump state. NO_CART_SELF_TESTS_LEAK_DETECTORS_STATE, ///< No cartridge leak detectors self-test state. NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE, ///< No cartridge board temperature self-test state. NO_CART_SELF_TESTS_DOOR_SWITCH_STATE, ///< No cartridge door switch self-test state. - NO_CART_SELF_TESTS_HOME_VALVES_STATE, ///< No cartridge home valves self-test state. - NO_CART_SELF_TESTS_HOME_PUMPS_STATE, ///< No cartridge home pumps self-test state. + NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE, ///< No cartridge home valves and pumps self-test state. NO_CART_SELF_TESTS_HOME_IDLE_STATE, ///< Wait for valves and pumps finish homing state. NO_CART_SELF_TESTS_COMPLETE, ///< No cartridge self-test complete state. NUM_OF_NO_CART_SELF_TESTS_STATES ///< Number of no cartridge self-tests states. } NO_CART_SELF_TESTS_STATE_T; /// Dry self-tests state machine. -typedef enum Dry_Self_Tests_state +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-test state. @@ -93,6 +92,7 @@ static BOOL noCartSelfTestsResult; ///< Result of no cartridge self-tests. static NO_CART_SELF_TESTS_STATE_T currentNoCartSelfTestsState; ///< Current state of the no cartridge self-tests state machine. static U32 runPumpStartTime; ///< Beginning time when pumps start running +static BOOL hasPumpsStarted; ///< Flag indicates if pumps have started running for self-test. static BOOL drySelfTestsResult; ///< Result of dry self-tests. static DRY_SELF_TESTS_STATE_T currentDrySelfTestsState; ///< Current state of the dry self-tests state machine. @@ -105,6 +105,11 @@ // ********** private function prototypes ********** +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestsWaitForClosedDoor( void ); +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestPumpsState( void ); +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeValvesAndPumpState( void ); +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestLeakDetectorsState( SELF_TEST_STATUS_T *result ); + /*********************************************************************//** * @brief * The initSelfTests function initializes the SelfTests module. @@ -127,6 +132,7 @@ void transitionToNoCartSelfTests( void ) { noCartSelfTestsResult = FALSE; + hasPumpsStarted = FALSE; currentNoCartSelfTestsState = NO_CART_SELF_TESTS_START_STATE; runPumpStartTime = 0; @@ -143,19 +149,22 @@ void execNoCartSelfTests( void ) { SELF_TEST_STATUS_T result = SELF_TEST_STATUS_PASSED; - VALVE_T valve; // execute no cartridge self-tests state machine switch ( currentNoCartSelfTestsState ) { case NO_CART_SELF_TESTS_START_STATE: #ifdef SKIP_SELF_TESTS - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_HOME_VALVES_STATE; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE; #else - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_OCCLUSION_SENSORS_STATE; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_WAIT_FOR_CLOSED_DOOR; #endif break; + case NO_CART_SELF_TESTS_WAIT_FOR_CLOSED_DOOR: + currentNoCartSelfTestsState = handleNoCartSelfTestsWaitForClosedDoor(); + break; + case NO_CART_SELF_TESTS_OCCLUSION_SENSORS_STATE: result = execPresOcclTest(); currentNoCartSelfTestsState = NO_CART_SELF_TESTS_BLOOD_FLOW_METERS_STATE; @@ -168,39 +177,15 @@ case NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS_STATE: result = execDialInFlowTest(); - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_PUMPS_START_STATE; - break; - - case NO_CART_SELF_TESTS_PUMPS_START_STATE: - setBloodPumpTargetFlowRate( PUMP_SELF_TEST_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setDialInPumpTargetFlowRate( PUMP_SELF_TEST_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setDialOutPumpTargetRate( PUMP_SELF_TEST_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - runPumpStartTime = getMSTimerCount(); currentNoCartSelfTestsState = NO_CART_SELF_TESTS_PUMPS_STATE; break; case NO_CART_SELF_TESTS_PUMPS_STATE: - if ( TRUE == didTimeout( runPumpStartTime, PUMP_RUN_SELF_TEST_TIME ) ) - { - signalBloodPumpHardStop(); - signalDialInPumpHardStop(); - signalDialOutPumpHardStop(); - - setFPGASensorTest( BLOOD_LEAK_SELF_TEST_SET ); - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_LEAK_DETECTORS_STATE; - } + currentNoCartSelfTestsState = handleNoCartSelfTestPumpsState(); break; case NO_CART_SELF_TESTS_LEAK_DETECTORS_STATE: - if ( TRUE == getFPGABloodLeakDetectorStatus() ) - { - setFPGASensorTest( BLOOD_LEAK_NORMAL_OPERATION ); - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE; - } - else - { - result = SELF_TEST_STATUS_FAILED; - } + currentNoCartSelfTestsState = handleNoCartSelfTestLeakDetectorsState( &result ); break; case NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE: @@ -210,24 +195,13 @@ case NO_CART_SELF_TESTS_DOOR_SWITCH_STATE: // TODO: Implement self tests - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_HOME_VALVES_STATE; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE; break; - case NO_CART_SELF_TESTS_HOME_VALVES_STATE: - for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) - { - homeValve( valve ); - } - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_HOME_PUMPS_STATE; + case NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE: + currentNoCartSelfTestsState = handleNoCartSelfTestHomeValvesAndPumpState(); break; - case NO_CART_SELF_TESTS_HOME_PUMPS_STATE: - homeBloodPump(); - homeDialInPump(); - homeDialOutPump(); - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_HOME_IDLE_STATE; - break; - case NO_CART_SELF_TESTS_HOME_IDLE_STATE: if ( ( FALSE == isDialInPumpRunning() ) && ( FALSE == isDialOutPumpRunning() ) && ( FALSE == isBloodPumpRunning() ) ) { @@ -328,17 +302,9 @@ break; case DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE: + if ( SELF_TEST_STATUS_PASSED == execPresOcclDryTest() ) { - SELF_TEST_STATUS_T const result = execPresOcclDryTest(); - - if ( SELF_TEST_STATUS_PASSED == result ) - { - currentDrySelfTestsState = DRY_SELF_TESTS_PRESSURE_SENSORS_SETUP_STATE; - } - else - { - activateAlarmNoData( ALARM_ID_CARTRIDGE_INSTALLED_IMPROPERLY ); - } + currentDrySelfTestsState = DRY_SELF_TESTS_PRESSURE_SENSORS_SETUP_STATE; } break; @@ -351,7 +317,7 @@ setValvePosition( VBA, VALVE_POSITION_B_OPEN ); setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); setValveAirTrap( STATE_CLOSED ); - setBloodPumpTargetFlowRate( PUMP_SELF_TEST_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setBloodPumpTargetFlowRate( PUMP_SELF_TEST_FLOW_RATE_ML, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); pressureSelfTestBloodPumpRunStartTime = getMSTimerCount(); currentDrySelfTestsState = DRY_SELF_TESTS_PRESSURE_SENSORS_STATE; @@ -362,7 +328,7 @@ F32 const arterialPressure = getMeasuredArterialPressure(); F32 const venousPressure = getMeasuredVenousPressure(); if ( ( TRUE == didTimeout( pressureSelfTestBloodPumpRunStartTime, BLOOD_PUMP_RUN_TIME_PRESSURE_SELF_TEST ) ) || - ( ARTERIAL_PRESSURE_SELF_TEST_LOW_LIMIT >= arterialPressure ) || ( VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT <= venousPressure ) ) + ( ARTERIAL_PRESSURE_SELF_TEST_LOW_LIMIT_MMHG >= arterialPressure ) || ( VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG <= venousPressure ) ) { if ( ( arterialPressure < 0) && ( venousPressure > 0 ) ) { @@ -383,7 +349,7 @@ F32 const arterialPressureDiff = fabs( getMeasuredArterialPressure() - previousNormalArterialPressure); F32 const venousPressureDiff = fabs( getMeasuredVenousPressure() - previousNormalVenousPressure); - if ( ( arterialPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE ) && ( venousPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE ) ) + if ( ( arterialPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) && ( venousPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) ) { currentDrySelfTestsState = DRY_SELF_TESTS_COMPLETE; } @@ -506,4 +472,112 @@ return wetSelfTestsResult; } + +/*********************************************************************//** + * @brief + * The handleNoCartridgeWaitForClosedDoor function executes the wait for + * door to be closed state of no cartridge self-tests state machine. + * @details Inputs: none + * @details Outputs: none + * @return the next state of no cartridge self-tests state machine + *************************************************************************/ +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestsWaitForClosedDoor( void ) +{ + NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_WAIT_FOR_CLOSED_DOOR; + + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); + + if ( STATE_CLOSED == getFPGADoorState() ) + { + state = NO_CART_SELF_TESTS_OCCLUSION_SENSORS_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleNoCartSelfTestPumpsState function runs blood, dialysate inlet, + * dialysate outlet pumps for certain time to make sure no alarms occur. + * @details Inputs: none + * @details Outputs: none + * @return the next state of no cartridge self-tests state machine + *************************************************************************/ +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestPumpsState( void ) +{ + NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_PUMPS_STATE; + + if ( FALSE == hasPumpsStarted ) + { + hasPumpsStarted = TRUE; + + setBloodPumpTargetFlowRate( PUMP_SELF_TEST_FLOW_RATE_ML, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialInPumpTargetFlowRate( PUMP_SELF_TEST_FLOW_RATE_ML, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialOutPumpTargetRate( PUMP_SELF_TEST_FLOW_RATE_ML, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + runPumpStartTime = getMSTimerCount(); + } + + if ( TRUE == didTimeout( runPumpStartTime, PUMP_RUN_SELF_TEST_TIME_MS ) ) + { + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); + + setFPGASensorTest( BLOOD_LEAK_SELF_TEST_SET ); + state = NO_CART_SELF_TESTS_LEAK_DETECTORS_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleNoCartSelfTestHomeValvesAndPumpState function homes all valves + * and pumps. + * @details Inputs: none + * @details Outputs: none + * @return the next state of no cartridge self-tests state machine + *************************************************************************/ +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeValvesAndPumpState( void ) +{ + VALVE_T valve; + + for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) + { + homeValve( valve ); + } + + homeBloodPump(); + homeDialInPump(); + homeDialOutPump(); + + return NO_CART_SELF_TESTS_HOME_IDLE_STATE; +} + +/*********************************************************************//** + * @brief + * The handleNoCartSelfTestLeakDetectorsState function verify leak detectors status. + * @details Inputs: none + * @details Outputs: none + * @return the next state of no cartridge self-tests state machine + *************************************************************************/ +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestLeakDetectorsState( SELF_TEST_STATUS_T *result ) +{ + NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_LEAK_DETECTORS_STATE; + + if ( TRUE == getFPGABloodLeakDetectorStatus() ) + { + setFPGASensorTest( BLOOD_LEAK_NORMAL_OPERATION ); + state = NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE; + } + else + { + *result = SELF_TEST_STATUS_FAILED; + } + + return state; +} + /**@}*/