Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -r736cc5b56cc9c784ab1d8fc8687a73d190c35759 -r334ecc04c0de62dc1cc152fdc9b7c85d8e95644e --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision 736cc5b56cc9c784ab1d8fc8687a73d190c35759) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 334ecc04c0de62dc1cc152fdc9b7c85d8e95644e) @@ -82,6 +82,7 @@ #define INITIAL_ENERGIZED_EDGE_UPPER_RANGE 13250U ///< Energized edge maximum count #define INITIAL_ENERGIZED_EDGE_LOWER_RANGE 10750U ///< Energized edge minimum count +#define FIRST_ENERGIZED_EDGE_LOWER_RANGE 9000U ///< Energized edge minimum count on very first home after power up. #define INITIAL_V3_ENERGIZED_EDGE_UPPER_RANGE 14000U ///< Energized edge maximum count #define INITIAL_V3_ENERGIZED_EDGE_LOWER_RANGE 10750U ///< Energized edge minimum count @@ -114,6 +115,28 @@ #define DATA_PUBLISH_COUNTER_START_COUNT 80 ///< Data publish counter start count. +#define VALVE_INIT_STATUS_BIT 0x0001 ///< valve init +#define VALVE_ENABLE_PID_STATUS_BIT 0x0002 ///< valve PID enabled +#define VALVE_ENABLE_BYPASS_STATUS_BIT 0x0004 ///< valve bypass + +#define VALVE_PID_CHECK ( VALVE_INIT_STATUS_BIT | VALVE_ENABLE_PID_STATUS_BIT ) +#define VALVE_CHECK_MASK ( VALVE_INIT_STATUS_BIT | VALVE_ENABLE_PID_STATUS_BIT | VALVE_ENABLE_BYPASS_STATUS_BIT ) +#define VALVE_CHECK_BITS_PER_VALVE ( 3 ) + +#define VDI_POS ( 2 ) +#define VDO_POS ( 3 ) +#define VBA_POS ( 0 ) +#define VBV_POS ( 1 ) +#define VDI_VALVE_CHECK ( VALVE_PID_CHECK << ( VDI_POS * VALVE_CHECK_BITS_PER_VALVE ) ) +#define VDO_VALVE_CHECK ( VALVE_PID_CHECK << ( VDO_POS * VALVE_CHECK_BITS_PER_VALVE ) ) +#define VBA_VALVE_CHECK ( VALVE_PID_CHECK << ( VBA_POS * VALVE_CHECK_BITS_PER_VALVE ) ) +#define VBV_VALVE_CHECK ( VALVE_PID_CHECK << ( VBV_POS * VALVE_CHECK_BITS_PER_VALVE ) ) + +#define VDI_VALVE_CHECK_MASK ( ( VALVE_CHECK_MASK << ( VDI_POS * VALVE_CHECK_BITS_PER_VALVE ) ) ) +#define VDO_VALVE_CHECK_MASK ( ( VALVE_CHECK_MASK << ( VDO_POS * VALVE_CHECK_BITS_PER_VALVE ) ) ) +#define VBA_VALVE_CHECK_MASK ( ( VALVE_CHECK_MASK << ( VBA_POS * VALVE_CHECK_BITS_PER_VALVE ) ) ) +#define VBV_VALVE_CHECK_MASK ( ( VALVE_CHECK_MASK << ( VBV_POS * VALVE_CHECK_BITS_PER_VALVE ) ) ) + /// Exec valve self test states typedef enum valves_Self_Test_States { @@ -200,25 +223,6 @@ VALVE_BYPASS_T bypassModeStatus; ///< Valve bypass (fixed PWM) mode } VALVE_STATUS_T; -// ********** private data ********** - -static VALVE_SELF_TEST_STATE_T valveSelfTestState; ///< Valves self test state -static SELF_TEST_STATUS_T valvesSelfTestResult; ///< Valves self test result -static VALVE_STATUS_T valvesStatus[ NUM_OF_VALVES ]; ///< Array of type VALVE_STATUS_T structure that holds the status of each valve - -static OVERRIDE_U32_T valvesDataPublishInterval = { VALVES_DATA_PUB_INTERVAL, VALVES_DATA_PUB_INTERVAL, 0, 0 }; ///< Valves data publish interval - -static OVERRIDE_U32_T valvesPositionOverride[ NUM_OF_VALVES ] = { VALVE_POSITION_C_CLOSE, VALVE_POSITION_C_CLOSE, 0, 0 }; ///< Valves position override - -static const U16 VALVE_CONTROL_MODES_SET_BITS[ NUM_OF_VALVES ][ NUM_OF_VALVE_CONTROL_MODES ] = - { { VDI_SET_PID_BIT_MASK, VDI_SET_BYPASS_BIT_MASK, VDI_RESET_CONTROL_BIT_MASK }, - { VDO_SET_PID_BIT_MASK, VDO_SET_BYPASS_BIT_MASK, VDO_RESET_CONTROL_BIT_MASK }, - { VBA_SET_PID_BIT_MASK, VBA_SET_BYPASS_BIT_MASK, VBA_RESET_CONTROL_BIT_MASK }, - { VBV_SET_PID_BIT_MASK, VBV_SET_BYPASS_BIT_MASK, VBV_RESET_CONTROL_BIT_MASK } }; ///< Valves control mode set bits - -static const U16 VALVE_CONTROL_MODES_RESET_BITS[ NUM_OF_VALVES ] = { VDI_RESET_CONTROL_BIT_MASK, VDO_RESET_CONTROL_BIT_MASK, - VBA_RESET_CONTROL_BIT_MASK, VBV_RESET_CONTROL_BIT_MASK }; ///< Valves control modes rest bits - /// Valve check entries enum valve_check_entries { @@ -227,40 +231,39 @@ NUM_OF_VALVE_CHECK_ENTRIES, ///< Number of valve check entries }; -#define VALVE_INIT_STATUS_BIT 0x0001 ///< valve init -#define VALVE_ENABLE_PID_STATUS_BIT 0x0002 ///< valve PID enabled -#define VALVE_ENABLE_BYPASS_STATUS_BIT 0x0004 ///< valve bypass - -#define VALVE_PID_CHECK ( VALVE_INIT_STATUS_BIT | VALVE_ENABLE_PID_STATUS_BIT ) -#define VALVE_CHECK_MASK ( VALVE_INIT_STATUS_BIT | VALVE_ENABLE_PID_STATUS_BIT | VALVE_ENABLE_BYPASS_STATUS_BIT ) -#define VALVE_CHECK_BITS_PER_VALVE ( 3 ) - -#define VDI_POS ( 2 ) -#define VDO_POS ( 3 ) -#define VBA_POS ( 0 ) -#define VBV_POS ( 1 ) -#define VDI_VALVE_CHECK ( VALVE_PID_CHECK << ( VDI_POS * VALVE_CHECK_BITS_PER_VALVE ) ) -#define VDO_VALVE_CHECK ( VALVE_PID_CHECK << ( VDO_POS * VALVE_CHECK_BITS_PER_VALVE ) ) -#define VBA_VALVE_CHECK ( VALVE_PID_CHECK << ( VBA_POS * VALVE_CHECK_BITS_PER_VALVE ) ) -#define VBV_VALVE_CHECK ( VALVE_PID_CHECK << ( VBV_POS * VALVE_CHECK_BITS_PER_VALVE ) ) - -#define VDI_VALVE_CHECK_MASK ( ( VALVE_CHECK_MASK << ( VDI_POS * VALVE_CHECK_BITS_PER_VALVE ) ) ) -#define VDO_VALVE_CHECK_MASK ( ( VALVE_CHECK_MASK << ( VDO_POS * VALVE_CHECK_BITS_PER_VALVE ) ) ) -#define VBA_VALVE_CHECK_MASK ( ( VALVE_CHECK_MASK << ( VBA_POS * VALVE_CHECK_BITS_PER_VALVE ) ) ) -#define VBV_VALVE_CHECK_MASK ( ( VALVE_CHECK_MASK << ( VBV_POS * VALVE_CHECK_BITS_PER_VALVE ) ) ) - static const U16 VALVE_CHECK[ NUM_OF_VALVES ][ NUM_OF_VALVE_CHECK_ENTRIES ] = { { VDI_VALVE_CHECK, VDI_VALVE_CHECK_MASK }, { VDO_VALVE_CHECK, VDO_VALVE_CHECK_MASK }, { VBA_VALVE_CHECK, VBA_VALVE_CHECK_MASK }, { VBV_VALVE_CHECK, VBV_VALVE_CHECK_MASK } }; ///< Valve check entries +static const U16 VALVE_CONTROL_MODES_SET_BITS[ NUM_OF_VALVES ][ NUM_OF_VALVE_CONTROL_MODES ] = + { { VDI_SET_PID_BIT_MASK, VDI_SET_BYPASS_BIT_MASK, VDI_RESET_CONTROL_BIT_MASK }, + { VDO_SET_PID_BIT_MASK, VDO_SET_BYPASS_BIT_MASK, VDO_RESET_CONTROL_BIT_MASK }, + { VBA_SET_PID_BIT_MASK, VBA_SET_BYPASS_BIT_MASK, VBA_RESET_CONTROL_BIT_MASK }, + { VBV_SET_PID_BIT_MASK, VBV_SET_BYPASS_BIT_MASK, VBV_RESET_CONTROL_BIT_MASK } }; ///< Valves control mode set bits +static const U16 VALVE_CONTROL_MODES_RESET_BITS[ NUM_OF_VALVES ] = { VDI_RESET_CONTROL_BIT_MASK, VDO_RESET_CONTROL_BIT_MASK, + VBA_RESET_CONTROL_BIT_MASK, VBV_RESET_CONTROL_BIT_MASK }; ///< Valves control modes rest bits + +// ********** private data ********** + +static VALVE_SELF_TEST_STATE_T valveSelfTestState; ///< Valves self test state +static SELF_TEST_STATUS_T valvesSelfTestResult; ///< Valves self test result +static VALVE_STATUS_T valvesStatus[ NUM_OF_VALVES ]; ///< Array of type VALVE_STATUS_T structure that holds the status of each valve + +static OVERRIDE_U32_T valvesDataPublishInterval = { VALVES_DATA_PUB_INTERVAL, VALVES_DATA_PUB_INTERVAL, 0, 0 }; ///< Valves data publish interval + +static OVERRIDE_U32_T valvesPositionOverride[ NUM_OF_VALVES ] = { VALVE_POSITION_C_CLOSE, VALVE_POSITION_C_CLOSE, 0, 0 }; ///< Valves position override + static U16 valvesControlSetBits; ///< Valves control set bit static OPN_CLS_STATE_T valveAirTrapStatus; ///< Air trap valve status (open/close) static HD_VALVES_CAL_RECORD_T valvesCalibrationRecord; ///< Valves calibration record. +static BOOL hasValveEverBeenHomed[ NUM_OF_VALVES ]; ///< Flags indicating whether the valves have been previously homed. +// ********** private function prototypes ********** + // Self test function prototypes static VALVE_SELF_TEST_STATE_T handleValveSelfTestEnableValves( void ); static VALVE_SELF_TEST_STATE_T handleValveSelfTestConfirmEnable( void ); @@ -324,6 +327,8 @@ valvesStatus[ valve ].current.ovInitData = 0.0F; valvesStatus[ valve ].current.override = 0; valvesStatus[ valve ].dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; + + hasValveEverBeenHomed[ valve ] = FALSE; } // Close air trap valve @@ -760,16 +765,22 @@ S16 targetPosition = valvesStatus[ valve ].targetPositionInCounts; S16 deltaPosition = currentPosition - targetPosition; U32 energizedUpperEdge = INITIAL_ENERGIZED_EDGE_UPPER_RANGE; - U32 deenergizedLowerEdge = INITIAL_ENERGIZED_EDGE_LOWER_RANGE; + U32 energizedLowerEdge = INITIAL_ENERGIZED_EDGE_LOWER_RANGE; #ifndef _RELEASE_ if ( HW_CONFIG_BETA == getHardwareConfigStatus() ) { energizedUpperEdge = INITIAL_V3_ENERGIZED_EDGE_UPPER_RANGE; - deenergizedLowerEdge = INITIAL_V3_ENERGIZED_EDGE_LOWER_RANGE; + energizedLowerEdge = INITIAL_V3_ENERGIZED_EDGE_LOWER_RANGE; } #endif + // If first homing, relax lower range in case cartridge still in place which could interfere with homing. + if ( FALSE == hasValveEverBeenHomed[ valve ] ) + { + energizedLowerEdge = FIRST_ENERGIZED_EDGE_LOWER_RANGE; + } + // Still too far from intermediate target position? Either still more travel to go or stuck at end of travel if ( deltaPosition > MAX_DEVIATION_FROM_TGT_IN_TRAVEL_CNTS ) { @@ -780,7 +791,7 @@ S16 deltaEdges = energizedEdge - currentPosition; // The range from energized to de-energized should be in the specified range - if ( ( deltaEdges <= energizedUpperEdge ) && ( deltaEdges >= deenergizedLowerEdge ) ) + if ( ( deltaEdges <= energizedUpperEdge ) && ( deltaEdges >= energizedLowerEdge ) ) { S16 positionC = currentPosition + INITIAL_EDGE_OFFSET_READ_COUNT; S16 positionB = valvesStatus[ valve ].positions[ VALVE_POSITION_B_OPEN ]; @@ -806,6 +817,7 @@ valvesStatus[ valve ].hasTransitionBeenRequested = TRUE; valvesStatus[ valve ].hasHomingBeenRequested = FALSE; valvesStatus[ valve ].numberOfFailedHomings = 0; + hasValveEverBeenHomed[ valve ] = TRUE; // Idle will initiate a transition state = VALVE_STATE_IDLE;