Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -rb569bc796c56acd5d94d468386f5f42c350cad65 -rf46f00ed7e9e3d3483c8fb1a4c987bd1691501bb --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision b569bc796c56acd5d94d468386f5f42c350cad65) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision f46f00ed7e9e3d3483c8fb1a4c987bd1691501bb) @@ -35,7 +35,7 @@ #define ENERGIZED 1 ///< 1 for energized valve. #define ALL_VALVES_DEENERGIZED 0x0000 ///< 0 in U16 bit field for all valves. -#define VALVE_PWM_PERIOD 50 ///< Valve PWM Period in 0.1 us res ( 20kHz ) +#define VALVE_PWM_PERIOD 500 ///< Valve PWM Period in 0.1 us res ( 20kHz ) #define VALVE_PWM_LOW ( VALVE_PWM_PERIOD * 0.2 ) ///< Valve low PWM percentage #define VALVE_PWM_PULL_IN 100 ///< Valve 'strike' period at 100% PWM in ms @@ -126,7 +126,7 @@ // TODO set FPGA PWM after finalizing the decision on valve strike and hold behavior // initially set valve PWM configuration and enable -// setFPGAPWMConfigurations(); + //setFPGAPWMConfigurations(); // initially set all valves to de-energized state via FPGA setFPGADDValveStates( commandedValvesStates ); @@ -175,7 +175,7 @@ valveSPBits |= 0x01 << ( i - FIRST_SP_VALVE ); } - for ( i = FIRST_IO_VALVE; i <= LAST_IO_VALVE; i++ ) + for ( i = M12_VALV; i <= LAST_IO_VALVE; i++ ) { valveIOBits |= 0x01 << ( i - FIRST_IO_VALVE ); } @@ -673,16 +673,36 @@ BOOL testBCValveStatesOverride( MESSAGE_T *message ) { DD_BC_VALVE_OVERRIDE_PAYLOAD_T payload; - DD_VALVES_T valve; - BOOL result = FALSE; + DD_VALVES_T valve = FIRST_BC_VALVE; + OVERRIDE_TYPE_T ovType = OVERRIDE_INVALID; + U32 mask = 0; + VALVE_STATE_NAMES_T pos = VALVE_STATE_OPEN; + 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++ ) + ovType = ( TRUE == payload.reset ? OVERRIDE_RESET_OVERRIDE : OVERRIDE_OVERRIDE ); + + // Verify tester has logged in with f/w and override type is valid + if ( ( TRUE == isTestingActivated() ) && ( ovType != OVERRIDE_INVALID ) && ( ovType < NUM_OF_OVERRIDE_TYPES ) ) { - U32 mask = 0x1 << (valve - FIRST_BC_VALVE); - VALVE_STATE_NAMES_T pos = ( ( ( payload.valveStatesBits & mask ) != 0 ) ? VALVE_STATE_OPEN : VALVE_STATE_CLOSED ); + for ( valve = FIRST_BC_VALVE; valve <= LAST_BC_VALVE; valve++ ) + { + mask = ( 0x1 << ( valve - FIRST_BC_VALVE ) ); + pos = ( ( ( payload.valveStatesBits & mask ) != 0 ) ? VALVE_STATE_OPEN : VALVE_STATE_CLOSED); - result = setValveState( valve, pos ); + if ( OVERRIDE_OVERRIDE == ovType ) + { + result = TRUE; + valveStates[ valve ].ovData = convertValveStateNameToValveState( pos ); + valveStates[ valve ].override = OVERRIDE_KEY; + } + else + { + result = TRUE; + valveStates[ valve ].override = OVERRIDE_RESET; + valveStates[ valve ].ovData = valveStates[ valve ].ovInitData; + } + } } return result; Index: firmware/App/Controllers/Valves.h =================================================================== diff -u -r9577444556a75d90a90331288eb8aeeedc4e12b1 -rf46f00ed7e9e3d3483c8fb1a4c987bd1691501bb --- firmware/App/Controllers/Valves.h (.../Valves.h) (revision 9577444556a75d90a90331288eb8aeeedc4e12b1) +++ firmware/App/Controllers/Valves.h (.../Valves.h) (revision f46f00ed7e9e3d3483c8fb1a4c987bd1691501bb) @@ -8,7 +8,7 @@ * @file Valves.h * * @author (last) “Raghu -* @date (last) 16-Oct-2025 +* @date (last) 03-Feb-2026 * * @author (original) Vinayakam Mani * @date (original) 26-Aug-2024 @@ -37,6 +37,15 @@ NUM_OF_VALVE_STATES ///< number of valve states } VALVE_STATE_NAMES_T; +/// Enumerations for water recovery options +typedef enum recovery_States +{ + NO_RECOVERY = 0, ///< NO recovery + MEDIUM_RECOVERY, ///< Medium recovery + MAX_RECOVERY, ///< Maximum recovery + NUM_OF_RECOVERY_STATES ///< Number of recovery states +} RECOVERY_STATE_T; + #define NUM_OF_DD_VALVES ( ( LAST_DD_VALVE - FIRST_DD_VALVE ) + 1 ) #define NUM_OF_IOFP_VALVES ( ( LAST_FP_VALVE - FIRST_IO_VALVE ) + 1 ) #define NUM_OF_IO_VALVES ( ( LAST_IO_VALVE - FIRST_IO_VALVE ) + 1 ) @@ -77,6 +86,7 @@ BOOL setValveStateDelayed( DD_VALVES_T valve, VALVE_STATE_NAMES_T valveState, U32 delayMs ); VALVE_STATE_NAMES_T getValveStateName( DD_VALVES_T valveID ); void setHydValvesStatetoClosedState( void ); +void setRecoveryValvesConfig( void ); BOOL testValvesStatesPublishIntervalOverride( MESSAGE_T *message ); BOOL testValveStateOverride( MESSAGE_T *message ); Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r3643a2e648ab2b216fd08579e56bdc02fb94836d -rf46f00ed7e9e3d3483c8fb1a4c987bd1691501bb --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 3643a2e648ab2b216fd08579e56bdc02fb94836d) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision f46f00ed7e9e3d3483c8fb1a4c987bd1691501bb) @@ -7,8 +7,8 @@ * * @file ModeStandby.c * -* @author (last) “rkallala” -* @date (last) 09-Dec-2025 +* @author (last) “Raghu +* @date (last) 04-Feb-2026 * * @author (original) Vinayakam Mani * @date (original) 07-Aug-2024 @@ -18,6 +18,7 @@ #include "BalancingChamber.h" #include "ConcentratePumps.h" #include "ConductivitySensors.h" +#include "FPOperationModes.h" #include "Heaters.h" #include "ModeFault.h" #include "ModeStandby.h" @@ -157,6 +158,7 @@ static DD_STANDBY_MODE_STATE_T handleStandbyIdleState( void ) { DD_STANDBY_MODE_STATE_T state = DD_STANDBY_MODE_STATE_IDLE; + FP_OP_MODE_T fpMode = getCurrentFPOperationMode(); //Testing hydChamberWaterInletControl(); @@ -168,8 +170,17 @@ // } if ( TRUE == pendingStartDDPreGenRequest ) { - pendingStartDDPreGenRequest = FALSE; - requestNewOperationMode( DD_MODE_PREG ); + // wait for IOFP GENP mode and when IOFP manual control is not set + if ( ( FP_MODE_GENP == fpMode ) && ( getTestConfigStatus( TEST_CONFIG_DD_RUN_SOLO ) == FALSE ) ) + { + pendingStartDDPreGenRequest = FALSE; + requestNewOperationMode( DD_MODE_PREG ); + } + else if ( getTestConfigStatus( TEST_CONFIG_DD_RUN_SOLO ) == TRUE ) + { + pendingStartDDPreGenRequest = FALSE; + requestNewOperationMode( DD_MODE_PREG ); + } } //Test request to handle only balancing chamber switching else if ( TRUE == pendingBalanceChamberSwOnlyRequest ) Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r58e5721497be626929b6cdc0c5187e18b34bbaad -rf46f00ed7e9e3d3483c8fb1a4c987bd1691501bb --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 58e5721497be626929b6cdc0c5187e18b34bbaad) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision f46f00ed7e9e3d3483c8fb1a4c987bd1691501bb) @@ -7,8 +7,8 @@ * * @file AlarmMgmtSWFaults.h * -* @author (last) Michael Garthwaite -* @date (last) 27-Jan-2026 +* @author (last) “Raghu +* @date (last) 03-Feb-2026 * * @author (original) Vinayakam Mani * @date (original) 07-Aug-2024 @@ -282,6 +282,7 @@ FP_FAULT_ID_FP_INVALD_GENP_DEF_STATE = 122, FP_FAULT_ID_FP_INVALID_PERMEATE_TANK_STATE = 123, FP_FAULT_ID_FP_INVALID_INLET_PRESSURE_CHECK_STATE = 124, + FP_FAULT_ID_FP_INVALID_RECOVERY_VALVE_STATE = 125, NUM_OF_FP_FAULT_IDS } FP_SW_FAULT_ID_T; Index: firmware/App/Services/TDInterface.c =================================================================== diff -u -r3643a2e648ab2b216fd08579e56bdc02fb94836d -rf46f00ed7e9e3d3483c8fb1a4c987bd1691501bb --- firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision 3643a2e648ab2b216fd08579e56bdc02fb94836d) +++ firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision f46f00ed7e9e3d3483c8fb1a4c987bd1691501bb) @@ -7,8 +7,8 @@ * * @file TDInterface.c * -* @author (last) “rkallala” -* @date (last) 09-Dec-2025 +* @author (last) “Raghu +* @date (last) 03-Feb-2026 * * @author (original) Vinayakam Mani * @date (original) 06-Nov-2024 @@ -405,7 +405,7 @@ { // Start FP Pre-Generate Permeate - if ( FP_MODE_STAN == fpMode ) + if ( ( FP_MODE_STAN == fpMode ) && ( getTestConfigStatus( TEST_CONFIG_DD_RUN_SOLO ) == FALSE ) ) { fpReason = signalStartGenPermeate(); }