Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -r38ee99e9adeb19cacb0c88807e8f6f48b076a241 -r0b79c0e7dcf7f9e64c890447e83571d3123ab52c --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision 38ee99e9adeb19cacb0c88807e8f6f48b076a241) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 0b79c0e7dcf7f9e64c890447e83571d3123ab52c) @@ -49,16 +49,18 @@ // ********** private data ********** static U32 valvesStatesPublicationTimerCounter; ///< Timer counter used to schedule valve state publication to CAN bus. +static U32 fpValveStatesPublicationTimerCounter; ///< Timer counter used to schedule IOFP 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 commandedIOFPValveStates; ///< Initialize commanded IOFP valves states bit field. static U32 valveStateMismatchTimerCounter; ///< Initialize valve state mismatch timer. static U32 pendingValveStateChanges[ DD_NUM_OF_VALVES ]; ///< Delayed (pending) valve state changes. static U32 pendingValveStateChangeCountDowns[ DD_NUM_OF_VALVES ]; ///< Delayed (pending) valve state change count down timers (in task intervals). static OVERRIDE_U32_T valveStates[ DD_NUM_OF_VALVES ]; ///< Currently commanded valves states. static OVERRIDE_U32_T valveSensedStates[ DD_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 valvesStatesPublishInterval; ///< Interval (in ms/task interval) at which to publish valves state to CAN bus. +static OVERRIDE_U32_T fpValveStatesPublishInterval; ///< Interval (in ms/task interval) at which to publish valves state to CAN bus. // ********** private function prototypes ********** @@ -72,42 +74,50 @@ * @brief * The initValves function initializes the Valves unit. * @details \b Inputs: none - * @details \b Outputs: valveStates, pendingValveStateChanges, valveSensedStates, - * pendingValveStateChangeCountDowns, valveStateMismatchCounter, - * commandedValvesStates + * @details \b Outputs: Valves unit initialized. * @return none *************************************************************************/ void initValves( void ) { U32 i; - // initialize commanded valve states + // Initialize publish interval overrides + valvesStatesPublishInterval.data = VALVES_STATE_PUB_INTERVAL; + valvesStatesPublishInterval.ovData = VALVES_STATE_PUB_INTERVAL; + valvesStatesPublishInterval.ovInitData = 0; + valvesStatesPublishInterval.override = OVERRIDE_RESET; + fpValveStatesPublishInterval.data = VALVES_STATE_PUB_INTERVAL; + fpValveStatesPublishInterval.ovData = VALVES_STATE_PUB_INTERVAL; + fpValveStatesPublishInterval.ovInitData = 0; + fpValveStatesPublishInterval.override = OVERRIDE_RESET; + + // Initialize commanded valve states for ( i = 0; i < DD_NUM_OF_VALVES; i++ ) { 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; } - //Initialize the commanded valve states + // Initialize the commanded valve states commandedValvesStates = ALL_VALVES_DEENERGIZED; commandedBCValveStates = ALL_VALVES_DEENERGIZED; - commandedUFValveStates = ALL_VALVES_DEENERGIZED; + commandedIOFPValveStates = ALL_VALVES_DEENERGIZED; valveStateMismatchTimerCounter = 0; valvesStatesPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; // reset valves states publication timer - + fpValveStatesPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; // reset valves states publication timer readCommandedValveStates(); // initially set all valves to de-energized state via FPGA - setFPGAValveStates( commandedValvesStates ); + setFPGADDValveStates( commandedValvesStates ); setFPGABCValveStates( commandedBCValveStates ); - setFPGAUFValveStates( commandedUFValveStates ); + setFPGAIOFPValveStates( commandedIOFPValveStates ); } /*********************************************************************//** @@ -125,15 +135,14 @@ void execValves( void ) { U32 i; - // get valves states from FPGA - U16 readValvesStates = getFPGAValveStates(); + U16 readValvesStates = getFPGADDValveStates(); U08 readValveBCStates = getFPGAValveBCStates(); - U08 readValveUFStates = getFPGAValveUFStates(); + U16 readValveIOFPStates = getFPGAIOFPValveStates(); // Verify read back FPGA valve states match last commanded valve states - if ( ( readValvesStates != commandedValvesStates ) || + if ( ( readValvesStates != commandedValvesStates ) || ( readValveBCStates != commandedBCValveStates ) || - ( readValveUFStates != commandedUFValveStates ) ) + ( readValveIOFPStates != commandedIOFPValveStates ) ) { valveStateMismatchTimerCounter++; // increment valve state mismatch counter by 1 if ( valveStateMismatchTimerCounter > MAX_VALVE_STATE_MISMATCH_TIMER_COUNT ) @@ -162,9 +171,9 @@ // Set valves states (via FPGA) to currently commanded states readCommandedValveStates(); - setFPGAValveStates( commandedValvesStates ); + setFPGADDValveStates( commandedValvesStates ); setFPGABCValveStates( commandedBCValveStates ); - setFPGAUFValveStates( commandedUFValveStates ); + setFPGAIOFPValveStates( commandedIOFPValveStates ); // Publish valve states on interval publishValvesStates(); @@ -184,9 +193,9 @@ U32 i; // Initiliaze before updating commanded states - commandedValvesStates = ALL_VALVES_DEENERGIZED; - commandedBCValveStates = ALL_VALVES_DEENERGIZED; - commandedUFValveStates = ALL_VALVES_DEENERGIZED; + commandedValvesStates = ALL_VALVES_DEENERGIZED; + commandedBCValveStates = ALL_VALVES_DEENERGIZED; + commandedIOFPValveStates = ALL_VALVES_DEENERGIZED; // flag hydraulics valves that are currently commanded to be energized for ( i = FIRST_HYD_VALVE; i <= LAST_HYD_VALVE; i++ ) @@ -424,14 +433,14 @@ *************************************************************************/ static void publishValvesStates( void ) { - // publish valve state on interval + // publish DD valve states on interval if ( ++valvesStatesPublicationTimerCounter >= getU32OverrideValue( &valvesStatesPublishInterval ) ) { DD_VALVES_DATA_T data; U32 i; - data.valvesStatus = getFPGAValveStates(); - data.valvesBCStatus = getFPGAValveBCStates(); + data.valvesStatus = commandedValvesStates; + data.valvesBCStatus = commandedBCValveStates; for ( i = 0; i < LAST_DD_VALVE; i++ ) { @@ -442,6 +451,23 @@ valvesStatesPublicationTimerCounter = 0; } + + // publish IOFP valve states on interval + if ( ++fpValveStatesPublicationTimerCounter >= getU32OverrideValue( &fpValveStatesPublishInterval ) ) + { + FP_VALVES_DATA_T data; + U32 i; + + data.valvesCmdState = commandedIOFPValveStates; + for ( i = FIRST_IO_VALVE; i < LAST_FP_VALVE; i++ ) + { + data.valvesSensedState[ i ] = (U08)getValveStateName( (DD_VALVES_T)i ); + } + + broadcastData( MSG_ID_FP_VALVES_STATES_DATA, COMM_BUFFER_OUT_CAN_FP_BROADCAST, (U08*)&data, sizeof( FP_VALVES_DATA_T ) ); + + fpValveStatesPublicationTimerCounter = 0; + } } @@ -479,8 +505,15 @@ *************************************************************************/ BOOL testValveStateOverride( MESSAGE_T *message ) { - BOOL result = u32ArrayOverride( message, &valveStates[0], DD_NUM_OF_VALVES - 1, 0, NUM_OF_VALVE_STATES - 1 ); + BOOL result = FALSE; + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &payload ); + if ( payload.index <= LAST_DD_VALVE ) + { + result = u32ArrayOverride( message, &valveStates[0], DD_NUM_OF_VALVES - 1, 0, NUM_OF_VALVE_STATES - 1 ); + } + return result; } @@ -525,8 +558,15 @@ *************************************************************************/ BOOL testValveSensedStateOverride( MESSAGE_T *message ) { - BOOL result = u32ArrayOverride( message, &valveSensedStates[0], DD_NUM_OF_VALVES - 1, 0, NUM_OF_VALVE_STATES - 1 ); + BOOL result = FALSE; + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &payload ); + if ( payload.index <= LAST_DD_VALVE ) + { + result = u32ArrayOverride( message, &valveSensedStates[0], DD_NUM_OF_VALVES - 1, 0, NUM_OF_VALVE_STATES - 1 ); + } + return result; } @@ -555,7 +595,7 @@ memcpy( &payload, message->payload, sizeof(VALVE_CMD_PAYLOAD_T) ); if ( ( (DD_VALVES_T)payload.valveID < DD_NUM_OF_VALVES ) && - ( (VALVE_STATE_NAMES_T)payload.valveState < NUM_OF_VALVE_STATES ) ) + ( (VALVE_STATE_NAMES_T)payload.valveState < NUM_OF_VALVE_STATES ) ) { setValveState( (DD_VALVES_T)payload.valveID, (VALVE_STATE_NAMES_T)payload.valveState ); result = TRUE; @@ -566,4 +606,69 @@ return result; } +/*********************************************************************//** + * @brief + * The testIOFPValvesStatesPublishIntervalOverride function overrides the + * IOFP 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 testIOFPValvesStatesPublishIntervalOverride( MESSAGE_T *message ) +{ + BOOL result = u32BroadcastIntervalOverride( message, &fpValveStatesPublishInterval, TASK_PRIORITY_INTERVAL ); + + return result; +} + +/*********************************************************************//** + * @brief + * The testIOFPValveStateOverride function overrides the value of the + * specified IOFP valve with a given value. + * @details \b Inputs: none + * @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 testIOFPValveStateOverride( MESSAGE_T *message ) +{ + BOOL result = FALSE; + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &payload ); + + if ( ( payload.index >= FIRST_IO_VALVE ) && ( payload.index <= LAST_FP_VALVE ) ) + { + result = u32ArrayOverride( message, &valveStates[0], DD_NUM_OF_VALVES - 1, 0, NUM_OF_VALVE_STATES - 1 ); + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testIOFPValveSensedStateOverride function overrides the value of the + * specified sensed state of an IOFP valve with a given value. + * @details \b Inputs: none + * @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 testIOFPValveSensedStateOverride( MESSAGE_T *message ) +{ + BOOL result = FALSE; + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &payload ); + + if ( ( payload.index >= FIRST_IO_VALVE ) && ( payload.index <= LAST_FP_VALVE ) ) + { + result = u32ArrayOverride( message, &valveSensedStates[0], DD_NUM_OF_VALVES - 1, 0, NUM_OF_VALVE_STATES - 1 ); + } + + return result; +} + /**@}*/