Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -r046bc2b62cf942b7e846fa5bff698b94238edf24 -r5d505b326ee2b7341ff068be90180ab02e92ea51 --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision 046bc2b62cf942b7e846fa5bff698b94238edf24) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 5d505b326ee2b7341ff068be90180ab02e92ea51) @@ -7,8 +7,8 @@ * * @file Valves.c * -* @author (last) Raghu Kallala -* @date (last) 23-Feb-2026 +* @author (last) Jashwant Gantyada +* @date (last) 30-Mar-2026 * * @author (original) Vinayakam Mani * @date (original) 26-Aug-2024 @@ -67,6 +67,7 @@ static OVERRIDE_U32_T valveSensedStates[ DD_NUM_OF_VALVES ]; ///< Valve sensed states override. 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. +static RECOVERY_STATE_T recoveryState; // ********** private function prototypes ********** @@ -97,6 +98,7 @@ fpValveStatesPublishInterval.ovData = VALVES_STATE_PUB_INTERVAL; fpValveStatesPublishInterval.ovInitData = 0; fpValveStatesPublishInterval.override = OVERRIDE_RESET; + recoveryState = MAX_RECOVERY; // Initialize commanded valve states for ( i = 0; i < DD_NUM_OF_VALVES; i++ ) @@ -213,6 +215,37 @@ U08 readValveIOStates = getFPGAIOValveStates(); U08 readValveFPStates = getFPGAFPValveStates(); + // Update sensed valve states from FPGA readback (unless overridden via override mechanism) + for ( i = FIRST_HYD_VALVE; i <= LAST_HYD_VALVE; i++ ) + { + U16 mask = (U16)( 0x01u << i ); + valveSensedStates[ i ].data = ( ( readValvesStates & mask ) != 0u ? ENERGIZED : DEENERGIZED ); + } + + for ( i = FIRST_BC_VALVE; i <= LAST_BC_VALVE; i++ ) + { + U08 mask = (U08)( 0x01u << ( i - FIRST_BC_VALVE ) ); + valveSensedStates[ i ].data = ( ( readValveBCStates & mask ) != 0u ? ENERGIZED : DEENERGIZED ); + } + + for ( i = FIRST_SP_VALVE; i <= LAST_SP_VALVE; i++ ) + { + U08 mask = (U08)( 0x01u << ( i - FIRST_SP_VALVE ) ); + valveSensedStates[ i ].data = ( ( readValveSpStates & mask ) != 0u ? ENERGIZED : DEENERGIZED ); + } + + for ( i = FIRST_IO_VALVE; i <= LAST_IO_VALVE; i++ ) + { + U08 mask = (U08)( 0x01u << ( i - FIRST_IO_VALVE ) ); + valveSensedStates[ i ].data = ( ( readValveIOStates & mask ) != 0u ? ENERGIZED : DEENERGIZED ); + } + + for ( i = FIRST_FP_VALVE; i <= LAST_FP_VALVE; i++ ) + { + U08 mask = (U08)( 0x01u << ( i - FIRST_FP_VALVE ) ); + valveSensedStates[ i ].data = ( ( readValveFPStates & mask ) != 0u ? ENERGIZED : DEENERGIZED ); + } + // Verify read back FPGA valve states match last commanded valve states if ( ( readValvesStates != commandedValvesStates ) || ( readValveBCStates != commandedBCValveStates ) || @@ -525,17 +558,42 @@ /*********************************************************************//** * @brief - * The setRecoveryValvesConfig function sets all recovery valves per + * The getRecoveryValvesConfig function gets * recovery configuration from institutional record. + * @details \b Inputs: recoveryState + * @details \b Outputs: none + * @return recoveryState. + *************************************************************************/ +RECOVERY_STATE_T getRecoveryStatesConfig( void ) +{ + return recoveryState; +} + +/*********************************************************************//** + * @brief + * The setRecoveryStatesConfig function gets + * recovery configuration from institutional record. * @details \b Inputs: none + * @details \b Outputs: recoveryState + * @param recovery state to set valve config. + * @return none. + *************************************************************************/ +void setRecoveryStatesConfig( RECOVERY_STATE_T recovery ) +{ + recoveryState = recovery; +} +/*********************************************************************//** + * @brief + * The setRecoveryValvesConfig function sets all recovery valves per + * recovery configuration from institutional record. + * @details \b Inputs: recoveryState * @details \b Outputs: P33, P34 and P37 recovery valve states * @return none. *************************************************************************/ void setRecoveryValvesConfig( void ) { // TODO define hdInstitutionalRecord and get the NVData when it's ready // RECOVERY_STATE_T recoveryState = (RECOVERY_STATE_T)hdInstitutionalRecord.recoveryConfig; - RECOVERY_STATE_T recoveryState = MAX_RECOVERY; // Set all P33, P34 and P37 valves per recovery configuration switch( recoveryState ) @@ -834,4 +892,39 @@ 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 testIOFPSetValveRecoveryConfig( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + // Verify tester has logged in with DD + if ( TRUE == isTestingActivated() ) + { + // Verify payload length is valid + if ( sizeof( U32 ) == message->hdr.payloadLen ) + { + U32 payload; + + memcpy( &payload, message->payload, sizeof(U32) ); + + if (payload < NUM_OF_RECOVERY_STATES ) + { + setRecoveryStatesConfig((RECOVERY_STATE_T)payload); + result = TRUE; + } + } + } + + return result; +} + /**@}*/