Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r88696f3c6a5d82503064a73433d39fa000728d93 -rc62f5bfffa8e54b86c8e320bee344308b368f96d --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 88696f3c6a5d82503064a73433d39fa000728d93) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision c62f5bfffa8e54b86c8e320bee344308b368f96d) @@ -303,34 +303,14 @@ static HD_PRE_TREATMENT_MODE_STATE_T handleHomeSetupState( void ) { HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_HOME_SETUP_STATE; - VALVE_T valve; - if ( TRUE == isBloodPumpRunning() ) - { - signalBloodPumpHardStop(); - } + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); - if ( TRUE == isDialInPumpRunning() ) - { - signalDialInPumpHardStop(); - } - - if ( TRUE == isDialOutPumpRunning() ) - { - signalDialOutPumpHardStop(); - } - if ( TRUE == getDoorState() ) { - for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) - { - homeValve( valve ); - } - - homeBloodPump(); - homeDialInPump(); - homeDialOutPump(); - + transitionToNoCartSelfTests(); state = HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; } else @@ -356,6 +336,7 @@ if ( FALSE == getDoorState() ) { + activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); state = HD_PRE_TREATMENT_HOME_SETUP_STATE; } Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r88696f3c6a5d82503064a73433d39fa000728d93 -rc62f5bfffa8e54b86c8e320bee344308b368f96d --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 88696f3c6a5d82503064a73433d39fa000728d93) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision c62f5bfffa8e54b86c8e320bee344308b368f96d) @@ -17,8 +17,11 @@ #include "BloodFlow.h" #include "DialInFlow.h" +#include "DialOutFlow.h" #include "PresOccl.h" #include "SelfTests.h" +#include "Timers.h" +#include "Valves.h" /** * @addtogroup SelfTests @@ -27,18 +30,24 @@ // ********** 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. + /// 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_OCCLUSION_SENSORS, ///< No cartridge self-test for occlusion sensors. - NO_CART_SELF_TESTS_BLOOD_FLOW_METERS, ///< No cartridge self-test for blood flow meter. - NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS, ///< No cartridge self-test for dialysate flow meter. - NO_CART_SELF_TESTS_VALVE_BLOOD_TRAP, ///< No cartridge self-test for valve blood trap. - NO_CART_SELF_TESTS_PUMPS, ///< No cartridge self-test for blood pump, dialysate in pump, dialysate out pump. - NO_CART_SELF_TESTS_LEAK_DETECTORS, ///< No cartridge self-test for leak detectors. - NO_CART_SELF_TESTS_BOARD_TEMPERATURE, ///< No cartridge self-test for board temperature. - NO_CART_SELF_TESTS_DOOR_SWITCH, ///< No cartridge self-test for door switch. + 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_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; @@ -48,20 +57,35 @@ static BOOL isNoCartSelfTestsResult; static NO_CART_SELF_TESTS_STATE_T currentNoCartSelfTestsState; +static U32 runPumpStartTime; + // ********** private function prototypes ********** /*********************************************************************//** * @brief - * The initPrime function initializes the prime sub-mode module. - * This function will reset anything required before the start of priming sequence. + * The initSelfTests function initializes the SelfTests module. * @details Inputs: none - * @details Outputs: Prime sub-mode module initialized. + * @details Outputs: SelfTests module initialized. * @return none *************************************************************************/ void initSelfTests( void ) { +} + +/*********************************************************************//** + * @brief + * The transitionToNoCartSelfTests function resets anything required before + * the start of no cartridge self-tests. + * @details Inputs: none + * @details Outputs: No cartridge self-tests re-initialized. + * @return none + *************************************************************************/ +void transitionToNoCartSelfTests( void ) +{ isNoCartSelfTestsResult = FALSE; currentNoCartSelfTestsState = NO_CART_SELF_TESTS_START_STATE; + + runPumpStartTime = 0; } /*********************************************************************//** @@ -74,54 +98,85 @@ 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: - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_OCCLUSION_SENSORS; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_OCCLUSION_SENSORS_STATE; break; - case NO_CART_SELF_TESTS_OCCLUSION_SENSORS: + case NO_CART_SELF_TESTS_OCCLUSION_SENSORS_STATE: result = execPresOcclTest(); - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_BLOOD_FLOW_METERS; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_BLOOD_FLOW_METERS_STATE; break; - case NO_CART_SELF_TESTS_BLOOD_FLOW_METERS: + case NO_CART_SELF_TESTS_BLOOD_FLOW_METERS_STATE: result = execBloodFlowTest(); - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS_STATE; break; - case NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS: + case NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS_STATE: result = execDialInFlowTest(); - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_VALVE_BLOOD_TRAP; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_PUMPS_START_STATE; break; - case NO_CART_SELF_TESTS_VALVE_BLOOD_TRAP: - // TODO: Implement self tests - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_PUMPS; + 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: - // TODO: Implement self tests - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_LEAK_DETECTORS; + case NO_CART_SELF_TESTS_PUMPS_STATE: + if ( TRUE == didTimeout( runPumpStartTime, PUMP_RUN_SELF_TEST_TIME ) ) + { + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_LEAK_DETECTORS_STATE; + } break; - case NO_CART_SELF_TESTS_LEAK_DETECTORS: + case NO_CART_SELF_TESTS_LEAK_DETECTORS_STATE: // TODO: Implement self tests - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_BOARD_TEMPERATURE; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE; break; - case NO_CART_SELF_TESTS_BOARD_TEMPERATURE: + case NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE: // TODO: Implement self tests - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_DOOR_SWITCH; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_DOOR_SWITCH_STATE; break; - case NO_CART_SELF_TESTS_DOOR_SWITCH: + case NO_CART_SELF_TESTS_DOOR_SWITCH_STATE: // TODO: Implement self tests - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_COMPLETE; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_HOME_VALVES_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; + 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() ) ) + { + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_COMPLETE; + } + break; + case NO_CART_SELF_TESTS_COMPLETE: isNoCartSelfTestsResult = TRUE; break; Index: firmware/App/Modes/SelfTests.h =================================================================== diff -u -r88696f3c6a5d82503064a73433d39fa000728d93 -rc62f5bfffa8e54b86c8e320bee344308b368f96d --- firmware/App/Modes/SelfTests.h (.../SelfTests.h) (revision 88696f3c6a5d82503064a73433d39fa000728d93) +++ firmware/App/Modes/SelfTests.h (.../SelfTests.h) (revision c62f5bfffa8e54b86c8e320bee344308b368f96d) @@ -35,10 +35,14 @@ void initSelfTests( void ); +void transitionToNoCartSelfTests(); void execNoCartSelfTests( void ); - BOOL isNoCartSelfTestsPassed( void ); +void transitionToDrySelfTests(); +void execDrySelfTests( void ); +BOOL isDrySelfTestsPassed( void ); + /**@}*/ #endif