AC_SA_BoxBean_ADIO.cs 4.1 KB
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Diagnostics.Eventing.Reader;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    partial class AC_SA_BoxBean
    {
        public double GetADIO(int index) {
            switch (index)
            {
                case 1:
                    if (Ultrasonic1!= null)
                        return Ultrasonic1.Distance;
                    else
                        if (StoreManager.Config.AIDI1_Addr>=0)
                            return IOManager.GetADIOValue(StoreManager.Config.AIDI1_Addr);
                    break;
                case 2:
                    if (Ultrasonic2 != null)
                        return Ultrasonic2.Distance;
                    else
                        if (StoreManager.Config.AIDI2_Addr >= 0)
                            return IOManager.GetADIOValue(StoreManager.Config.AIDI2_Addr);
                    break;
                case 3:
                    if (StoreManager.Config.AIDI3_Addr >= 0)
                        return IOManager.GetADIOValue(StoreManager.Config.AIDI3_Addr);
                    break;
                case 4:
                    if (StoreManager.Config.AIDI4_Addr >= 0)
                        return IOManager.GetADIOValue(StoreManager.Config.AIDI4_Addr);
                    break;
                default:
                    return -1;
            }
            return -1;
        }
        IO_VALUE Last_TrayCheck_Door;
        DateTime Last_TrayCheck_Door_Time = DateTime.Now;
        IO_VALUE TrayCheck_Door
        {
            get
            {
                if (Ultrasonic1 != null)
                {
                    lock (Ultrasonic1) {
                        double xx = 0;
                        if (Ultrasonic1.Distance < Config.AIDI1_DefaultPosition) 
                            xx = Math.Abs(Ultrasonic1.Distance - Config.AIDI1_DefaultPosition);
                        var vv = xx >= 4 ? IO_VALUE.HIGH : IO_VALUE.LOW;
                        var Filter = vv;
                        if (vv != Last_TrayCheck_Door)
                        {
                            Last_TrayCheck_Door = vv;
                            Last_TrayCheck_Door_Time = DateTime.Now;
                        }

                        if (vv == IO_VALUE.LOW && (DateTime.Now - Last_TrayCheck_Door_Time).TotalMilliseconds < 1800)
                            Filter = IO_VALUE.HIGH;

                        if (Ultrasonic2 != null)
                        {
                            double x2 = 0;
                            if (Ultrasonic2.Distance< Config.AIDI2_DefaultPosition)
                                x2 = Math.Abs(Ultrasonic2.Distance - Config.AIDI2_DefaultPosition);
                            var v2 = x2 >= 4 ? IO_VALUE.HIGH : IO_VALUE.LOW;
                            if (v2 == IO_VALUE.HIGH)
                                Filter = IO_VALUE.HIGH;
                            LogUtil.info($"Ultrasonic1.Distance:{Ultrasonic1.Distance},U2:{Ultrasonic2.Distance},{xx},{vv},Filter={Filter},v2:{v2}");
                        }
                        else
                            LogUtil.info("Ultrasonic1.Distance:" + Ultrasonic1.Distance + "," + xx + "," + vv + ",Filter=" + Filter);
                        return Filter;
                    }
                }
                else
                    return IOManager.IOValue(IO_Type.TrayCheck_Door);
            }
        }
    }

    public class DebounceFilter
    {
        private IO_VALUE _lastValue;
        private int _counter;
        private readonly int _threshold;

        public DebounceFilter(int threshold)
        {
            _threshold = threshold;
        }

        public IO_VALUE Filter(IO_VALUE value)
        {
            if (value == _lastValue)
            {
                _counter = 0;
                return value;
            }

            _counter++;
            if (_counter >= _threshold)
            {
                _lastValue = value;
                _counter = 0;
                return value;
            }

            return _lastValue;
        }
    }
}