Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 -r5e92cbb2c29854fb60a91dc4abafeb9b08d3272c --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 5e92cbb2c29854fb60a91dc4abafeb9b08d3272c) @@ -18,26 +18,26 @@ #include // For memcpy #include "FpgaDD.h" -#include "MessageSupport.h" -#include "Messaging.h" +#include "MessageSupport.h" +#include "Messaging.h" #include "TaskPriority.h" #include "Timers.h" #include "Valves.h" - -/** - * @addtogroup Valves - * @{ - */ - + +/** + * @addtogroup Valves + * @{ + */ + // ********** private definitions ********** #define DEENERGIZED 0 ///< 0 for de-energized valve. #define ENERGIZED 1 ///< 1 for energized valve. -#define ALL_VALVES_DEENERGIZED 0x0000 ///< 0 in U16 bit field for all valves. - -#define MAX_VALVE_STATE_MISMATCH_TIMER_COUNT (100 / TASK_PRIORITY_INTERVAL ) ///< Maximum time commanded valves state can fail to match read back valve states in a row. - -#define VALVES_STATE_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval ( ms / task time) at which valves states are published on CAN bus. +#define ALL_VALVES_DEENERGIZED 0x0000 ///< 0 in U16 bit field for all valves. + +#define MAX_VALVE_STATE_MISMATCH_TIMER_COUNT (100 / TASK_PRIORITY_INTERVAL ) ///< Maximum time commanded valves state can fail to match read back valve states in a row. + +#define VALVES_STATE_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval ( ms / task time) at which valves states are published on CAN bus. #define DATA_PUBLISH_COUNTER_START_COUNT 50 ///< Data publish counter start count. /// Payload record structure for valve open/close request @@ -46,40 +46,40 @@ U32 valveID; ///< ValveID ( valid range 0 to 28 ) U32 valveState; ///< Valve state ( Open : 0, closed :1) } VALVE_CMD_PAYLOAD_T; - -// ********** private data ********** - -static U32 valvesStatesPublicationTimerCounter; ///< Timer counter used to schedule valve state publication to CAN bus. + +// ********** private data ********** + +static U32 valvesStatesPublicationTimerCounter; ///< Timer counter used to schedule valve state publication to CAN bus. 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 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). +static U32 pendingValveStateChangeCountDowns[ NUM_OF_VALVES ]; ///< Delayed (pending) valve state change count down timers (in task intervals). static OVERRIDE_U32_T valveStates[ NUM_OF_VALVES ]; ///< Currently commanded valves states. -static OVERRIDE_U32_T valveSensedStates[ NUM_OF_VALVES ]; ///< Valve sensed states override. -static OVERRIDE_U32_T valvesStatesPublishInterval = { VALVES_STATE_PUB_INTERVAL, VALVES_STATE_PUB_INTERVAL, 0, 0 }; ///< Interval (in ms/task interval) at which to publish valves state to CAN bus. +static OVERRIDE_U32_T valveSensedStates[ NUM_OF_VALVES ]; ///< Valve sensed states override. +static OVERRIDE_U32_T valvesStatesPublishInterval = { VALVES_STATE_PUB_INTERVAL, VALVES_STATE_PUB_INTERVAL, 0, 0 }; ///< Interval (in ms/task interval) at which to publish valves state to CAN bus. -// ********** private function prototypes ********** +// ********** private function prototypes ********** static void publishValvesStates( 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 ); - -/*********************************************************************//** - * @brief - * The initValves function initializes the Valves unit. - * @details \b Inputs: none + +/*********************************************************************//** + * @brief + * The initValves function initializes the Valves unit. + * @details \b Inputs: none * @details \b Outputs: valveStates, pendingValveStateChanges, valveSensedStates, * pendingValveStateChangeCountDowns, valveStateMismatchCounter, - * commandedValvesStates - * @return none - *************************************************************************/ -void initValves( void ) -{ + * commandedValvesStates + * @return none + *************************************************************************/ +void initValves( void ) +{ U32 i; // initialize commanded valve states @@ -102,50 +102,50 @@ commandedBCValveStates = ALL_VALVES_DEENERGIZED; commandedUFValveStates = ALL_VALVES_DEENERGIZED; valveStateMismatchTimerCounter = 0; - valvesStatesPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; // reset valves states publication timer + valvesStatesPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; // reset valves states publication timer readCommandedValveStates(); - // initially set all valves to de-energized state via FPGA + // initially set all valves to de-energized state via FPGA setFPGAValveStates( commandedValvesStates ); setFPGABCValveStates( commandedBCValveStates ); - setFPGAUFValveStates( commandedUFValveStates ); -} - -/*********************************************************************//** - * @brief - * The execValves function executes the valves driver. + setFPGAUFValveStates( commandedUFValveStates ); +} + +/*********************************************************************//** + * @brief + * The execValves function executes the valves driver. * @details \b Inputs: valvesStates, valveStateMismatchCounter * pendingValveStateChangeCountDowns, commandedValvesStates, - * commandedBCValveStates , commandedUFValveStates + * commandedBCValveStates , commandedUFValveStates * @details \b Outputs: valvesStates, valveStateMismatchCounter * pendingValveStateChanges, valve controls * @details \b Alarm: ALARM_ID_DD_VALVE_CONTROL_FAILURE when FPGA read back - * valve state mismatches with the commanded valve state after defined time (100ms). - * @return none - *************************************************************************/ -void execValves( void ) + * valve state mismatches with the commanded valve state after defined time (100ms). + * @return none + *************************************************************************/ +void execValves( void ) { U32 i; - // get valves states from FPGA + // get valves states from FPGA U16 readValvesStates = getFPGAValveStates(); U08 readValveBCStates = getFPGAValveBCStates(); U08 readValveUFStates = getFPGAValveUFStates(); - // Verify read back FPGA valve states match last commanded valve states + // Verify read back FPGA valve states match last commanded valve states if ( ( readValvesStates != commandedValvesStates ) || ( readValveBCStates != commandedBCValveStates ) || - ( readValveUFStates != commandedUFValveStates ) ) - { - valveStateMismatchTimerCounter++; // increment valve state mismatch counter by 1 - if ( valveStateMismatchTimerCounter > MAX_VALVE_STATE_MISMATCH_TIMER_COUNT ) - { - activateAlarmNoData( ALARM_ID_DD_VALVE_CONTROL_FAILURE ); - } - } - else - { - valveStateMismatchTimerCounter = 0; + ( readValveUFStates != commandedUFValveStates ) ) + { + valveStateMismatchTimerCounter++; // increment valve state mismatch counter by 1 + if ( valveStateMismatchTimerCounter > MAX_VALVE_STATE_MISMATCH_TIMER_COUNT ) + { + activateAlarmNoData( ALARM_ID_DD_VALVE_CONTROL_FAILURE ); + } } + else + { + valveStateMismatchTimerCounter = 0; + } // Handle pending delayed valve state changes for ( i = 0; i < NUM_OF_VALVES; i++ ) @@ -159,17 +159,17 @@ pendingValveStateChanges[ i ] = DEENERGIZED; } } - } - - // Set valves states (via FPGA) to currently commanded states - readCommandedValveStates(); + } + + // Set valves states (via FPGA) to currently commanded states + readCommandedValveStates(); setFPGAValveStates( commandedValvesStates ); setFPGABCValveStates( commandedBCValveStates ); setFPGAUFValveStates( commandedUFValveStates ); - // Publish valve states on interval - publishValvesStates(); -} + // Publish valve states on interval + publishValvesStates(); +} /*********************************************************************//** * @brief @@ -207,45 +207,48 @@ commandedUFValveStates |= ( getValveState( i ) == ENERGIZED ? 0x01 << ( i - FIRST_UF_VALVE ) : 0 ); } } - -/*********************************************************************//** - * @brief - * The checkValveStateName function checks the validity of requested valve - * state name for given valve. - * @details \b Inputs: none + +/*********************************************************************//** + * @brief + * The checkValveStateName function checks the validity of requested valve + * state name for given valve. + * @details \b Inputs: none * @details \b Outputs: none - * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT when invalid valve ID passed. - * @param valveID ID of valve to check a valve state name for - * @param valveStateName valve state name to check for given valve ID - * @return TRUE if given valveStateName is appropriate for given valve ID, FALSE if not. - *************************************************************************/ -static BOOL checkValveStateName( VALVES_T valveID, VALVE_STATE_NAMES_T valveStateName ) -{ - BOOL result = FALSE; // initialize result flag to FALSE - - switch ( valveStateName ) - { + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT when invalid valve ID passed. + * @param valveID ID of valve to check a valve state name for + * @param valveStateName valve state name to check for given valve ID + * @return TRUE if given valveStateName is appropriate for given valve ID, FALSE if not. + *************************************************************************/ +static BOOL checkValveStateName( VALVES_T valveID, VALVE_STATE_NAMES_T valveStateName ) +{ + BOOL result = FALSE; // initialize result flag to FALSE + + switch ( valveStateName ) + { case VALVE_STATE_OPEN: - case VALVE_STATE_CLOSED: - if ( ( VDR == valveID ) || ( VTD == valveID ) || ( VHB == valveID ) || ( VRP == valveID ) || ( VHO == valveID ) || - ( VDB1 == valveID ) || ( VP1 == valveID ) || ( VPT == valveID ) || ( VDB2 == valveID ) || ( VDI == valveID ) || - ( VDO == valveID ) || ( VP2 == valveID ) || ( VHI == valveID ) || ( VWI == valveID ) || ( BCV1 == valveID ) || - ( BCV2 == valveID ) || ( BCV3 == valveID ) || ( BCV4 == valveID ) || ( BCV5 == valveID ) || ( BCV6 == valveID ) || - ( BCV7 == valveID ) || ( BCV8 == valveID ) || ( UFI1 == valveID ) || ( UFO1 == valveID ) || ( UFI2 == valveID ) || - ( UFO2 == valveID ) ) - { - result = TRUE; + case VALVE_STATE_CLOSED: + if ( ( D53_VALV == valveID ) || ( D52_VALV == valveID ) || ( D8_VALV == valveID ) || ( D54_VALV == valveID ) || ( D14_VALV == valveID ) || + ( D65_VALV == valveID ) || ( D64_VALV == valveID ) || ( D31_VALV == valveID ) || ( D34_VALV == valveID ) || ( D35_VALV == valveID ) || + ( D40_VALV == valveID ) || ( D47_VALV == valveID ) || ( D3_VALV == valveID ) || ( M4_VALV == valveID ) || ( D23_VALV == valveID ) || +#ifdef __PUMPTEST__ + ( UF1 == valveID ) || ( UF2 == valveID ) || +#endif + ( D19_VALV == valveID ) || ( D25_VALV == valveID ) || ( D21_VALV == valveID ) || ( D24_VALV == valveID ) || ( D20_VALV == valveID ) || + ( D26_VALV == valveID ) || ( D22_VALV == valveID ) || ( D69_VALV == valveID ) || ( D70_VALV == valveID ) || ( D71_VALV == valveID ) || + ( D72_VALV == valveID ) ) + { + result = TRUE; } break; - - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_STATE_NAME, valveStateName ) - break; - } - - return result; -} + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_STATE_NAME, valveStateName ) + break; + } + + return result; +} + /*********************************************************************//** * @brief * The convertValveStateNameToValveState function converts valve state \n @@ -276,7 +279,7 @@ } return vState; -} +} /*********************************************************************//** * @brief @@ -349,38 +352,33 @@ return result; } - -/*********************************************************************//** - * @brief - * The getValveStateName function gets the current valve state enum for given valve. - * @details \b Inputs: valveStates[] + +/*********************************************************************//** + * @brief + * The getValveStateName function gets the current valve state enum for given valve. + * @details \b Inputs: valveStates[] * @details \b Outputs: none - * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT when invalid valve ID passed. - * @param valveID ID of valve to get state for - * @return the current valve state for given valve in enum - *************************************************************************/ -VALVE_STATE_NAMES_T getValveStateName( VALVES_T valveID ) + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT when invalid valve ID passed. + * @param valveID ID of valve to get state for + * @return the current valve state for given valve in enum + *************************************************************************/ +VALVE_STATE_NAMES_T getValveStateName( VALVES_T valveID ) { // Initialized per CppCheck. VALVE_STATE_NAMES_T name = NUM_OF_VALVE_STATES; - - if ( valveID < NUM_OF_VALVES ) + + if ( valveID < NUM_OF_VALVES ) { - U32 valveState = getU32OverrideValue( &valveStates[ valveID ] ); + U32 valveState = getU32OverrideValue( &valveSensedStates[ valveID ] ); - if ( OVERRIDE_KEY == valveSensedStates[ valveID ].override ) - { - valveState = valveSensedStates[ valveID ].ovData; - } - name = ( DEENERGIZED == valveState ? VALVE_STATE_CLOSED : VALVE_STATE_OPEN ); - } - else - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_ID, valveID ) - } - - return name; + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_ID, valveID ) + } + + return name; } /*********************************************************************//** @@ -445,19 +443,19 @@ setValveState( valve, VALVE_STATE_CLOSED ); } } - -/*********************************************************************//** - * @brief - * The publishValvesStates function publishes DD valves states at the set interval. - * @details \b Inputs: valvesStatesPublicationTimerCounter + +/*********************************************************************//** + * @brief + * The publishValvesStates function publishes DD valves states at the set interval. + * @details \b Inputs: valvesStatesPublicationTimerCounter * @details \b Outputs: valvesStatesPublicationTimerCounter - * @details \b Messages: MSG_ID_DD_VALVES_STATES_DATA to publish FPGA read valve states. - * @return none - *************************************************************************/ -static void publishValvesStates( void ) -{ - // publish valve state on interval - if ( ++valvesStatesPublicationTimerCounter >= getU32OverrideValue( &valvesStatesPublishInterval ) ) + * @details \b Messages: MSG_ID_DD_VALVES_STATES_DATA to publish FPGA read valve states. + * @return none + *************************************************************************/ +static void publishValvesStates( void ) +{ + // publish valve state on interval + if ( ++valvesStatesPublicationTimerCounter >= getU32OverrideValue( &valvesStatesPublishInterval ) ) { DD_VALVES_DATA_T data; U32 i; @@ -469,35 +467,35 @@ for ( i = 0; i < NUM_OF_VALVES; i++ ) { data.valvesSensedState[ i ] = (U08)getValveStateName( (VALVES_T)i ); - } + } broadcastData( MSG_ID_DD_VALVES_STATES_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( DD_VALVES_DATA_T ) ); - - valvesStatesPublicationTimerCounter = 0; - } + + valvesStatesPublicationTimerCounter = 0; + } } - -/************************************************************************* - * TEST SUPPORT FUNCTIONS - *************************************************************************/ +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ -/*********************************************************************//** - * @brief - * The testValvesStatesPublishIntervalOverride function overrides the - * valves states publish interval. - * @details \b Inputs: none - * @details \b Outputs: valvesStatesPublishInterval + +/*********************************************************************//** + * @brief + * The testValvesStatesPublishIntervalOverride function overrides the + * valves states publish interval. + * @details \b Inputs: none + * @details \b Outputs: valvesStatesPublishInterval * @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 testValvesStatesPublishIntervalOverride( MESSAGE_T *message ) -{ - BOOL result = u32BroadcastIntervalOverride( message, &valvesStatesPublishInterval, TASK_PRIORITY_INTERVAL ); - - return result; + * that override valves states publish interval with (in ms) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testValvesStatesPublishIntervalOverride( MESSAGE_T *message ) +{ + BOOL result = u32BroadcastIntervalOverride( message, &valvesStatesPublishInterval, TASK_PRIORITY_INTERVAL ); + + return result; } /*********************************************************************//** @@ -515,10 +513,39 @@ BOOL result = u32ArrayOverride( message, &valveStates[0], NUM_OF_VALVES - 1, 0, NUM_OF_VALVE_STATES - 1 ); return result; -} +} /*********************************************************************//** * @brief + * The testBCValveStatesOverride function overrides the state of all + * balancing chamber valves with a given bits (corresponding to BC valve + * enumeration order). + * @details \b Inputs: none + * @details \b Outputs: valveStates[] + * @param message Override message from Dialin which includes the states + * to override the balancing chamber valves to. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testBCValveStatesOverride( MESSAGE_T *message ) +{ + DD_BC_VALVE_OVERRIDE_PAYLOAD_T payload; + VALVES_T valve; + BOOL result = FALSE; + + memcpy( (U08*)(&payload), message->payload, sizeof( DD_BC_VALVE_OVERRIDE_PAYLOAD_T ) ); + for ( valve = FIRST_BC_VALVE; valve <= LAST_BC_VALVE; valve++ ) + { + U32 mask = 0x1 << (valve - FIRST_BC_VALVE); + VALVE_STATE_NAMES_T pos = ( ( ( payload.valveStatesBits & mask ) != 0 ) ? VALVE_STATE_OPEN : VALVE_STATE_CLOSED ); + + result = setValveState( valve, pos ); + } + + return result; +} + +/*********************************************************************//** + * @brief * The testValveSensedStateOverride function overrides the value of the * specified sensed state with a given value. * @details \b Inputs: none @@ -548,7 +575,7 @@ { BOOL result = FALSE; - // Verify tester has logged in with TD + // Verify tester has logged in with DD if ( TRUE == isTestingActivated() ) { // Verify payload length is valid @@ -569,5 +596,5 @@ return result; } - -/**@}*/ + +/**@}*/