public void ResetCooldown() { if (enable && state == AutoTopOffState.Cooldown) { timer.Reset(); state = AutoTopOffState.Standby; } }
protected void OnTimerElapsed(object sender, TimerElapsedEventArgs args) { if (state == AutoTopOffState.Filling) { Bit.Instance.Reset(requestBitName); state = AutoTopOffState.Error; Alarm.Post(failAlarmIndex); } else if (state == AutoTopOffState.Cooldown) { state = AutoTopOffState.Standby; } }
public bool ClearAlarm() { if (state == AutoTopOffState.Error) { if (Alarm.CheckAcknowledged(failAlarmIndex)) { Alarm.Clear(failAlarmIndex); state = AutoTopOffState.Standby; return(true); } } return(false); }
public AutoTopOffGroup( string name, bool enable, string requestBitName, string waterLevelGroupName, uint maximumRuntime, uint minimumCooldown, bool useAnalogSensors, float analogOnSetpoint, float analogOffSetpoint, bool useFloatSwitches ) { this.name = name; this.enable = enable; this.requestBitName = requestBitName; this.waterLevelGroupName = waterLevelGroupName; this.maximumRuntime = maximumRuntime; this.minimumCooldown = minimumCooldown; this.useAnalogSensors = useAnalogSensors; this.analogOnSetpoint = analogOnSetpoint; this.analogOffSetpoint = analogOffSetpoint; this.useFloatSwitches = useFloatSwitches; if (enable) { state = AutoTopOffState.Standby; } else { state = AutoTopOffState.Off; } Bit.Instance.Set(this.requestBitName, false); timer = IntervalTimer.GetTimer(name); timer.TimerElapsedEvent += OnTimerElapsed; timer.Reset(); failAlarmIndex = Alarm.Subscribe(string.Format("{0}, ATO, failed", name)); }
public void GroupRun() { if (enable) { bool pumpOnRequest = false; switch (state) { case AutoTopOffState.Standby: // If the water level group isn't alarming on high allow pump on request pumpOnRequest = !WaterLevel.GetWaterLevelGroupHighAlarming(waterLevelGroupName); if (useAnalogSensors) { if (WaterLevel.GetWaterLevelGroupAnalogSensorConnected(waterLevelGroupName)) { pumpOnRequest &= WaterLevel.GetWaterLevelGroupLevel(waterLevelGroupName) < analogOnSetpoint; } else { pumpOnRequest = false; } } if (useFloatSwitches) { pumpOnRequest &= WaterLevel.GetWaterLevelGroupSwitchesActivated(waterLevelGroupName); } pumpOnRequest |= Bit.Instance.Check(requestBitName); if (pumpOnRequest) { state = AutoTopOffState.Filling; Logger.Add("Starting auto top off"); timer.Reset(); timer.totalSeconds = maximumRuntime * 60; timer.Start(); } break; case AutoTopOffState.Filling: var pumpOffRequest = true; // Check analog sensor if (useAnalogSensors) { if (WaterLevel.GetWaterLevelGroupAnalogSensorConnected(waterLevelGroupName)) { // If the level is greater than the off setpoint the request is off pumpOffRequest &= WaterLevel.GetWaterLevelGroupLevel(waterLevelGroupName) > analogOffSetpoint; } } // check float switch if (useFloatSwitches) { pumpOffRequest &= !WaterLevel.GetWaterLevelGroupSwitchesActivated(waterLevelGroupName); } pumpOffRequest |= !Bit.Instance.Check(requestBitName); pumpOffRequest |= WaterLevel.GetWaterLevelGroupHighAlarming(waterLevelGroupName); pumpOnRequest = !pumpOffRequest; if (pumpOffRequest) { state = AutoTopOffState.Cooldown; timer.Reset(); Logger.Add("Stopping auto top off. Runtime: {0} secs", timer.totalSeconds - timer.secondsRemaining); timer.totalSeconds = minimumCooldown * 60; timer.Start(); } break; case AutoTopOffState.Cooldown: case AutoTopOffState.Error: default: pumpOnRequest = false; break; } if (pumpOnRequest) { Bit.Instance.Set(requestBitName); } else { Bit.Instance.Reset(requestBitName); } } else { state = AutoTopOffState.Off; Bit.Instance.Reset(requestBitName); } }