Index: firmware/App/Controllers/PermeateTank.c =================================================================== diff -u -rb569bc796c56acd5d94d468386f5f42c350cad65 -rb80e670a9d724b5c6cdac4d74ce263a49bf6b697 --- firmware/App/Controllers/PermeateTank.c (.../PermeateTank.c) (revision b569bc796c56acd5d94d468386f5f42c350cad65) +++ firmware/App/Controllers/PermeateTank.c (.../PermeateTank.c) (revision b80e670a9d724b5c6cdac4d74ce263a49bf6b697) @@ -309,7 +309,16 @@ case PERMEATE_TANK_FULL_STATE: setValveState( M4_VALV, VALVE_STATE_CLOSED ); setValveState( M12_VALV, VALVE_STATE_OPEN ); - setValveState( P6_VALV, VALVE_STATE_OPEN ); + + // No recirculation for no recovery setting. + if ( getRecoveryValvesConfig() != NO_RECOVERY ) + { + setValveState( P6_VALV, VALVE_STATE_OPEN ); + } + else + { + setValveState( P6_VALV, VALVE_STATE_CLOSED ); + } setValveState( P11_VALV, VALVE_STATE_OPEN ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); // set P33, P34 and P37 per recovery configuration Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r1433d7d1c1c8bb8f08299d98ebe064a24a5e41af -rb80e670a9d724b5c6cdac4d74ce263a49bf6b697 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 1433d7d1c1c8bb8f08299d98ebe064a24a5e41af) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision b80e670a9d724b5c6cdac4d74ce263a49bf6b697) @@ -38,18 +38,23 @@ // ********** private definitions ********** #define RO_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO Pump data is published on the CAN bus. -#define ROP_CONTROL_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO pump is controlled. +#define ROP_CONTROL_INTERVAL ( 300 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO pump is controlled. -#define ROP_FLOW_CONTROL_P_COEFFICIENT 0.00009F ///< P term for RO pump flow control. -#define ROP_FLOW_CONTROL_I_COEFFICIENT 0.00018F ///< I term for RO pump flow control. +#define ROP_FLOW_CONTROL_P_COEFFICIENT 0.00010F ///< P term for RO pump flow control. +#define ROP_FLOW_CONTROL_I_COEFFICIENT 0.000075F ///< I term for RO pump flow control. +#define ROP_FLOW_CONTROL_D_COEFFICIENT 0.00070F #define ROP_MIN_FLOW_TO_CONTROL_PCT 0.75F #define ROP_PRESSURE_CONTROL_P_COEFFICIENT 0.15F ///< P term for RO pump pressure control. #define ROP_PRESSURE_CONTROL_I_COEFFICIENT 0.65F ///< I term for RO pump pressure control. #define ROP_FLOW_TO_PWM_SLOPE_PERM_FLUSH 117.63F ///< Slope of flow to PWM line equation for permeate flush. #define ROP_FLOW_TO_PWM_INTERCEPT_PERM_FLUSH -648.05F ///< Intercept of flow to PWM line equation for permeate flush. -#define ROP_FLOW_TO_PWM_SLOPE_MAX_RECOVER 155.31F ///< Slope of flow to PWM line equation for max RO recovery. -#define ROP_FLOW_TO_PWM_INTERCEPT_MAX_RECOVER -699.99F ///< Intercept of flow to PWM line equation for max RO recovery. +#define ROP_FLOW_TO_PWM_SLOPE_NO_RECOVERY 000.00F ///< Slope of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_INTERCEPT_NO_RECOVERY 000.00F ///< Intercept of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_SLOPE_MED_RECOVERY 000.00F ///< Slope of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_INTERCEPT_MED_RECOVERY 000.00F ///< Intercept of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_SLOPE_MAX_RECOVER 109.91F ///< Slope of flow to PWM line equation for max RO recovery. +#define ROP_FLOW_TO_PWM_INTERCEPT_MAX_RECOVER -409.85F ///< Intercept of flow to PWM line equation for max RO recovery. #define ROP_PRESSURE_TO_PWM_SLOPE 0.5F ///< Slope of pressure to PWM line equation. #define ROP_PRESSURE_TO_PWM_INTERCEPT 0.0F ///< Intercept of pressure to PWM line equation. @@ -105,8 +110,8 @@ initFluidPump(); // Initialize RO pump PI controller to flow - initializePIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, MIN_RO_FLOWRATE_MLPM, ROP_FLOW_CONTROL_P_COEFFICIENT, ROP_FLOW_CONTROL_I_COEFFICIENT, - MIN_RO_FLOWRATE_MLPM, MAX_RO_FLOWRATE_MLPM, FALSE, 0 ); + initializePIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, MIN_RO_FLOWRATE_MLPM, ROP_FLOW_CONTROL_P_COEFFICIENT, ROP_FLOW_CONTROL_I_COEFFICIENT, + ROP_FLOW_CONTROL_D_COEFFICIENT, MIN_RO_FLOWRATE_MLPM, MAX_RO_FLOWRATE_MLPM, FALSE, 0 ); // Initialize RO pump PI controller to target pressure initializePIController( PI_CONTROLLER_ID_RO_PUMP_PRES, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, ROP_PRESSURE_CONTROL_P_COEFFICIENT, ROP_PRESSURE_CONTROL_I_COEFFICIENT, @@ -201,7 +206,7 @@ // Set pump to on isROPumpOn = TRUE; roPumpDutyCyclePctSet = roPumpFlowToPWM( getTargetROPumpFlowRateMLPM() ); - resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0.0F ); + resetPIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0.0F ); setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); roPumpStartControl = FALSE; state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; @@ -264,7 +269,7 @@ { roPumpDutyCyclePctSet = roPumpFlowToPWM( getTargetROPumpFlowRateMLPM() ); } - resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0.0F ); + resetPIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0.0F ); state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; } // If there is a target pressure set, transition to the PI controller and control to pressure. @@ -323,7 +328,7 @@ // P16 flow seems to lag in current Leahi HW. We will wait till we hit a % of target flow before we start changing control. if( ( TRUE == roPumpStartControl ) || ( currentFlowRate >= ( minRequiredFlowRate ) ) ) { - roPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, (F32)getTargetROPumpFlowRateMLPM(), currentFlowRate ); + roPumpDutyCyclePctSet = runPIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, (F32)getTargetROPumpFlowRateMLPM(), currentFlowRate ); roPumpDutyCyclePctSet = MIN( roPumpDutyCyclePctSet, ( MAX_FLUID_PUMP_PWM_DUTY_CYCLE * MAX_FLUID_PUMP_DUTY_CYCLE_PCT ) ); setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); @@ -353,7 +358,7 @@ // Check if we are changing control if ( getTargetROPumpFlowRateMLPM() > 0 ) { - resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, getTargetROPumpFlowRateMLPM(), 0 ); + resetPIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0 ); state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; } else if ( getTargetROPumpDutyCyclePCT() > 0.0F ) @@ -691,7 +696,7 @@ if( targetROPumpFlowRate.data > 0 ) { targetROPumpFlowRate.data = 0; - resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, 0.0F ); + resetPIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, 0.0F ); } if( targetROPumpPressure.data > 0.0F ) Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -r046bc2b62cf942b7e846fa5bff698b94238edf24 -rb80e670a9d724b5c6cdac4d74ce263a49bf6b697 --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision 046bc2b62cf942b7e846fa5bff698b94238edf24) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision b80e670a9d724b5c6cdac4d74ce263a49bf6b697) @@ -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++ ) @@ -525,17 +527,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( U32 recovery ) +{ + recoveryState = (RECOVERY_STATE_T)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 +861,38 @@ 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(payload); + result = TRUE; + } + } + } + + return result; +} + /**@}*/ Index: firmware/App/Controllers/Valves.h =================================================================== diff -u -rdc4b4fddff7b3ceb6de191eed9c181d2508544ee -rb80e670a9d724b5c6cdac4d74ce263a49bf6b697 --- firmware/App/Controllers/Valves.h (.../Valves.h) (revision dc4b4fddff7b3ceb6de191eed9c181d2508544ee) +++ firmware/App/Controllers/Valves.h (.../Valves.h) (revision b80e670a9d724b5c6cdac4d74ce263a49bf6b697) @@ -82,6 +82,8 @@ VALVE_STATE_NAMES_T getValveStateName( DD_VALVES_T valveID ); void setHydValvesStatetoClosedState( void ); void setRecoveryValvesConfig( void ); +RECOVERY_STATE_T getRecoveryStatesConfig( void ); +void setRecoveryStatesConfig( U32 recovery ); BOOL testValvesStatesPublishIntervalOverride( MESSAGE_T *message ); BOOL testValveStateOverride( MESSAGE_T *message ); @@ -92,6 +94,7 @@ BOOL testIOFPValvesStatesPublishIntervalOverride( MESSAGE_T *message ); BOOL testIOFPValveStateOverride( MESSAGE_T *message ); BOOL testIOFPValveSensedStateOverride( MESSAGE_T *message ); +BOOL testIOFPSetValveRecoveryConfig( MESSAGE_T *message ); /**@}*/ Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r48558494898419baa0697009318fb543fe0b8a46 -rb80e670a9d724b5c6cdac4d74ce263a49bf6b697 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 48558494898419baa0697009318fb543fe0b8a46) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision b80e670a9d724b5c6cdac4d74ce263a49bf6b697) @@ -284,6 +284,7 @@ { MSG_ID_FP_DEF_PRE_GEN_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testPreGenPermeateDefDataPublishIntervalOverride}, { MSG_ID_FP_DEF_GEN_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testGenPermeateDefDataPublishIntervalOverride}, { MSG_ID_FP_DEF_STATUS_REQUEST, &testGetFPDefeaturedStatus }, + { MSG_ID_FP_SET_RECOVERY_VALVES_REQUEST, }; /// Calculation for number of entries in the incoming message function handler look-up table.