Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -rf46193ce4cce48dee728dd93235e0452e8fe1963 -rf7b149d8b8c9ea6ac58e4739101693d251d7a355 --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision f46193ce4cce48dee728dd93235e0452e8fe1963) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision f7b149d8b8c9ea6ac58e4739101693d251d7a355) @@ -295,11 +295,10 @@ if ( ( DG_MODE_CIRC == getDGOpMode() ) && ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == getDGSubMode() ) && ( resUseVolumeMl >= (F32)dgReservoirFillVolumeTargetSet ) ) { - DG_RESERVOIR_ID_T activeRes = dgActiveReservoirSet; - DG_RESERVOIR_ID_T inactiveRes = ( activeRes == DG_RESERVOIR_1 ? DG_RESERVOIR_2 : DG_RESERVOIR_1 ); + DG_RESERVOIR_ID_T inactiveRes = getDGInactiveReservoir(); // Signal dialysis sub-mode to capture baseline volume for next reservoir. - setStartReservoirVolume(); + setStartReservoirVolume( inactiveRes ); // Command DG to switch reservoirs cmdSetDGActiveReservoir( inactiveRes ); // Signal dialysis sub-mode to switch reservoirs Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r22561b57504c9b3b0a6bb6fcc9430f02644fa030 -rf7b149d8b8c9ea6ac58e4739101693d251d7a355 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 22561b57504c9b3b0a6bb6fcc9430f02644fa030) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision f7b149d8b8c9ea6ac58e4739101693d251d7a355) @@ -60,10 +60,13 @@ #define MAX_TIME_BETWEEN_VENOUS_READINGS ( 500 / TASK_GENERAL_INTERVAL ) ///< Maximum time without fresh inline venous pressure reading. #define OCCLUSION_THRESHOLD 25000 ///< Threshold above which an occlusion is detected. -#define MINIMUM_PRESSURE_READING 2000 ///< Minimum pressure reading limit. -#define MAX_CARTRIDGE_LOADED_LIMIT 20000 ///< Pressure limit when cartridge is considered loaded. #define CARTRIDGE_LOADED_THRESHOLD 5000 ///< Threshold above which a cartridge is considered loaded. +/// 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. /// Defined states for the pressure and occlusion monitor state machine. @@ -579,17 +582,17 @@ F32 const arterialPressure = getMeasuredArterialPressure(); F32 const venousPressure = getMeasuredVenousPressure(); - if ( ( bpPressure <= MINIMUM_PRESSURE_READING ) || ( bpPressure >= OCCLUSION_THRESHOLD ) ) + if ( ( bpPressure <= OCCLUSION_NO_CARTRIDGE_PRESSURE_READING_MIN ) || ( bpPressure >= OCCLUSION_THRESHOLD ) ) { result = SELF_TEST_STATUS_FAILED; } - if ( ( dialysateInPressure <= MINIMUM_PRESSURE_READING ) || ( dialysateInPressure >= OCCLUSION_THRESHOLD ) ) + if ( ( dialysateInPressure <= OCCLUSION_NO_CARTRIDGE_PRESSURE_READING_MIN ) || ( dialysateInPressure >= OCCLUSION_THRESHOLD ) ) { result = SELF_TEST_STATUS_FAILED; } - if ( ( dialysateOutPressure <= MINIMUM_PRESSURE_READING ) || ( dialysateOutPressure >= OCCLUSION_THRESHOLD ) ) + if ( ( dialysateOutPressure <= OCCLUSION_NO_CARTRIDGE_PRESSURE_READING_MIN ) || ( dialysateOutPressure >= OCCLUSION_THRESHOLD ) ) { result = SELF_TEST_STATUS_FAILED; } @@ -622,21 +625,34 @@ U32 const dialysateInPressure = getMeasuredDialInPumpOcclusion(); U32 const dialysateOutPressure = getMeasuredDialOutPumpOcclusion(); - if ( ( bpPressure <= CARTRIDGE_LOADED_THRESHOLD ) || ( bpPressure >= MAX_CARTRIDGE_LOADED_LIMIT ) ) + if ( ( bpPressure <= CARTRIDGE_LOADED_THRESHOLD ) || ( bpPressure >= OCCLUSION_CARTRIDGE_LOADED_PRESSURE_READING_MAX ) ) { result = SELF_TEST_STATUS_FAILED; } - if ( ( dialysateInPressure <= CARTRIDGE_LOADED_THRESHOLD ) || ( dialysateInPressure >= MAX_CARTRIDGE_LOADED_LIMIT ) ) + if ( ( dialysateInPressure <= CARTRIDGE_LOADED_THRESHOLD ) || ( dialysateInPressure >= OCCLUSION_CARTRIDGE_LOADED_PRESSURE_READING_MAX ) ) { result = SELF_TEST_STATUS_FAILED; } - if ( ( dialysateOutPressure <= CARTRIDGE_LOADED_THRESHOLD ) || ( dialysateOutPressure >= MAX_CARTRIDGE_LOADED_LIMIT ) ) + 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; } Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r9df8618dfd95d3af354e6cbb590ebe6f6fd7ccdd -rf7b149d8b8c9ea6ac58e4739101693d251d7a355 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 9df8618dfd95d3af354e6cbb590ebe6f6fd7ccdd) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision f7b149d8b8c9ea6ac58e4739101693d251d7a355) @@ -1119,15 +1119,15 @@ * is the inactive reservoir) in order to get a more stable volume. * @details Inputs: active reservoir, load cell reading from inactive reservoir * @details Outputs: resStartVolume[] + * @param reservoirID reservoir ID to update the baseline volume. * @return none *************************************************************************/ -void setStartReservoirVolume( void ) +void setStartReservoirVolume( DG_RESERVOIR_ID_T reservoirID ) { - DG_RESERVOIR_ID_T inactiveRes = getDGInactiveReservoir(); - F32 resVolume = getReservoirWeightLargeFilter( inactiveRes ); + F32 resVolume = getReservoirWeightLargeFilter( reservoirID ); // Set starting baseline volume for next reservoir before we switch to it - resStartVolume[ inactiveRes ] = resVolume; + resStartVolume[ reservoirID ] = resVolume; } /*********************************************************************//** @@ -1141,8 +1141,7 @@ *************************************************************************/ void signalReservoirsSwitched( void ) { - DG_RESERVOIR_ID_T activeRes = getDGActiveReservoir(); - DG_RESERVOIR_ID_T inactiveRes = ( activeRes == DG_RESERVOIR_1 ? DG_RESERVOIR_2 : DG_RESERVOIR_1 ); + DG_RESERVOIR_ID_T inactiveRes = getDGInactiveReservoir(); // Update UF volume from prior reservoirs per tentative res volume for last reservoir measUFVolumeFromPriorReservoirs += ( resFinalVolume[ inactiveRes ] - resStartVolume[ inactiveRes ] ); Index: firmware/App/Modes/Dialysis.h =================================================================== diff -u -r212288307f429c25b9b49cbb60bf2a7c4c5f2786 -rf7b149d8b8c9ea6ac58e4739101693d251d7a355 --- firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision 212288307f429c25b9b49cbb60bf2a7c4c5f2786) +++ firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision f7b149d8b8c9ea6ac58e4739101693d251d7a355) @@ -20,6 +20,7 @@ #include "HDCommon.h" #include "HDDefs.h" +#include "DGInterface.h" /** * @defgroup Dialysis Dialysis @@ -65,7 +66,7 @@ BOOL pauseUF( void ); BOOL resumeUF( void ); -void setStartReservoirVolume( void ); +void setStartReservoirVolume( DG_RESERVOIR_ID_T reservoirID ); void signalReservoirsSwitched( void ); void setFinalReservoirVolume( void ); Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -re0e5aff5a2d873dac91dfb1c1086572f7f1647da -rf7b149d8b8c9ea6ac58e4739101693d251d7a355 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision e0e5aff5a2d873dac91dfb1c1086572f7f1647da) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision f7b149d8b8c9ea6ac58e4739101693d251d7a355) @@ -16,6 +16,7 @@ ***************************************************************************/ #include "AlarmMgmt.h" +#include "FPGA.h" #include "ModePreTreat.h" #include "OperationModes.h" #include "Prime.h" @@ -47,7 +48,6 @@ static void handleAlarmActionStop( void ); static void handleAlarmActionResume( void ); -static HD_PRE_TREATMENT_MODE_STATE_T handleHomeSetupState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ); @@ -57,8 +57,6 @@ static HD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handlePretreatmentPauseState( void ); -static BOOL getDoorState( void ); - /*********************************************************************//** * @brief * The initPreTreatmentMode function initializes the Pre-Treatment Mode module. @@ -113,13 +111,9 @@ break; case HD_PRE_TREATMENT_WATER_SAMPLE_STATE: - currentPreTreatmentState = HD_PRE_TREATMENT_HOME_SETUP_STATE; + currentPreTreatmentState = HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; break; - case HD_PRE_TREATMENT_HOME_SETUP_STATE: - currentPreTreatmentState = handleHomeSetupState(); - break; - case HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE: currentPreTreatmentState = handleSelfTestNoCartState(); break; @@ -291,38 +285,8 @@ } } - /*********************************************************************//** * @brief - * The handleHomeSetupState function waits for user to close door before - * transition to self-test no cartridge state. - * @details Inputs: none - * @details Outputs: transition to self-tests after door is closed - * @return current state (sub-mode) - *************************************************************************/ -static HD_PRE_TREATMENT_MODE_STATE_T handleHomeSetupState( void ) -{ - HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_HOME_SETUP_STATE; - - signalBloodPumpHardStop(); - signalDialInPumpHardStop(); - signalDialOutPumpHardStop(); - - if ( TRUE == getDoorState() ) - { - transitionToNoCartSelfTests(); - state = HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; - } - else - { - activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); - } - - return state; -} - -/*********************************************************************//** - * @brief * The handleSelfTestNoCartState function handles self-test with no cartridge. * @details Inputs: none * @details Outputs: home blood pump and dialysate pumps @@ -332,14 +296,13 @@ { HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; - execNoCartSelfTests(); - - if ( FALSE == getDoorState() ) + if ( STATE_OPEN == getFPGADoorState() ) { activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); - state = HD_PRE_TREATMENT_HOME_SETUP_STATE; } + execNoCartSelfTests(); + if ( TRUE == isNoCartSelfTestsPassed() ) { state = HD_PRE_TREATMENT_CART_INSTALL_STATE; @@ -377,14 +340,14 @@ { HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_SELF_TEST_DRY_STATE; - execDrySelfTests(); - - if ( FALSE == getDoorState() ) + if ( STATE_OPEN == getFPGADoorState() ) { activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); state = HD_PRE_TREATMENT_CART_INSTALL_STATE; } + execDrySelfTests(); + if ( ( TRUE == isAlarmActive( ALARM_ID_CARTRIDGE_INSTALLED_IMPROPERLY ) ) || ( TRUE == isAlarmActive( ALARM_ID_INSTALL_NEW_CARTRIDGE ) ) ) { state = HD_PRE_TREATMENT_CART_INSTALL_STATE; @@ -410,13 +373,13 @@ { HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_PRIME_STATE; - execPrime(); - - if ( FALSE == getDoorState() ) + if ( STATE_OPEN == getFPGADoorState() ) { activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); } + execPrime(); + if ( TRUE == isPrimeCompleted() ) { state = HD_PRE_TREATMENT_RECIRCULATE_START_STATE; @@ -495,8 +458,11 @@ *************************************************************************/ static HD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ) { + DG_RESERVOIR_ID_T const activeRes = getDGActiveReservoir(); + if ( TRUE == treatStartReqReceived ) { + setStartReservoirVolume( activeRes ); requestNewOperationMode( MODE_TREA ); } @@ -523,17 +489,4 @@ return state; } -/*********************************************************************//** - * @brief - * The getDoorState function gets the current state of door switch. - * @details Inputs: none - * @details Outputs: none - * @return TRUE if door is closed, otherwise FALSE - *************************************************************************/ -BOOL getDoorState( void ) -{ - // TODO: Get actual door state from FPGA or GPIO - return TRUE; -} - /**@}*/ Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r766708fceb0bdf1af8c7897df29d4f5036bfd3db -rf7b149d8b8c9ea6ac58e4739101693d251d7a355 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 766708fceb0bdf1af8c7897df29d4f5036bfd3db) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision f7b149d8b8c9ea6ac58e4739101693d251d7a355) @@ -120,7 +120,6 @@ case STANDBY_WAIT_FOR_TREATMENT_STATE: if ( TRUE == treatStartReqReceived ) { - setStartReservoirVolume(); requestNewOperationMode( MODE_TPAR ); treatStartReqReceived = FALSE; } 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; +} + /**@}*/ Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r6417c75d0c2a9643bcdb797065dbcde59e1dc734 -rf7b149d8b8c9ea6ac58e4739101693d251d7a355 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 6417c75d0c2a9643bcdb797065dbcde59e1dc734) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision f7b149d8b8c9ea6ac58e4739101693d251d7a355) @@ -1461,6 +1461,21 @@ /*********************************************************************//** * @brief + * The getDoorState function gets the current state of door switch. + * @details Inputs: none + * @details Outputs: none + * @return current door state + *************************************************************************/ +OPN_CLS_STATE_T getFPGADoorState( void ) +{ + // TODO: Get actual door state from FPGA or GPIO + BOOL const status = 0x0; + + return ( 0 == status ? STATE_CLOSED : STATE_OPEN ); +} + +/*********************************************************************//** + * @brief * The setFPGAValvesControlMode function sets the valves control mode. * @details Inputs: fpgaActuatorSetPoints * @details Outputs: fpgaActuatorSetPoints Index: firmware/App/Services/FPGA.h =================================================================== diff -u -r6417c75d0c2a9643bcdb797065dbcde59e1dc734 -rf7b149d8b8c9ea6ac58e4739101693d251d7a355 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision 6417c75d0c2a9643bcdb797065dbcde59e1dc734) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision f7b149d8b8c9ea6ac58e4739101693d251d7a355) @@ -80,6 +80,8 @@ void setFPGASensorTest( U08 sensorTest ); BOOL getFPGABloodLeakDetectorStatus( void ); +OPN_CLS_STATE_T getFPGADoorState( void ); + void setFPGAValvesControlMode( U16 bits ); U16 getFPGAValvesStatus( void );