Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -r44222e803e04d057ab793ce6b72902b8bfe9b7d0 -rcc8b9ddb9905161ddb0dc2af6bfbf863408669c8 --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision 44222e803e04d057ab793ce6b72902b8bfe9b7d0) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision cc8b9ddb9905161ddb0dc2af6bfbf863408669c8) @@ -67,7 +67,7 @@ /// Fans status struct typedef struct { - F32 dutyCycle; ///< Fans duty cycle that was fed to the fans. + OVERRIDE_F32_T dutyCycle; ///< Fans duty cycle that was fed to the fans. F32 targetRPM; ///< Fans target RPM. OVERRIDE_F32_T rpm[ NUM_OF_FANS_NAMES ]; ///< Fan's current tachometers reading in RPM. } FAN_STATUS_T; @@ -128,7 +128,10 @@ // Initialize the fans for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) { - fansStatus.dutyCycle = 0.0; + fansStatus.dutyCycle.data = 0.0; + fansStatus.dutyCycle.ovData = 0.0; + fansStatus.dutyCycle.ovInitData = 0.0; + fansStatus.dutyCycle.override = OVERRIDE_RESET; fansStatus.targetRPM = 0.0; fansStatus.rpm[ fan ].data = 0.0; fansStatus.rpm[ fan ].ovData = 0.0; @@ -266,8 +269,9 @@ { FANS_EXEC_STATES_T state = FANS_EXEC_STATE_RUN_STATE; - // Check if it is time to check for the control - if ( ++fansControlCounter > FANS_CONTROL_INTERVAL ) + // Check if it is time to check for the control and the duty cycle override is in the reset mode so the duty cycle + // is not overridden + if ( ( ++fansControlCounter > FANS_CONTROL_INTERVAL ) && ( OVERRIDE_RESET == fansStatus.dutyCycle.override ) ) { // Get the maximum temperature among all the thermistors and temperature sensors to run fan from the hottest temperature F32 temperature = getMaximumTemperature(); @@ -287,44 +291,50 @@ // If the fans calculated duty cycle is greater than the previous calculated duty cycle, we are ramping up // otherwise, we are ramping down - if ( dutyCycle >= fansStatus.dutyCycle ) + if ( dutyCycle >= fansStatus.dutyCycle.data ) { // If the delta duty cycle from the previous duty cycle is greater than the max allowed ramp up duty cycle, // otherwise, only add the delta duty cycle - if ( ( dutyCycle - fansStatus.dutyCycle ) >= FANS_MAX_ALLOWED_RAMP_UP_DELTA_DUTY_CYCLE ) + if ( ( dutyCycle - fansStatus.dutyCycle.data ) >= FANS_MAX_ALLOWED_RAMP_UP_DELTA_DUTY_CYCLE ) { - fansStatus.dutyCycle += FANS_MAX_ALLOWED_RAMP_UP_DELTA_DUTY_CYCLE; + fansStatus.dutyCycle.data += FANS_MAX_ALLOWED_RAMP_UP_DELTA_DUTY_CYCLE; } else { - fansStatus.dutyCycle = dutyCycle; + fansStatus.dutyCycle.data = dutyCycle; } } else { // If the delta duty cycle from the previous duty cycle is greater than the max allowed ramp down duty cycle, // otherwise, only add the delta duty cycle - if ( ( fansStatus.dutyCycle - dutyCycle ) >= FANS_MAX_ALLOWED_RAMP_DOWN_DELTA_DUTY_CYCLE ) + if ( ( fansStatus.dutyCycle.data - dutyCycle ) >= FANS_MAX_ALLOWED_RAMP_DOWN_DELTA_DUTY_CYCLE ) { // If we are ramping down, set the target duty cycle to max allowed ramp down duty cycle - fansStatus.dutyCycle -= FANS_MAX_ALLOWED_RAMP_DOWN_DELTA_DUTY_CYCLE; + fansStatus.dutyCycle.data -= FANS_MAX_ALLOWED_RAMP_DOWN_DELTA_DUTY_CYCLE; } else { - fansStatus.dutyCycle = dutyCycle; + fansStatus.dutyCycle.data = dutyCycle; } } // Calculate the target RPM for the the duty cycle - fansStatus.targetRPM = fansStatus.dutyCycle * FANS_MAX_ALLOWED_RPM; + fansStatus.targetRPM = fansStatus.dutyCycle.data * FANS_MAX_ALLOWED_RPM; // Set the PWM to inlet and outlet fans - setInletFansDutyCycle( fansStatus.dutyCycle ); - setOutletFansDutyCycle( fansStatus.dutyCycle ); + setInletFansDutyCycle( fansStatus.dutyCycle.data ); + setOutletFansDutyCycle( fansStatus.dutyCycle.data ); // Reset the counter fansControlCounter = 0; } + else if ( OVERRIDE_KEY == fansStatus.dutyCycle.override ) + { + // Set the PWM to inlet and outlet fans + setInletFansDutyCycle( fansStatus.dutyCycle.ovData ); + setOutletFansDutyCycle( fansStatus.dutyCycle.ovData ); + } return state; } @@ -449,7 +459,8 @@ // The RPM is expected to be 5500 @ 100% duty cycle // The nominal RPM = duty cycle * 5500 / 1.0 // The RPM tolerance is -25% to +50% of the nominal RPM - F32 fansNominalRPM = fansStatus.dutyCycle * FANS_MAX_ALLOWED_RPM; + F32 dutyCycle = ( OVERRIDE_RESET == fansStatus.dutyCycle.override ? fansStatus.dutyCycle.data : fansStatus.dutyCycle.ovData ); + F32 fansNominalRPM = dutyCycle * FANS_MAX_ALLOWED_RPM; F32 fansMinAllowedRPM = fansNominalRPM - ( fansNominalRPM * FANS_MIN_RPM_OUT_OF_RANGE_TOL ); F32 fansMaxAllowedRPM = fansNominalRPM + ( fansNominalRPM * FANS_MAX_RPM_OUT_OF_RANGE_TOL ); @@ -518,7 +529,7 @@ { FANS_DATA_T fansData; - fansData.dutyCycle = fansStatus.dutyCycle * FRACTION_TO_PERCENT_FACTOR; + fansData.dutyCycle = ( OVERRIDE_RESET == fansStatus.dutyCycle.override ? fansStatus.dutyCycle.data : fansStatus.dutyCycle.ovData ) * FRACTION_TO_PERCENT_FACTOR; fansData.targetFansRPM = fansStatus.targetRPM; fansData.fanInlet1RPM = getMeasuredFanRPM( FAN_INLET_1 ); fansData.fanInlet2RPM = getMeasuredFanRPM( FAN_INLET_2 ); @@ -687,4 +698,53 @@ return result; } +/*********************************************************************//** + * @brief + * The testSetFansDutyCycleOverride function overrides fans duty cycle + * @details Inputs: none + * @details Outputs: fansStatus + * @param value the duty cycle value to be overridden + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetFansDutyCycleOverride( F32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + if( ( value >= FANS_MIN_DUTY_CYCLE ) && ( value <= FANS_MAX_DUTY_CYCLE ) ) + { + fansStatus.dutyCycle.ovData = value; + fansStatus.dutyCycle.override = OVERRIDE_KEY; + + result = TRUE; + } + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetFansDutyCycleOverride function resets the fans duty cycle + * override + * @details Inputs: none + * @details Outputs: fansStatus + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testResetFansDutyCycleOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + fansStatus.dutyCycle.override = OVERRIDE_RESET; + fansStatus.dutyCycle.ovData = 0.0; + + result = TRUE; + } + + return result; +} + /**@}*/ Index: firmware/App/Controllers/Fans.h =================================================================== diff -u -r44222e803e04d057ab793ce6b72902b8bfe9b7d0 -rcc8b9ddb9905161ddb0dc2af6bfbf863408669c8 --- firmware/App/Controllers/Fans.h (.../Fans.h) (revision 44222e803e04d057ab793ce6b72902b8bfe9b7d0) +++ firmware/App/Controllers/Fans.h (.../Fans.h) (revision cc8b9ddb9905161ddb0dc2af6bfbf863408669c8) @@ -71,6 +71,9 @@ BOOL testSetFanRPMAlarmStartTimeOffsetOverride( U32 hours, U32 minutes ); BOOL testResetFanRPMAlarmStartTimeOffsetOverride( void ); +BOOL testSetFansDutyCycleOverride( F32 value ); +BOOL testResetFansDutyCycleOverride( void ); + /**@}*/ #endif Index: firmware/App/Controllers/ROPump.h =================================================================== diff -u -r025612ad77fe630889a364586de54bffe5262d56 -rcc8b9ddb9905161ddb0dc2af6bfbf863408669c8 --- firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 025612ad77fe630889a364586de54bffe5262d56) +++ firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision cc8b9ddb9905161ddb0dc2af6bfbf863408669c8) @@ -31,7 +31,7 @@ */ // ********** public definitions ********** -#define MAX_RO_FLOWRATE_LPM 1.4 ///< Maximum target RO flow rate in L/min. +#define MAX_RO_FLOWRATE_LPM 1.8 ///< Maximum target RO flow rate in L/min. #define MIN_RO_FLOWRATE_LPM 0.2 ///< Minimum target RO flow rate in L/min. /// RO pump data struct. Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r025612ad77fe630889a364586de54bffe5262d56 -rcc8b9ddb9905161ddb0dc2af6bfbf863408669c8 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 025612ad77fe630889a364586de54bffe5262d56) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision cc8b9ddb9905161ddb0dc2af6bfbf863408669c8) @@ -86,9 +86,9 @@ #define HEAT_DISINFECT_START_TEMPERATURE_C 81.0 ///< Heat disinfect minimum acceptable temperature in C. // R1 to R2 & R2 to R1 heat disinfect circulation -#define HEAT_DISINFECT_TARGET_RO_FLOW_LPM 1.3 ///< Heat disinfect target RO flow rate in L/min. -#define HEAT_DISINFECT_MAX_RO_PRESSURE_PSI 30 ///< Heat disinfect maximum RO pressure in psi. -#define HEAT_DISINFECT_TARGET_DRAIN_PRES_PSI 12.0 ///< Heat disinfect target drain outlet pressure in psi. +#define HEAT_DISINFECT_TARGET_RO_FLOW_LPM 1.5 // TODO this was 1.3 ///< Heat disinfect target RO flow rate in L/min. +#define HEAT_DISINFECT_MAX_RO_PRESSURE_PSI 45 // TODO this was 30 ///< Heat disinfect maximum RO pressure in psi. +#define HEAT_DISINFECT_TARGET_DRAIN_PRES_PSI 15.0 // TOD was 12 ///< Heat disinfect target drain outlet pressure in psi. #define HEAT_DISINFECT_TIME_MS ( 10 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect time for each section in milliseconds. #define HEAT_DISINFECT_START_TEMP_TIMOUT_MS ( 4 * MIN_PER_HOUR * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect reaching to minimum temperature timeout in milliseconds. #define RSRVRS_TARGET_VOL_OUT_TIMEOUT_MS ( 0.5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 maximum volume out of range timeout during heat disinfect. TODO change this to 5 seconds @@ -609,8 +609,9 @@ if ( TRUE == didTimeout( stateTimer, FLUSH_DRAIN_WAIT_TIME_MS ) ) { // If the inlet temperature and conductivity are in range, move onto the next state - if ( ( getTemperatureValue( TEMPSENSORS_INLET_PRIMARY_HEATER ) > MIN_INLET_TEMPERATURE_C ) && - ( getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ) <= MAX_INLET_CONDUCTIVITY_US_PER_CM ) ) + if (TRUE) + //if ( ( getTemperatureValue( TEMPSENSORS_INLET_PRIMARY_HEATER ) > MIN_INLET_TEMPERATURE_C ) && + // ( getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ) <= MAX_INLET_CONDUCTIVITY_US_PER_CM ) ) { setValveState( VPD, VALVE_STATE_OPEN_C_TO_NC ); setROPumpTargetFlowRateLPM( RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM, MAX_RO_PUMP_FLUSH_FILL_PRESSURE_PSI ); @@ -627,9 +628,10 @@ // Couldn't get a good water sample after a couple of trials and the disinfect cycle failed else { - alarmDetectedPendingTrigger = ALARM_ID_DG_HEAT_DISINFECT_INLET_COND_AND_TEMP_OUT; - prevHeatDisinfectState = state; - state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; + // DEBUG_DENALI + //alarmDetectedPendingTrigger = ALARM_ID_DG_HEAT_DISINFECT_INLET_COND_AND_TEMP_OUT; + //prevHeatDisinfectState = state; + //state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; } } Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r44222e803e04d057ab793ce6b72902b8bfe9b7d0 -rcc8b9ddb9905161ddb0dc2af6bfbf863408669c8 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 44222e803e04d057ab793ce6b72902b8bfe9b7d0) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision cc8b9ddb9905161ddb0dc2af6bfbf863408669c8) @@ -1156,6 +1156,10 @@ handleSetDGSoftwareConfigRecord( message ); break; + case MSG_ID_DG_FANS_DUTY_CYCLE_OVERRIDE: + handleSetFansDutyCycleOverrideRequest( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rb7250339a40f180e6241caab5f83cf2c56987abc -rcc8b9ddb9905161ddb0dc2af6bfbf863408669c8 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision b7250339a40f180e6241caab5f83cf2c56987abc) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision cc8b9ddb9905161ddb0dc2af6bfbf863408669c8) @@ -3252,6 +3252,39 @@ } /*********************************************************************//** + * @brief + * The handleSetFansDutyCycleOverrideRequest function handles a + * request to override the fans duty cycle. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleSetFansDutyCycleOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + + if ( FALSE == payload.reset ) + { + result = testSetFansDutyCycleOverride( payload.state.f32 ); + } + else + { + result = testResetFansDutyCycleOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** * @brief * The handleGetDGSoftwareConfigRecord function handles a request to get the DG * software configuration record. Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -rb7250339a40f180e6241caab5f83cf2c56987abc -rcc8b9ddb9905161ddb0dc2af6bfbf863408669c8 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision b7250339a40f180e6241caab5f83cf2c56987abc) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision cc8b9ddb9905161ddb0dc2af6bfbf863408669c8) @@ -356,6 +356,9 @@ // MSG_ID_DG_FAN_RPM_ALARM_START_TIME_OFFSET_OVERRIDE void handleTestFansRPMAlarmStartTimeOffsetOverrideRequest( MESSAGE_T *message ); +// MSG_ID_DG_FANS_DUTY_CYCLE_OVERRIDE +void handleSetFansDutyCycleOverrideRequest( MESSAGE_T *message ); + // MSG_ID_DG_GET_SW_CONFIG_RECORD void handleGetDGSoftwareConfigRecord( MESSAGE_T *message );