Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -r0c296cef29037819be204c45a23d4d38a52b2718 -r2b9d10664884e9b20d391cc3178d3c85347cdf2c --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision 0c296cef29037819be204c45a23d4d38a52b2718) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 2b9d10664884e9b20d391cc3178d3c85347cdf2c) @@ -41,11 +41,12 @@ 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 U32 valveStateMismatchCounter = 0; ///< Initialize valve state mismatch counter. +static U32 valveStateMismatchCounter; ///< Initialize valve state mismatch counter. 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 OVERRIDE_U32_T valveStates[ NUM_OF_VALVES ]; ///< Currently commanded valves states. +static OVERRIDE_U32_T valveStates[ NUM_OF_VALVES ]; ///< Currently commanded valves states. +static OVERRIDE_U32_T valveSensedStates[ NUM_OF_VALVES ]; ///< Valve sensed state 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 ********** @@ -60,7 +61,9 @@ * @brief * The initValves function initializes the Valves module. * @details Inputs: none - * @details Outputs: Valves module initialized + * @details Outputs: valveStates, pendingValveStateChanges, valveSensedStates, + * pendingValveStateChangeCountDowns, valveStateMismatchCounter, + * commandedValvesStates * @return none *************************************************************************/ void initValves( void ) @@ -70,15 +73,20 @@ // initialize commanded valve states for ( i = 0; i < NUM_OF_VALVES; i++ ) { - valveStates[ i ].data = DEENERGIZED; - valveStates[ i ].ovInitData = DEENERGIZED; - valveStates[ i ].ovData = DEENERGIZED; - valveStates[ i ].override = OVERRIDE_RESET; + valveStates[ i ].data = DEENERGIZED; + valveStates[ i ].ovInitData = DEENERGIZED; + valveStates[ i ].ovData = DEENERGIZED; + valveStates[ i ].override = OVERRIDE_RESET; + pendingValveStateChanges[ i ] = DEENERGIZED; + pendingValveStateChangeCountDowns[ i ] = 0; + valveSensedStates[ i ].data = DEENERGIZED; + valveSensedStates[ i ].ovInitData = DEENERGIZED; + valveSensedStates[ i ].ovData = DEENERGIZED; + valveSensedStates[ i ].override = OVERRIDE_RESET; + } - pendingValveStateChanges[ i ] = DEENERGIZED; - pendingValveStateChangeCountDowns[ i ] = 0; - } - commandedValvesStates = fromU32ArrayToU16(); + valveStateMismatchCounter = 0; + commandedValvesStates = fromU32ArrayToU16(); setFPGAValveStates( commandedValvesStates ); // initially set all valves to de-energized state via FPGA valvesStatesPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; // reset valves states publication timer @@ -395,8 +403,8 @@ /*********************************************************************//** * @brief * The getValveStateName function gets the current valve state enum for given valve. - * @details Inputs: valveStates[] - * @details Outputs: none + * @details Inputs: valveStates[], valveSensedStates + * @details Outputs: valveSensedStates * @param valveID ID of valve to get state for * @return the current valve state for given valve in enum *************************************************************************/ @@ -409,6 +417,11 @@ { U32 valveState = getU32OverrideValue( &valveStates[ valveID ] ); + if ( OVERRIDE_KEY == valveSensedStates[ valveID ].override ) + { + valveState = valveSensedStates[ valveID ].ovData; + } + // Convert the bit status of the valve to the valve name switch ( valveID ) { @@ -441,6 +454,15 @@ case VRF: name = ( DEENERGIZED == valveState ? VALVE_STATE_R2_C_TO_NO : VALVE_STATE_R1_C_TO_NC ); break; + } + + if ( OVERRIDE_KEY == valveSensedStates[ valveID ].override ) + { + valveSensedStates[ valveID ].ovData = (U32)name; + } + else + { + valveSensedStates[ valveID ].data = (U32)name; } } else @@ -464,9 +486,15 @@ if ( ++valvesStatesPublicationTimerCounter >= getU32OverrideValue( &valvesStatesPublishInterval ) ) { DG_VALVES_DATA_T data; + U32 i; - data.valvesStatus = getFPGAValveStates(); + data.valvesStatus = getFPGAValveStates(); + for ( i = 0; i < NUM_OF_VALVES; i++ ) + { + data.valvesSensedState[ i ] = getU32OverrideValue( &valveSensedStates[ i ] ); + } + broadcastData( MSG_ID_DG_VALVES_STATES, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( DG_VALVES_DATA_T ) ); valvesStatesPublicationTimerCounter = 0; @@ -600,6 +628,59 @@ } return result; +} + +/*********************************************************************//** + * @brief + * The testSetValveSensedStateOverride function overrides the value of the + * specified sensed state with a given value. + * @details Inputs: none + * @details Outputs: valveSensedStates + * @param valve ID of valve to override for + * @param value override value for the given valve ID + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetValveSensedStateOverride( U32 valve, U32 status ) +{ + BOOL result = FALSE; + + if ( valve < NUM_OF_VALVES ) + { + if ( TRUE == isTestingActivated() ) + { + valveSensedStates[ valve ].ovData = status; + valveSensedStates[ valve ].override = OVERRIDE_KEY; + result = TRUE; + } + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetValveSensedStateOverride function resets the override of + * the specified valve's sensed state. + * @details Inputs: none + * @details Outputs: valveSensedStates + * @param valve ID of valve to reset override state for + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testResetValveSensedStateOverride( U32 valve ) +{ + BOOL result = FALSE; + + if ( valve < NUM_OF_VALVES ) + { + if ( TRUE == isTestingActivated() ) + { + valveSensedStates[ valve ].override = OVERRIDE_RESET; + valveSensedStates[ valve ].ovData = valveSensedStates[ valve ].ovInitData; + result = TRUE; + } + } + + return result; } /**@}*/