Index: firmware/App/Controllers/DialysatePumps.c =================================================================== diff -u -r724b64673b719eaac10b0c9dd839ad9675274911 -rf6022e86136c821709ce24b61e11e8e2bdf0b11e --- firmware/App/Controllers/DialysatePumps.c (.../DialysatePumps.c) (revision 724b64673b719eaac10b0c9dd839ad9675274911) +++ firmware/App/Controllers/DialysatePumps.c (.../DialysatePumps.c) (revision f6022e86136c821709ce24b61e11e8e2bdf0b11e) @@ -60,10 +60,8 @@ #define MAX_FPGA_DIALYSATE_PUMP_DIRECTION_FAULT_WINDOW_MS ( 1 * SEC_PER_MIN * MS_PER_SECOND ) ///< FPGA dialysate pump direction fault window #define MAX_FPGA_DIALYSATE_PUMP_DIRECTION_FAULT_FAILURES 10 ///< FPGA dialysate pump direction fault failures per MAX_FPGA_DIALYSATE_PUMP_DIRECTION_FAULT_WINDOW_MS -#define FRESH_DIALYSATE_TARGET_PRESSURE_PSI 25.0F ///< Fresh dialysate pump recommended pressure(D18) in psi. -#define FRESH_DIALYSATE_MAX_PRESSURE_PSI 26.0F ///< Fresh dialysate pump maximum allowed (D18) pressure in psi. -#define SPENT_DIALYSATE_TARGET_PRESSURE_PSI 29.0F ///< Spent dialysate pump recommended pressure(PDs) in psi. -#define SPENT_DIALYSATE_MAX_PRESSURE_PSI 30.0F ///< Spent dialysate pump maximum allowed (PDs) pressure in psi. +#define DEFAULT_FRESH_DIALYSATE_TARGET_PRESSURE_PSI -12.79F ///< Default degas pump(D18) target pressure (at zero sea level)in psi. +#define DEFAULT_SPENT_DIALYSATE_TARGET_PRESSURE_PSI 30.0F ///< Default spent dialysate pump target pressure(D48) in psi. #define FRESH_DIAL_OPEN_LOOP_SPEED_RPM 2000.0F ///< fresh dialysate pump open loop speed to meet target pressure. #define SPENT_DIAL_OPEN_LOOP_SPEED_RPM 2500.0F ///< spent dialysate pump open loop speed to meet target pressure. #define DIALYSATE_PUMP_SPEED_ZERO_RPM 0 ///< Dialysate pump zero RPM speed. @@ -75,6 +73,8 @@ #define D48_PUMP_P_COEFFICIENT 20.0F ///< P term for spent dialysate pump delta pressure control. #define D48_PUMP_I_COEFFICIENT 60.0F ///< I term for spent dialysate pump delta pressure control. #define DIAL_PUMP_NO_FEED_FORWARD 0.0F ///< Feedforward term for dialysate pump control +#define DEGAS_PUMP_SLOPE_FACTOR -0.0156F ///< Dialysate pump target pressure multiply factor ( m factor in 'y = mx + b' equation) +#define DEGAS_PUMP_INTERCEPT_FACTOR 0.1153F ///< Dialysate pump target pressure addition factor ( b factor in 'y = mx + b' equation) #define MAX_ALLOWED_RPM_OUT_OF_RANGE 300 ///< Maximum allowed RPM out of range from target RPM in open loop. #define PUMP_TRANS_TO_RAMP_SPEED_THRESHOLD 20.0F ///< Speed change that alters the state to ramp during control state. @@ -153,6 +153,7 @@ static DIALYSATE_PUMP_STATE_T handleDialysatePumpRampToTargetState( DIALYSATE_PUMPS_T pumpId ); static DIALYSATE_PUMP_STATE_T handleDialysatePumpOffState( DIALYSATE_PUMPS_T pumpId ); static void monitorPumpDirectionErrorCount( DIALYSATE_PUMPS_T pumpId ); +static void calculateDegasPumpTargetPressure( void ); /*********************************************************************//** * @brief @@ -202,13 +203,13 @@ signalDialysatePumpHardStop( pumpId ); } - pumpTargetPressure[D12_PUMP].data = FRESH_DIALYSATE_TARGET_PRESSURE_PSI; - pumpTargetPressure[D12_PUMP].ovInitData = FRESH_DIALYSATE_TARGET_PRESSURE_PSI; + pumpTargetPressure[D12_PUMP].data = DEFAULT_FRESH_DIALYSATE_TARGET_PRESSURE_PSI; + pumpTargetPressure[D12_PUMP].ovInitData = DEFAULT_FRESH_DIALYSATE_TARGET_PRESSURE_PSI; pumpTargetPressure[D12_PUMP].ovData = 0.0F; pumpTargetPressure[D12_PUMP].override = OVERRIDE_RESET; - pumpTargetPressure[D48_PUMP].data = SPENT_DIALYSATE_TARGET_PRESSURE_PSI; - pumpTargetPressure[D48_PUMP].ovInitData = SPENT_DIALYSATE_TARGET_PRESSURE_PSI; + pumpTargetPressure[D48_PUMP].data = DEFAULT_SPENT_DIALYSATE_TARGET_PRESSURE_PSI; + pumpTargetPressure[D48_PUMP].ovInitData = DEFAULT_SPENT_DIALYSATE_TARGET_PRESSURE_PSI; pumpTargetPressure[D48_PUMP].ovData = 0.0F; pumpTargetPressure[D48_PUMP].override = OVERRIDE_RESET; @@ -251,6 +252,23 @@ /*********************************************************************//** * @brief + * The calculateDegasPumpTargetPressure function gets the barometric pressure + * sensor reading to calcualte degassing pump(D12) target control pressure for closed + * loop control. + * @details \b Inputs: none + * @details \b Outputs: pumpTargetSpeed. + * @return none + *************************************************************************/ +static void calculateDegasPumpTargetPressure( void ) +{ + F32 pressureInmmHg = getFilteredPressure( BARO_PRES ); + + //Get the degassing target pressure + pumpTargetPressure[D12_PUMP].data = ( ( DEGAS_PUMP_SLOPE_FACTOR * pressureInmmHg ) + DEGAS_PUMP_INTERCEPT_FACTOR ) + DEGAS_PUMP_TARGET_PRES_ADJ_THRESHOLD; +} + +/*********************************************************************//** + * @brief * The setDialysatePumpTargetSpeed function sets a new target RPM for the * dialysate pump. * @details \b Inputs: none @@ -281,9 +299,13 @@ pumpTargetSpeed[ pumpId ].data = MAX_DIALYSATE_PUMP_RPM; } - // Open loop or close loop control + // Assign Open loop or close loop control isDialPumpOpenLoopEnabled[ pumpId ] = isOpenLoopControlEnabled; +#ifdef __BARO_PRES_SENSOR__ + //Update Degas pump target speed + calculateDegasPumpTargetPressure(); +#endif //handle target speed update when pump is running if ( DIALYSATE_PUMP_CONTROL_TO_TARGET_STATE == dialysatePumps[ pumpId ].dialysatePumpState ) { Index: firmware/App/Controllers/DialysatePumps.h =================================================================== diff -u -r5422509f9d8db102b62952ba9f5923e832d6b2fa -rf6022e86136c821709ce24b61e11e8e2bdf0b11e --- firmware/App/Controllers/DialysatePumps.h (.../DialysatePumps.h) (revision 5422509f9d8db102b62952ba9f5923e832d6b2fa) +++ firmware/App/Controllers/DialysatePumps.h (.../DialysatePumps.h) (revision f6022e86136c821709ce24b61e11e8e2bdf0b11e) @@ -32,11 +32,12 @@ // ********** public definitions ********** -#define MIN_DIALYSATE_PUMP_RPM 350 ///< Minimum RPM target for dialysate pump (though zero is allowed if turning pump off). -#define MAX_DIALYSATE_PUMP_RPM 2650 ///< Maximum RPM target for dialysate pump. +#define MIN_DIALYSATE_PUMP_RPM 350 ///< Minimum RPM target for dialysate pump (though zero is allowed if turning pump off). +#define MAX_DIALYSATE_PUMP_RPM 2650 ///< Maximum RPM target for dialysate pump. +#define DEGAS_PUMP_TARGET_PRES_ADJ_THRESHOLD -1.0F ///< Dialysate Pump(D12) target pressure threshold adjustment factor. -#define MIN_DIALYSATE_FLOW_RATE ( 100.0F ) ///< Minimum dialysate flow rate -#define MAX_DIALYSATE_FLOW_RATE ( 600.0F ) ///< Maximum dialysate flow rate +#define MIN_DIALYSATE_FLOW_RATE ( 100.0F ) ///< Minimum dialysate flow rate +#define MAX_DIALYSATE_FLOW_RATE ( 600.0F ) ///< Maximum dialysate flow rate /// Enumeration of dialysate pumps. typedef enum DialysatePumps Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r0d0febfa1b9e9e8d72f9db47f21b8c7882d91740 -rf6022e86136c821709ce24b61e11e8e2bdf0b11e --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 0d0febfa1b9e9e8d72f9db47f21b8c7882d91740) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision f6022e86136c821709ce24b61e11e8e2bdf0b11e) @@ -618,9 +618,9 @@ if ( TRUE == startupHeaterControl ) { startupHeaterControl = FALSE; + F32 deltaTempC = targetTemperature - inletTemperature; //TODO : testing - //F32 deltaTempC = targetTemperature - inletTemperature; - F32 deltaTempC = 10.0F; // Hard code for testing, later remove it. + //F32 deltaTempC = 10.0F; // Hard code for testing, later remove it. F32 capDeltaTempC = MAX( deltaTempC, HEATERS_ZERO_DELTA_TEMP_C ); F32 flowrate = getTDDialysateFlowrate() / LITER_IN_ML ; F32 feedforward = calculateDutyCycle( flowrate, capDeltaTempC, PRIMARY_HEATER_MAX_PWR_WATTS, AC_HEATER_EFFICIENCY, Index: firmware/App/DDCommon.h =================================================================== diff -u -r2332d35e7db7dd3b4b58e79433ebcf9fd28a1544 -rf6022e86136c821709ce24b61e11e8e2bdf0b11e --- firmware/App/DDCommon.h (.../DDCommon.h) (revision 2332d35e7db7dd3b4b58e79433ebcf9fd28a1544) +++ firmware/App/DDCommon.h (.../DDCommon.h) (revision f6022e86136c821709ce24b61e11e8e2bdf0b11e) @@ -48,6 +48,9 @@ //Uncomment below if diener concentrate pump used #define __DIENER_CONC_PUMP__ 1 +//Uncomment below if barometric pressure sensor reading available +//#define __BARO_PRES_SENSOR__ 1 + //Uncomment below to disable heaters debug message #define __HEATERS_DEBUG__ 1 Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -r3cc784af591b14e5d292f92c796db70bcbd5a40b -rf6022e86136c821709ce24b61e11e8e2bdf0b11e --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 3cc784af591b14e5d292f92c796db70bcbd5a40b) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision f6022e86136c821709ce24b61e11e8e2bdf0b11e) @@ -40,8 +40,6 @@ // ********** private definitions ********** -#define FRESH_DIAL_PUMP_INITIAL_RPM 2500 ///< Nominal RPM target for fresh dialysate pump to maintain required pressure. -#define SPENT_DIAL_PUMP_INITIAL_RPM 2000 ///< Nominal RPM target for spent dialysate pump to maintain required pressure. #define HYD_CHAMBER_FLUID_TEMP_C_MIN 35.0F ///< Minimum hydraulics fluid temperature in deg celcius #define GEN_DIALYSATE_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen dialysate mode data published. @@ -66,7 +64,6 @@ // ********** private function prototypes ********** static void setModeGenDStateTransition( DD_GEND_MODE_STATE_T state ); -static BOOL hydChamberWaterInletControl( void ); static DD_GEND_MODE_STATE_T handleGenDDialysateBypassState( void ); static DD_GEND_MODE_STATE_T handleGenDDialysateDeliveryState( void ); static DD_GEND_MODE_STATE_T handleGenDDialysateDeliveryPauseState( void ); @@ -314,12 +311,15 @@ * @details \b Outputs: none * @return the current state of gen dialysate mode *************************************************************************/ -static BOOL hydChamberWaterInletControl( void ) +BOOL hydChamberWaterInletControl( void ) { // Read floater switch BOOL result = FALSE; LEVEL_STATE_T floaterLevel = getLevelStatus( D6_LEVL ); + //Make sure Water Inlet Valve is open + setValveState( M4_VALV, VALVE_STATE_OPEN ); + // Get the target temperature from TD targetHydChamberFluidTemp.data = getTDTargetDialysateTemperature(); Index: firmware/App/Modes/ModeGenDialysate.h =================================================================== diff -u -r6408d79e3a9a543e90b2fa7ab823be348befd391 -rf6022e86136c821709ce24b61e11e8e2bdf0b11e --- firmware/App/Modes/ModeGenDialysate.h (.../ModeGenDialysate.h) (revision 6408d79e3a9a543e90b2fa7ab823be348befd391) +++ firmware/App/Modes/ModeGenDialysate.h (.../ModeGenDialysate.h) (revision f6022e86136c821709ce24b61e11e8e2bdf0b11e) @@ -31,6 +31,9 @@ // ********** public definitions ********** +#define FRESH_DIAL_PUMP_INITIAL_RPM 2500 ///< Nominal RPM target for fresh dialysate pump to maintain required pressure. +#define SPENT_DIAL_PUMP_INITIAL_RPM 2000 ///< Nominal RPM target for spent dialysate pump to maintain required pressure. + /// Generate dialysate mode data structure typedef struct { @@ -52,6 +55,7 @@ U32 execGenDialysateMode( void ); // Execute the gen dialysate mode state machine (call from OperationModes) void execGenDialysateMonitor( void ); // Dialysate generation monitor +BOOL hydChamberWaterInletControl( void ); // Hydraulics chamber inlet water control DD_GEND_MODE_STATE_T getCurrentGenDialysateState( void ); // Get the current state of the gen dialysate mode. U32 getDialGoodToDeliverStatus( void ); // Get the dialysate good to deliver status void setTreatmentParamUpdate( void ); // To indicate one or more treatment parameters updated Index: firmware/App/Modes/ModePreGenDialysate.c =================================================================== diff -u -r6408d79e3a9a543e90b2fa7ab823be348befd391 -rf6022e86136c821709ce24b61e11e8e2bdf0b11e --- firmware/App/Modes/ModePreGenDialysate.c (.../ModePreGenDialysate.c) (revision 6408d79e3a9a543e90b2fa7ab823be348befd391) +++ firmware/App/Modes/ModePreGenDialysate.c (.../ModePreGenDialysate.c) (revision f6022e86136c821709ce24b61e11e8e2bdf0b11e) @@ -19,10 +19,13 @@ #include "DialysatePumps.h" #include "Heaters.h" #include "ModePreGenDialysate.h" +#include "ModeGenDialysate.h" #include "ModeFault.h" #include "Messaging.h" #include "OperationModes.h" +#include "Pressure.h" #include "TaskGeneral.h" +#include "Timers.h" #include "Utilities.h" #include "Valves.h" @@ -34,21 +37,34 @@ // ********** private definitions ********** /// Interval (ms/task time) at which the pre-treatment state data is published on the CAN bus. -#define PRE_GEN_DIALYSATE_DATA_PUB_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) +#define PRE_GEN_DIALYSATE_DATA_PUB_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the pre-gen dialysate mode data published. +#define HYD_CHAMBER_PRES_CHECK_TIME_OUT ( 30 * MS_PER_SECOND ) ///< Time out period when hydraulics chamber pressure check initiated +#define NEG_PRES_PERSISTENCE_TIME_MS ( 1 * MS_PER_SECOND ) ///< Persistence time for Hydraulics chamber negative degassing pressure check. // ********** private data ********** -static DD_PRE_GEN_DAILYSATE_STATE_T preGenDialysateState; ///< Currently active pre-gen dialysate state. -static OVERRIDE_U32_T pendingStartDDGenDialRequest; ///< Flag indicating TD has requested DD start the generation dialysate request(Overridable). -static OVERRIDE_U32_T pendingStopDDPreGenDialRequest; ///< Flag indicating TD has requested DD stop the pre generation dialysate (Overridable). -static U32 preGenDialysatePublishTimerCounter; ///< Pre-Gen Dialysate data broadcast timer counter used to schedule when to transmit data. -static OVERRIDE_U32_T preGenDialysateModePublishInterval; ///< Interval (in task intervals) at which to publish pre-gen dialysate mode data to CAN bus. +static DD_PRE_GEN_DIALYSATE_STATE_T preGenDialysateState; ///< Currently active pre-gen dialysate state. +static DD_WET_SELF_TEST_STATE_T wetSelfTestState; ///< Currently active pre-gen Wet self test state. +static U32 hydChamberPressureCheckStartTimeMS; ///< Current time when hydraulics chamber pressure check started in milliseconds. +static U32 pressureCheckPersistanceStartTimeMS; ///< Current time for pressure check persistance time started in milliseconds. +static OVERRIDE_U32_T pendingStartDDGenDialRequest; ///< Flag indicating TD has requested DD start the generation dialysate request(Overridable). +static OVERRIDE_U32_T pendingStopDDPreGenDialRequest; ///< Flag indicating TD has requested DD stop the pre generation dialysate (Overridable). +static U32 preGenDialysatePublishTimerCounter; ///< Pre-Gen Dialysate data broadcast timer counter used to schedule when to transmit data. +static OVERRIDE_U32_T preGenDialysateModePublishInterval; ///< Interval (in task intervals) at which to publish pre-gen dialysate mode data to CAN bus. // ********** private function prototypes ********** static void publishPreGenDialysateState( void ); -static DD_PRE_GEN_DAILYSATE_STATE_T handlePreGenDialysateFillCompleteCheckState( void ); +static DD_PRE_GEN_DIALYSATE_STATE_T handlePreGenDialysateFillCompleteCheckState( void ); +static DD_PRE_GEN_DIALYSATE_STATE_T handlePreGenWetSelfTestState( void ); +//Wet Self test +static void setModePreGenWetSelfStateTransition( DD_WET_SELF_TEST_STATE_T state ); +static void execWetSelfTest( void ); +static DD_WET_SELF_TEST_STATE_T handleNegativeDeaerationPressureCheckState( void ); +static DD_WET_SELF_TEST_STATE_T handlePositiveDeaerationPressureCheckState( void ); + + /*********************************************************************//** * @brief * The initPreGenDialysateMode function initializes the Pre-Generation @@ -60,6 +76,9 @@ void initPreGenDialysateMode( void ) { preGenDialysateState = DD_PRE_GEN_DIALYSATE_HYD_CHAMBER_FILL_CHECK; + wetSelfTestState = DD_WET_SELF_TEST_START; + hydChamberPressureCheckStartTimeMS = 0; + pressureCheckPersistanceStartTimeMS = 0; pendingStartDDGenDialRequest.data = FALSE; pendingStartDDGenDialRequest.ovData = FALSE; pendingStartDDGenDialRequest.ovInitData = FALSE; @@ -104,6 +123,9 @@ *************************************************************************/ U32 execPreGenDialysateMode( void ) { + //Manage Inlet water control + hydChamberWaterInletControl(); + //TODO: To be placed in correct states once states defined. if ( TRUE == getU32OverrideValue( &pendingStartDDGenDialRequest ) ) { @@ -125,6 +147,10 @@ preGenDialysateState = handlePreGenDialysateFillCompleteCheckState(); break; + case DD_PRE_GEN_WET_SELF_TEST: + preGenDialysateState = handlePreGenWetSelfTestState(); + break; + case DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND: // TODO : handle wait for Gen dialysate break; @@ -148,7 +174,7 @@ * @details \b Outputs: none * @return current state of PreGenDialysate mode *************************************************************************/ -DD_PRE_GEN_DAILYSATE_STATE_T getCurrentPreGenDialysateState( void ) +DD_PRE_GEN_DIALYSATE_STATE_T getCurrentPreGenDialysateState( void ) { return preGenDialysateState; } @@ -203,16 +229,207 @@ * @details \b Outputs: none * @return current state of PreGenDialysate mode *************************************************************************/ -static DD_PRE_GEN_DAILYSATE_STATE_T handlePreGenDialysateFillCompleteCheckState( void ) +static DD_PRE_GEN_DIALYSATE_STATE_T handlePreGenDialysateFillCompleteCheckState( void ) { //TODO: define hydroblock fill complete process - DD_PRE_GEN_DAILYSATE_STATE_T state = DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND; + DD_PRE_GEN_DIALYSATE_STATE_T state = DD_PRE_GEN_WET_SELF_TEST; return state; } /*********************************************************************//** * @brief + * The handlePreGenWetSelfTestState function executes the series of self + * tests with the conecentrates and dialysate. + * @details \b Inputs: state + * @details \b Outputs: none + * @return current state of PreGenDialysate mode + *************************************************************************/ +static DD_PRE_GEN_DIALYSATE_STATE_T handlePreGenWetSelfTestState( void ) +{ + //TODO: Change to wet self test state later + DD_PRE_GEN_DIALYSATE_STATE_T state = DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND; + + //execWetSelfTest(); + + return state; +} + +/*********************************************************************//** + * @brief + * The setModePreGenWetSelfStateTransition function sets the actuators and variables + * for the state transition in pre-gen WetSlef test mode. + * @details Inputs: Valve states, Pump speed + * @details Outputs: Actuate valves, pumps as desired. + * @param state pre gen wet self test state enum + * @return none + *************************************************************************/ +static void setModePreGenWetSelfStateTransition( DD_WET_SELF_TEST_STATE_T state ) +{ + // Execute on running state + switch( state ) + { + case DD_WET_SELF_TEST_START: + // DO nothing + break; + + case DD_WET_SELF_TEST_NEGATIVE_DEAERATION_PRES_CHECK: + //Make sure Water Inlet Valve is open + setValveState( M4_VALV, VALVE_STATE_OPEN ); + + // Start timer for hyd chamber negative pressure check state + hydChamberPressureCheckStartTimeMS = getMSTimerCount(); + // Start D12/Degassing pump - closed loop control + setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, FALSE ); + break; + + case DD_WET_SELF_TEST_POSITIVE_DEAERATION_PRES_CHECK: + // TODO : lists the valves/pumps state + break; + + case DD_WET_SELF_TEST_SPENT_DIAL_PRES_CHECK: + // TODO : lists the valves/pumps state + break; + + case DD_WET_SELF_TEST_BAL_CHAMBER_VALV_LEAK_CHECK: + // TODO : lists the valves/pumps state + break; + + case DD_WET_SELF_TEST_DIAL_FLOW_PATH_LEAK_CHECK: + // TODO : lists the valves/pumps state + break; + + case DD_WET_SELF_TEST_UF_PRES_DROP_CHECK: + // TODO : lists the valves/pumps state + break; + + case DD_WET_SELF_TEST_BLOOD_LEAK_CHECK: + // TODO : lists the valves/pumps state + break; + + case DD_WET_SELF_TEST_BAL_CHAMBER_MEMBRANE_INTEGRITY_CHECK: + // TODO : lists the valves/pumps state + break; + + case DD_WET_SELF_TEST_LEVEL_SENSOR_CHECK: + //TODO : define actuators states + break; + + case DD_WET_SELF_TEST_PAUSE: + //TODO : define actuators states + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_PRE_GEND_WET_SELF_TEST_INVALID_EXEC_STATE1, state ) + break; + } +} + +/*********************************************************************//** + * @brief + * The execWetSelfTest function executes the pregen mode wet self test state machine. + * @details \b Inputs: wetSelfTestState + * @details \b Outputs: Wet self test state machine executed + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT when wrong pre gen wet self test + * state invoked. + * @return current wet self state. + *************************************************************************/ +static void execWetSelfTest( void ) +{ + DD_WET_SELF_TEST_STATE_T priorSubState = wetSelfTestState; + + // execute current Wet self test state + switch ( wetSelfTestState ) + { + case DD_WET_SELF_TEST_START: + setModePreGenWetSelfStateTransition( DD_WET_SELF_TEST_NEGATIVE_DEAERATION_PRES_CHECK ); + wetSelfTestState = DD_WET_SELF_TEST_NEGATIVE_DEAERATION_PRES_CHECK; + break; + + case DD_WET_SELF_TEST_NEGATIVE_DEAERATION_PRES_CHECK: + wetSelfTestState = handleNegativeDeaerationPressureCheckState(); + break; + + case DD_WET_SELF_TEST_POSITIVE_DEAERATION_PRES_CHECK: + wetSelfTestState = handlePositiveDeaerationPressureCheckState(); + break; + + case DD_WET_SELF_TEST_PAUSE: + //TODO : define state + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_PRE_GEND_WET_SELF_TEST_INVALID_EXEC_STATE, wetSelfTestState ) + wetSelfTestState = DD_WET_SELF_TEST_NEGATIVE_DEAERATION_PRES_CHECK; + break; + } + + if ( priorSubState != wetSelfTestState ) + { + setCurrentSubState( (U32)wetSelfTestState ); + //SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_SUB_STATE_CHANGE, priorSubState, wetSelfTestState ); + } + + //TODO: Publish wet self test status + //publishWetSelfTestData(); +} + +/*********************************************************************//** + * @brief + * The handleNegativeDeaerationPressureCheckState function checks the + * negative deaeration pressure check range and transition to next state. + * @details \b Inputs: state + * @details \b Outputs: none + * @return current state of Wet Self test + *************************************************************************/ +static DD_WET_SELF_TEST_STATE_T handleNegativeDeaerationPressureCheckState( void ) +{ + DD_WET_SELF_TEST_STATE_T state = DD_WET_SELF_TEST_NEGATIVE_DEAERATION_PRES_CHECK; + F32 hydPressure = getFilteredPressure( D9_PRES ); + F32 targetPressure = getDialysatePumpTargetPressure( D12_PUMP ) - DEGAS_PUMP_TARGET_PRES_ADJ_THRESHOLD; + + if ( hydPressure <= targetPressure ) + { + if ( 0 == pressureCheckPersistanceStartTimeMS ) + { + pressureCheckPersistanceStartTimeMS = getMSTimerCount(); + } + else if ( TRUE == didTimeout( pressureCheckPersistanceStartTimeMS, NEG_PRES_PERSISTENCE_TIME_MS ) ) + { + pressureCheckPersistanceStartTimeMS = 0; + state = DD_WET_SELF_TEST_POSITIVE_DEAERATION_PRES_CHECK; + setModePreGenWetSelfStateTransition ( state ); + } + } + else if ( TRUE == didTimeout( hydChamberPressureCheckStartTimeMS, HYD_CHAMBER_PRES_CHECK_TIME_OUT ) ) + { + // time out alarm and pause the self test + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DD_GEND_HYD_CHAMBER_PRESS_OUT_OF_RANGE, hydPressure ); + state = DD_WET_SELF_TEST_PAUSE; + setModePreGenWetSelfStateTransition ( state ); + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handlePositiveDeaerationPressureCheckState function checks the + * postive deaeration pressure check range and transition to next state. + * @details \b Inputs: state + * @details \b Outputs: none + * @return current state of Wet Self test + *************************************************************************/ +static DD_WET_SELF_TEST_STATE_T handlePositiveDeaerationPressureCheckState( void ) +{ + //TODO: define pressure check + DD_WET_SELF_TEST_STATE_T state = DD_WET_SELF_TEST_POSITIVE_DEAERATION_PRES_CHECK; + + return state; +} + +/*********************************************************************//** + * @brief * The publishPreGenDialysateState function publishes Pre-Generation dialysate * mode data. * @details \b Inputs: preGenDialysatePublishTimerCounter, preGenDialysateModePublishInterval Index: firmware/App/Modes/ModePreGenDialysate.h =================================================================== diff -u -r6408d79e3a9a543e90b2fa7ab823be348befd391 -rf6022e86136c821709ce24b61e11e8e2bdf0b11e --- firmware/App/Modes/ModePreGenDialysate.h (.../ModePreGenDialysate.h) (revision 6408d79e3a9a543e90b2fa7ab823be348befd391) +++ firmware/App/Modes/ModePreGenDialysate.h (.../ModePreGenDialysate.h) (revision f6022e86136c821709ce24b61e11e8e2bdf0b11e) @@ -42,7 +42,7 @@ void initPreGenDialysateMode( void ); // initialize this unit U32 transitionToPreGenDialysateMode( void ); // prepares for transition to pre-gen dialysate mode U32 execPreGenDialysateMode( void ); // execute the pre-gen dilaysate mode state machine (call from OperationModes) -DD_PRE_GEN_DAILYSATE_STATE_T getCurrentPreGenDialysateState( void ); // get the current state of the pre-gen dialysate mode. +DD_PRE_GEN_DIALYSATE_STATE_T getCurrentPreGenDialysateState( void ); // get the current state of the pre-gen dialysate mode. BOOL requestDDGenDialStart( void ); // start generate dialysate delivery BOOL requestDDPreGenStop( void ); // stop pregenerate dialysate delivery Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r5422509f9d8db102b62952ba9f5923e832d6b2fa -rf6022e86136c821709ce24b61e11e8e2bdf0b11e --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 5422509f9d8db102b62952ba9f5923e832d6b2fa) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision f6022e86136c821709ce24b61e11e8e2bdf0b11e) @@ -135,6 +135,8 @@ SW_FAULT_ID_INVALID_RO_OPERATING_MODE = 104, SW_FAULT_ID_PRE_GEND_MODE_INVALID_EXEC_STATE = 105, SW_FAULT_ID_POST_GEND_MODE_INVALID_EXEC_STATE = 106, + SW_FAULT_ID_PRE_GEND_WET_SELF_TEST_INVALID_EXEC_STATE = 107, + SW_FAULT_ID_PRE_GEND_WET_SELF_TEST_INVALID_EXEC_STATE1 = 108, #ifdef __PUMPTEST__ // Assigning high value to separate from actual fault id from test fault ids. SW_FAULT_ID_PISTON_PUMP_EXEC_INVALID_STATE = 9000,