Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -r24bf8d1d7a248f907a5c60496a764ae1ef9876f6 -ra570e1827563618b8d26082eb63994f9f65adc17 --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision 24bf8d1d7a248f907a5c60496a764ae1ef9876f6) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision a570e1827563618b8d26082eb63994f9f65adc17) @@ -14,13 +14,15 @@ * @date (original) 14-Aug-2024 * ***************************************************************************/ -#include + #include // For memcpy -#include + +#include "FpgaDD.h" #include "MessageSupport.h" #include "Messaging.h" #include "TaskPriority.h" #include "Timers.h" +#include "Valves.h" /** * @addtogroup Valves @@ -41,9 +43,9 @@ // ********** private data ********** static U32 valvesStatesPublicationTimerCounter; ///< Timer counter used to schedule valve state publication to CAN bus. -static U16 commandedValvesStates = ALL_VALVES_DEENERGIZED; ///< Initialize commanded valves states bit field. -static U08 commandedBCValveStates = ALL_VALVES_DEENERGIZED; ///< Initialize balancing chamber commanded valves states bit field. -static U08 commandedUFValveStates = ALL_VALVES_DEENERGIZED; ///< Initialize ultra filtration commanded valves states bit field. +static U16 commandedValvesStates; ///< Initialize commanded valves states bit field. +static U08 commandedBCValveStates; ///< Initialize balancing chamber commanded valves states bit field. +static U08 commandedUFValveStates; ///< Initialize ultra filtration commanded valves states bit field. static U32 valveStateMismatchTimerCounter; ///< Initialize valve state mismatch timer. static U32 pendingValveStateChanges[ NUM_OF_VALVES ]; ///< Delayed (pending) valve state changes. static U32 pendingValveStateChangeCountDowns[ NUM_OF_VALVES ]; ///< Delayed (pending) valve state change count down timers (in task intervals). @@ -55,7 +57,7 @@ // ********** private function prototypes ********** static void publishValvesStates( void ); -static void convertU32ArrayToBytes( void ); +static void readCommandedValveStates( void ); static BOOL checkValveStateName( VALVES_T valveID, VALVE_STATE_NAMES_T valveStateName ); static U32 convertValveStateNameToValveState( VALVE_STATE_NAMES_T valveStateName ); static U32 getValveState( U32 valveID ); @@ -88,11 +90,14 @@ valveSensedStates[ i ].override = OVERRIDE_RESET; } - // initialize specific to DD module - valveStateMismatchTimerCounter = 0; - valvesStatesPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; // reset valves states publication timer + //Initialize the commanded valve states + commandedValvesStates = ALL_VALVES_DEENERGIZED; + commandedBCValveStates = ALL_VALVES_DEENERGIZED; + commandedUFValveStates = ALL_VALVES_DEENERGIZED; + valveStateMismatchTimerCounter = 0; + valvesStatesPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; // reset valves states publication timer - convertU32ArrayToBytes(); + readCommandedValveStates(); // initially set all valves to de-energized state via FPGA setFPGAValveStates( commandedValvesStates ); setFPGABCValveStates( commandedBCValveStates ); @@ -150,7 +155,7 @@ } // Set valves states (via FPGA) to currently commanded states - convertU32ArrayToBytes(); + readCommandedValveStates(); setFPGAValveStates( commandedValvesStates ); setFPGABCValveStates( commandedBCValveStates ); setFPGAUFValveStates( commandedUFValveStates ); @@ -161,36 +166,38 @@ /*********************************************************************//** * @brief - * The convertU32ArrayToBytes function converts an array of U32 valve states - * to U16 and U08 valvesStates that can be passed to FPGA for setting valves. + * The readCommandedValveStates function gets the hydraulics, Balancing chamber + * and Ultrafiltration valvesStates that can be passed to FPGA for setting valves. * @details \b Inputs: valveStates[] - * @details \b Outputs: none + * @details \b Outputs: commandedValvesStates,commandedBCValveStates, + * commandedUFValveStates * @return converted U16 and U08 bit field for currently commanded valve states *************************************************************************/ -static void convertU32ArrayToBytes( void ) +static void readCommandedValveStates( void ) { U32 i; + // Initiliaze before updating commanded states commandedValvesStates = ALL_VALVES_DEENERGIZED; commandedBCValveStates = ALL_VALVES_DEENERGIZED; commandedUFValveStates = ALL_VALVES_DEENERGIZED; - // flag valves that are currently commanded to be energized - for ( i = 0; i < RSRVD_SPACE1; i++ ) + // flag hydraulics valves that are currently commanded to be energized + for ( i = FIRST_HYD_VALVE; i <= LAST_HYD_VALVE; i++ ) { commandedValvesStates |= ( getValveState( i ) == ENERGIZED ? 0x0001 << i : 0 ); } // flag Balancing chamber valves that are currently commanded to be energized - for ( i = BCV1; i <= BCV8; i++ ) + for ( i = FIRST_BC_VALVE; i <= LAST_BC_VALVE; i++ ) { - commandedBCValveStates |= ( getValveState( i ) == ENERGIZED ? 0x01 << ( i - BCV1 ) : 0 ); + commandedBCValveStates |= ( getValveState( i ) == ENERGIZED ? 0x01 << ( i - FIRST_BC_VALVE ) : 0 ); } // flag Ultrafiltration valves that are currently commanded to be energized - for ( i = UFI1; i < NUM_OF_VALVES; i++ ) + for ( i = FIRST_UF_VALVE; i <= LAST_UF_VALVE; i++ ) { - commandedUFValveStates |= ( getValveState( i ) == ENERGIZED ? 0x01 << ( i - UFI1 ) : 0 ); + commandedUFValveStates |= ( getValveState( i ) == ENERGIZED ? 0x01 << ( i - FIRST_UF_VALVE ) : 0 ); } } @@ -359,7 +366,6 @@ } name = ( DEENERGIZED == valveState ? VALVE_STATE_CLOSED : VALVE_STATE_OPEN ); - } else { @@ -424,157 +430,133 @@ valvesStatesPublicationTimerCounter = 0; } } + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ + /*********************************************************************//** * @brief - * The testSetValvesStatesPublishIntervalOverride function overrides the + * The testValvesStatesPublishIntervalOverride function overrides the * valves states publish interval. * @details \b Inputs: none * @details \b Outputs: valvesStatesPublishInterval - * @param value override valves states publish interval with (in ms) + * @param message Override message from Dialin which includes the value + * that override valves states publish interval with (in ms) * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetValvesStatesPublishIntervalOverride( U32 value ) +BOOL testValvesStatesPublishIntervalOverride( MESSAGE_T *message ) { - BOOL result = FALSE; + BOOL result = FALSE; + TEST_OVERRIDE_PAYLOAD_T override; + OVERRIDE_TYPE_T ovType = getOverridePayloadFromMessage( message, &override ); - if ( TRUE == isTestingActivated() ) - { - U32 intvl = value / TASK_PRIORITY_INTERVAL; - - result = TRUE; - valvesStatesPublishInterval.ovData = intvl; - valvesStatesPublishInterval.override = OVERRIDE_KEY; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The testResetValvesStatesPublishIntervalOverride function resets the override - * of the valves states publish interval. - * @details \b Inputs: none - * @details \b Outputs: valvesStatesPublishInterval - * @return TRUE if override reset successful, FALSE if not - *************************************************************************/ -BOOL testResetValvesStatesPublishIntervalOverride( void ) -{ - BOOL result = FALSE; - - if ( TRUE == isTestingActivated() ) - { - result = TRUE; - valvesStatesPublishInterval.override = OVERRIDE_RESET; - valvesStatesPublishInterval.ovData = valvesStatesPublishInterval.ovInitData; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The testSetValveStateOverride function overrides the value of the - * specified valve with a given value. - * @details \b Inputs: none - * @details \b Outputs: valves[] - * @param valveID ID of valve to override for - * @param value override value for the given valve ID - * @return TRUE if override successful, FALSE if not - *************************************************************************/ -BOOL testSetValveStateOverride( U32 valveID, U32 value ) -{ - BOOL result = FALSE; - - if ( valveID < NUM_OF_VALVES ) + // Verify tester has logged in with TD and override type is valid + if ( ( TRUE == isTestingActivated() ) && ( ovType != OVERRIDE_INVALID ) && ( ovType < NUM_OF_OVERRIDE_TYPES ) ) { - if ( TRUE == isTestingActivated() ) + if ( OVERRIDE_OVERRIDE == ovType ) { - valveStates[ valveID ].ovData = value; - valveStates[ valveID ].override = OVERRIDE_KEY; - result = TRUE; - } - } + U32 intvl = override.state.u32 / TASK_PRIORITY_INTERVAL; - return result; -} - -/*********************************************************************//** - * @brief - * The testResetValveStateOverride function resets the override of the specified valve. - * @details \b Inputs: none - * @details \b Outputs: valves[] - * @param valveID ID of valve to reset override state for - * @return TRUE if override successful, FALSE if not - *************************************************************************/ -BOOL testResetValveStateOverride( U32 valveID ) -{ - BOOL result = FALSE; - - if ( valveID < NUM_OF_VALVES ) - { - if ( TRUE == isTestingActivated() ) + result = TRUE; + valvesStatesPublishInterval.ovData = intvl; + valvesStatesPublishInterval.override = OVERRIDE_KEY; + } + else { result = TRUE; - valveStates[ valveID ].override = OVERRIDE_RESET; - valveStates[ valveID ].ovData = valveStates[ valveID ].ovInitData; + valvesStatesPublishInterval.override = OVERRIDE_RESET; + valvesStatesPublishInterval.ovData = valvesStatesPublishInterval.ovInitData; } - } - - return result; + } + + return result; } /*********************************************************************//** * @brief - * The testSetValveSensedStateOverride function overrides the value of the - * specified sensed state with a given value. + * The testValveStateOverride function overrides the value of the + * specified valve with a given value. * @details \b Inputs: none - * @details \b Outputs: valveSensedStates - * @param valve ID of valve to override for - * @param value override value for the given valve ID + * @details \b Outputs: valveStates[] + * @param message Override message from Dialin which includes an ID of + * the valve to override and the state to override the valve to. * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetValveSensedStateOverride( U32 valve, U32 status ) +BOOL testValveStateOverride( MESSAGE_T *message ) { - BOOL result = FALSE; + BOOL result = FALSE; + TEST_OVERRIDE_ARRAY_PAYLOAD_T override; + OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &override ); - if ( valve < NUM_OF_VALVES ) + // Verify tester has logged in with TD and override type is valid + if ( ( TRUE == isTestingActivated() ) && ( ovType != OVERRIDE_INVALID ) && ( ovType < NUM_OF_OVERRIDE_TYPES ) ) { - if ( TRUE == isTestingActivated() ) + U32 valveID = override.index; + + // Verify bubble detector index of override + if ( valveID < NUM_OF_VALVES ) { - valveSensedStates[ valve ].ovData = status; - valveSensedStates[ valve ].override = OVERRIDE_KEY; - result = TRUE; + if ( OVERRIDE_OVERRIDE == ovType ) + { + U32 value = override.state.u32; + + valveStates[ valveID ].ovData = value; + valveStates[ valveID ].override = OVERRIDE_KEY; + result = TRUE; + } + else + { + valveStates[ valveID ].override = OVERRIDE_RESET; + valveStates[ valveID ].ovData = valveStates[ valveID ].ovInitData; + result = TRUE; + } } } return result; -} +} /*********************************************************************//** * @brief - * The testResetValveSensedStateOverride function resets the override of - * the specified valve's sensed state. + * The testValveSensedStateOverride function overrides the value of the + * specified sensed state with a given value. * @details \b Inputs: none - * @details \b Outputs: valveSensedStates - * @param valve ID of valve to reset override state for + * @details \b Outputs: valveSensedStates[] + * @param message Override message from Dialin which includes an ID of + * the valve to override and the state to override the valve to. * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testResetValveSensedStateOverride( U32 valve ) +BOOL testValveSensedStateOverride( MESSAGE_T *message ) { - BOOL result = FALSE; + BOOL result = FALSE; + TEST_OVERRIDE_ARRAY_PAYLOAD_T override; + OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &override ); - if ( valve < NUM_OF_VALVES ) + // Verify tester has logged in with TD and override type is valid + if ( ( TRUE == isTestingActivated() ) && ( ovType != OVERRIDE_INVALID ) && ( ovType < NUM_OF_OVERRIDE_TYPES ) ) { - if ( TRUE == isTestingActivated() ) + U32 valveID = override.index; + + // Verify bubble detector index of override + if ( valveID < NUM_OF_VALVES ) { - valveSensedStates[ valve ].override = OVERRIDE_RESET; - valveSensedStates[ valve ].ovData = valveSensedStates[ valve ].ovInitData; - result = TRUE; + if ( OVERRIDE_OVERRIDE == ovType ) + { + U32 value = override.state.u32; + + valveSensedStates[ valveID ].ovData = value; + valveSensedStates[ valveID ].override = OVERRIDE_KEY; + result = TRUE; + } + else + { + valveSensedStates[ valveID ].override = OVERRIDE_RESET; + valveSensedStates[ valveID ].ovData = valveStates[ valveID ].ovInitData; + result = TRUE; + } } }