Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -rf7b149d8b8c9ea6ac58e4739101693d251d7a355 -r8d14f6af0d1c2edd293a2157ed56b5e7e475d2df --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision f7b149d8b8c9ea6ac58e4739101693d251d7a355) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 8d14f6af0d1c2edd293a2157ed56b5e7e475d2df) @@ -20,7 +20,6 @@ #include "AirTrap.h" #include "BloodFlow.h" #include "Buttons.h" -#include "DGInterface.h" #include "Dialysis.h" #include "DialInFlow.h" #include "DialOutFlow.h" Index: firmware/App/Modes/Prime.c =================================================================== diff -u -re0e5aff5a2d873dac91dfb1c1086572f7f1647da -r8d14f6af0d1c2edd293a2157ed56b5e7e475d2df --- firmware/App/Modes/Prime.c (.../Prime.c) (revision e0e5aff5a2d873dac91dfb1c1086572f7f1647da) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 8d14f6af0d1c2edd293a2157ed56b5e7e475d2df) @@ -76,7 +76,7 @@ static HD_PRE_TREATMENT_PRIME_STATE_T previousPrimeState; ///< Previous state of the prime sub-mode, to use when resuming from pause. static PRIME_RESERVOIR_MGMT_STATE_T currentReservoirMgmtState; ///< Current reservoir management state. -static BOOL primeCompleteResult; ///< Prime complete status. +static BOOL primeCompleted; ///< Prime complete status. static U32 primeStartTime; ///< Starting time of priming (in ms). static U32 primePauseStartTime; ///< Priming pause start time (in ms). static U32 primeStatusBroadcastTimerCounter; ///< Prime status data broadcast timer counter used to schedule when to transmit data. @@ -136,7 +136,7 @@ currentPrimeState = HD_PRIME_START_STATE; currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_START_STATE; - primeCompleteResult = FALSE; + primeCompleted = FALSE; primeStartTime = getMSTimerCount(); primePauseStartTime = 0; primeStatusBroadcastTimerCounter = 0; @@ -207,7 +207,7 @@ break; case HD_PRIME_COMPLETE: - primeCompleteResult = TRUE; + primeCompleted = TRUE; break; case HD_PRIME_PAUSE: @@ -239,7 +239,7 @@ *************************************************************************/ BOOL isPrimeCompleted( void ) { - return primeCompleteResult; + return primeCompleted; } Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -rf7b149d8b8c9ea6ac58e4739101693d251d7a355 -r8d14f6af0d1c2edd293a2157ed56b5e7e475d2df --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision f7b149d8b8c9ea6ac58e4739101693d251d7a355) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 8d14f6af0d1c2edd293a2157ed56b5e7e475d2df) @@ -33,7 +33,7 @@ // ********** private definitions ********** #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 PUMP_SELF_TEST_FLOW_RATE_ML_MIN 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. @@ -78,7 +78,7 @@ } DRY_SELF_TESTS_STATE_T; /// Wet self-tests state machine. -typedef enum Wet_Self_Tests_state +typedef enum Wet_Self_Tests_State { WET_SELF_TESTS_START_STATE = 0, ///< Wet self-tests starting state. WET_SELF_TESTS_BUBBLE_DETECTOR_STATE, ///< Bubble detectors wet self-tests state. @@ -110,6 +110,12 @@ static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeValvesAndPumpState( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestLeakDetectorsState( SELF_TEST_STATUS_T *result ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestBubbleDetectorsState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestAirTrapState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsSetupState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsState( SELF_TEST_STATUS_T *result ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalState( SELF_TEST_STATUS_T *result ); + /*********************************************************************//** * @brief * The initSelfTests function initializes the SelfTests module. @@ -274,31 +280,11 @@ 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_AIR_TRAP_STATE; - } - else - { - activateAlarmNoData( ALARM_ID_INSTALL_NEW_CARTRIDGE ); - } - } + currentDrySelfTestsState = handleDrySelfTestBubbleDetectorsState(); break; case DRY_SELF_TESTS_AIR_TRAP_STATE: - if ( ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) && - ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) ) - { - currentDrySelfTestsState = DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE; - } - else - { - activateAlarmNoData( ALARM_ID_INSTALL_NEW_CARTRIDGE ); - } + currentDrySelfTestsState = handleDrySelfTestAirTrapState(); break; case DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE: @@ -309,55 +295,15 @@ break; case DRY_SELF_TESTS_PRESSURE_SENSORS_SETUP_STATE: - previousNormalArterialPressure = getMeasuredArterialPressure(); - previousNormalVenousPressure = getMeasuredVenousPressure(); - - setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); - setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); - setValvePosition( VBA, VALVE_POSITION_B_OPEN ); - setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); - setValveAirTrap( STATE_CLOSED ); - setBloodPumpTargetFlowRate( PUMP_SELF_TEST_FLOW_RATE_ML, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - pressureSelfTestBloodPumpRunStartTime = getMSTimerCount(); - - currentDrySelfTestsState = DRY_SELF_TESTS_PRESSURE_SENSORS_STATE; + currentDrySelfTestsState = handleDrySelfTestPressureSensorsSetupState(); break; case DRY_SELF_TESTS_PRESSURE_SENSORS_STATE: - { - 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_MMHG >= arterialPressure ) || ( VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG <= venousPressure ) ) - { - if ( ( arterialPressure < 0) && ( venousPressure > 0 ) ) - { - setValvePosition( VBV, VALVE_POSITION_B_OPEN ); - setValveAirTrap( STATE_CLOSED ); - currentDrySelfTestsState = DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_STATE; - } - else - { - result = SELF_TEST_STATUS_FAILED; - } - } - } + currentDrySelfTestsState = handleDrySelfTestPressureSensorsState( &result ); break; case DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_STATE: - { - F32 const arterialPressureDiff = fabs( getMeasuredArterialPressure() - previousNormalArterialPressure); - F32 const venousPressureDiff = fabs( getMeasuredVenousPressure() - previousNormalVenousPressure); - - if ( ( arterialPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) && ( venousPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) ) - { - currentDrySelfTestsState = DRY_SELF_TESTS_COMPLETE; - } - else - { - result = SELF_TEST_STATUS_FAILED; - } - } + currentDrySelfTestsState = handleDrySelfTestPressureSensorsNormalState( &result ); break; case DRY_SELF_TESTS_COMPLETE: @@ -513,9 +459,9 @@ { 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 ); + setBloodPumpTargetFlowRate( PUMP_SELF_TEST_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialInPumpTargetFlowRate( PUMP_SELF_TEST_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialOutPumpTargetRate( PUMP_SELF_TEST_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); runPumpStartTime = getMSTimerCount(); } @@ -580,4 +526,139 @@ return state; } +/*********************************************************************//** + * @brief + * The handleDrySelfTestBubbleDetectorsState function verify no fluid is detected + * by bubble detectors. + * @details Inputs: none + * @details Outputs: none + * @return the next state of dry self-tests state machine + *************************************************************************/ +static DRY_SELF_TESTS_STATE_T handleDrySelfTestBubbleDetectorsState( void ) +{ + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE; + + BOOL const isADADetectedAir = getFPGAArterialAirBubbleStatus(); + BOOL const isADVDetectedAir = getFPGAVenousAirBubbleStatus(); + + if ( ( TRUE == isADADetectedAir ) && ( TRUE == isADADetectedAir ) ) + { + state = DRY_SELF_TESTS_AIR_TRAP_STATE; + } + else + { + activateAlarmNoData( ALARM_ID_INSTALL_NEW_CARTRIDGE ); + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleDrySelfTestAirTrapState function verify no fluid is detected + * by air trap. + * @details Inputs: none + * @details Outputs: none + * @return the next state of dry self-tests state machine + *************************************************************************/ +static DRY_SELF_TESTS_STATE_T handleDrySelfTestAirTrapState( void ) +{ + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_AIR_TRAP_STATE; + + if ( ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) && + ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) ) + { + state = DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE; + } + else + { + activateAlarmNoData( ALARM_ID_INSTALL_NEW_CARTRIDGE ); + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleDrySelfTestPressureSensorsSetupState function handles the setup + * for pressure sensors dry self-test. + * @details Inputs: none + * @details Outputs: none + * @return the next state of dry self-tests state machine + *************************************************************************/ +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsSetupState( void ) +{ + previousNormalArterialPressure = getMeasuredArterialPressure(); + previousNormalVenousPressure = getMeasuredVenousPressure(); + + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBA, VALVE_POSITION_B_OPEN ); + setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); + setValveAirTrap( STATE_CLOSED ); + setBloodPumpTargetFlowRate( PUMP_SELF_TEST_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + pressureSelfTestBloodPumpRunStartTime = getMSTimerCount(); + + return DRY_SELF_TESTS_PRESSURE_SENSORS_STATE; +} + +/*********************************************************************//** + * @brief + * The handleDrySelfTestPressureSensorsState function tests the readings of + * pressure sensors and verify they are in correct range. + * @details Inputs: none + * @details Outputs: none + * @return the next state of dry self-tests state machine + *************************************************************************/ +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsState( SELF_TEST_STATUS_T *result ) +{ + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_SENSORS_STATE; + + 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_MMHG >= arterialPressure ) || ( VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG <= venousPressure ) ) + { + if ( ( arterialPressure < 0) && ( venousPressure > 0 ) ) + { + setValvePosition( VBV, VALVE_POSITION_B_OPEN ); + setValveAirTrap( STATE_CLOSED ); + state = DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_STATE; + } + else + { + *result = SELF_TEST_STATUS_FAILED; + } + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleDrySelfTestPressureSensorsNormalState function verify the readings of + * pressure sensors after returning to normal state. + * @details Inputs: none + * @details Outputs: none + * @return the next state of dry self-tests state machine + *************************************************************************/ +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalState( SELF_TEST_STATUS_T *result ) +{ + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_STATE; + + F32 const arterialPressureDiff = fabs( getMeasuredArterialPressure() - previousNormalArterialPressure); + F32 const venousPressureDiff = fabs( getMeasuredVenousPressure() - previousNormalVenousPressure); + + if ( ( arterialPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) && ( venousPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) ) + { + state = DRY_SELF_TESTS_COMPLETE; + } + else + { + *result = SELF_TEST_STATUS_FAILED; + } + + return state; +} + /**@}*/