Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -r229341f9eb23fec730cdf9b1f8f3960de2daf384 -r9910fec894ece6f3a4845e15c3ca56f56e4e4111 --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision 229341f9eb23fec730cdf9b1f8f3960de2daf384) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 9910fec894ece6f3a4845e15c3ca56f56e4e4111) @@ -42,23 +42,26 @@ /// Payload record structure for valve open/close request typedef struct { - U32 valveID; ///< ValveID ( valid range 0 to 28 ) - U32 valveState; ///< Valve state ( Open : 0, closed :1) + 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. +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 commandedSpareValveStates; ///< Initialize commanded spare valves states bit field. +static U16 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 +75,52 @@ * @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; + commandedSpareValveStates = 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 ); + setFPGASpareValveStates( commandedSpareValveStates ); + setFPGAIOFPValveStates( commandedIOFPValveStates ); } /*********************************************************************//** @@ -125,15 +138,16 @@ void execValves( void ) { U32 i; - // get valves states from FPGA - U16 readValvesStates = getFPGAValveStates(); + U16 readValvesStates = getFPGADDValveStates(); U08 readValveBCStates = getFPGAValveBCStates(); - U08 readValveUFStates = getFPGAValveUFStates(); + U08 readValveSpStates = getFPGAValveSpStates(); + U16 readValveIOFPStates = getFPGAIOFPValveStates(); // Verify read back FPGA valve states match last commanded valve states - if ( ( readValvesStates != commandedValvesStates ) || + if ( ( readValvesStates != commandedValvesStates ) || ( readValveBCStates != commandedBCValveStates ) || - ( readValveUFStates != commandedUFValveStates ) ) + ( readValveSpStates != commandedSpareValveStates ) || + ( readValveIOFPStates != commandedIOFPValveStates ) ) { valveStateMismatchTimerCounter++; // increment valve state mismatch counter by 1 if ( valveStateMismatchTimerCounter > MAX_VALVE_STATE_MISMATCH_TIMER_COUNT ) @@ -162,9 +176,10 @@ // Set valves states (via FPGA) to currently commanded states readCommandedValveStates(); - setFPGAValveStates( commandedValvesStates ); + setFPGADDValveStates( commandedValvesStates ); setFPGABCValveStates( commandedBCValveStates ); - setFPGAUFValveStates( commandedUFValveStates ); + setFPGASpareValveStates( commandedSpareValveStates ); + setFPGAIOFPValveStates( commandedIOFPValveStates ); // Publish valve states on interval publishValvesStates(); @@ -184,14 +199,15 @@ 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; + commandedSpareValveStates = 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++ ) { - commandedValvesStates |= ( getValveState( i ) == ENERGIZED ? 0x0001 << i : 0 ); + commandedValvesStates |= ( getValveState( i ) == ENERGIZED ? 0x01 << i : 0 ); } // flag Balancing chamber valves that are currently commanded to be energized @@ -200,11 +216,17 @@ commandedBCValveStates |= ( getValveState( i ) == ENERGIZED ? 0x01 << ( i - FIRST_BC_VALVE ) : 0 ); } - // flag Ultrafiltration valves that are currently commanded to be energized - for ( i = FIRST_UF_VALVE; i <= LAST_UF_VALVE; i++ ) + // flag spare valves that are currently commanded to be energized + for ( i = FIRST_SP_VALVE; i <= LAST_SP_VALVE; i++ ) { - commandedUFValveStates |= ( getValveState( i ) == ENERGIZED ? 0x01 << ( i - FIRST_UF_VALVE ) : 0 ); + commandedSpareValveStates |= ( getValveState( i ) == ENERGIZED ? 0x01 << ( i - FIRST_SP_VALVE ) : 0 ); } + + // flag IOFP valves that are currently commanded to be energized + for ( i = FIRST_IO_VALVE; i <= LAST_FP_VALVE; i++ ) + { + commandedIOFPValveStates |= ( getValveState( i ) == ENERGIZED ? 0x01 << ( i - FIRST_IO_VALVE ) : 0 ); + } } /*********************************************************************//** @@ -226,12 +248,12 @@ { case VALVE_STATE_OPEN: 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 ) || ( DD_M4_VALV == valveID ) || ( D23_VALV == valveID ) || - ( 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 ) ) + 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 ) || + ( D19_VALV == valveID ) || ( D25_VALV == valveID ) || ( D21_VALV == valveID ) || ( D24_VALV == valveID ) || ( D20_VALV == valveID ) || + ( D26_VALV == valveID ) || ( D22_VALV == valveID ) || ( D80_VALV == valveID ) || ( D81_VALV == valveID ) || ( D79_PMP_VALV == valveID ) || + ( P11_VALV == valveID ) || ( P33_VALV == valveID ) || ( P34_VALV == valveID ) || ( P37_VALV == valveID ) || ( P6_VALV == valveID ) ) { result = TRUE; } @@ -415,33 +437,14 @@ DD_VALVES_T valve; // Set all Hydraulics valves to closed state - for ( valve = FIRST_HYD_VALVE; valve < LAST_HYD_VALVE; valve++ ) + for ( valve = FIRST_HYD_VALVE; valve <= LAST_HYD_VALVE; valve++ ) { setValveState( valve, VALVE_STATE_CLOSED ); } } /*********************************************************************//** * @brief - * The setUFValvesStatetoClosedState function sets all UF valves - * to close state. - * @details \b Inputs: none - * @details \b Outputs: valve states - * @return none. - *************************************************************************/ -void setUFValvesStatetoClosedState( void ) -{ - DD_VALVES_T valve; - - // Set all UF valves to closed state - for ( valve = FIRST_UF_VALVE; valve <= LAST_UF_VALVE; valve++ ) - { - setValveState( valve, VALVE_STATE_CLOSED ); - } -} - -/*********************************************************************//** - * @brief * The publishValvesStates function publishes DD valves states at the set interval. * @details \b Inputs: valvesStatesPublicationTimerCounter * @details \b Outputs: valvesStatesPublicationTimerCounter @@ -450,17 +453,17 @@ *************************************************************************/ 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.valvesUFStatus = getFPGAValveUFStates(); + data.valvesStatus = commandedValvesStates; + data.valvesBCStatus = commandedBCValveStates; + data.valveSPStatus = commandedSpareValveStates; - for ( i = 0; i < DD_NUM_OF_VALVES; i++ ) + for ( i = 0; i <= LAST_DD_VALVE; i++ ) { data.valvesSensedState[ i ] = (U08)getValveStateName( (DD_VALVES_T)i ); } @@ -469,6 +472,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 - FIRST_IO_VALVE ] = (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; + } } @@ -506,8 +526,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; } @@ -552,8 +579,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; } @@ -582,7 +616,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; @@ -593,4 +627,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; +} + /**@}*/