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);
                }
            }