using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Reflection;
using System.Diagnostics;
using System.Windows.Media;
using Misc;
using FLY.OBJComponents.IService;
using System.Threading;

namespace FLY.IBC.Common
{
    public class TempArea : INotifyPropertyChanged, IPropertyOpt
    {
        public TempArea(string number)
        {
            Number = number;
            TemperaturesBinding();
        }

        /// <summary>
        /// 名称:M,A,B,C,D,E
        /// </summary>
        public string Number { get; set; }

        #region 辅助代码生成
        /// <summary>
        /// 温度显示1
        /// </summary>
        [Description("温度显示1")]
        public float TempPV1{ get; set; }

        /// <summary>
        /// 温度显示2
        /// </summary>
        [Description("温度显示2")]
        public float TempPV2{ get; set; }

        /// <summary>
        /// 温度显示3
        /// </summary>
        [Description("温度显示3")]
        public float TempPV3{ get; set; }

        /// <summary>
        /// 温度显示4
        /// </summary>
        [Description("温度显示4")]
        public float TempPV4{ get; set; }

        /// <summary>
        /// 温度显示5
        /// </summary>
        [Description("温度显示5")]
        public float TempPV5{ get; set; }

        /// <summary>
        /// 温度显示6
        /// </summary>
        [Description("温度显示6")]
        public float TempPV6{ get; set; }

        /// <summary>
        /// 通道选择1
        /// </summary>
        [Description("通道选择1")]
        public float Channel1{ get; set; }

        /// <summary>
        /// 通道选择2
        /// </summary>
        [Description("通道选择2")]
        public float Channel2{ get; set; }

        /// <summary>
        /// 通道选择3
        /// </summary>
        [Description("通道选择3")]
        public float Channel3{ get; set; }

        /// <summary>
        /// 通道选择4
        /// </summary>
        [Description("通道选择4")]
        public float Channel4{ get; set; }

        /// <summary>
        /// 通道选择5
        /// </summary>
        [Description("通道选择5")]
        public float Channel5{ get; set; }

        /// <summary>
        /// 通道选择6
        /// </summary>
        [Description("通道选择6")]
        public float Channel6{ get; set; }

        /// <summary>
        /// 比例输入1
        /// </summary>
        [Description("比例输入1")]
        public float PSet1{ get; set; }

        /// <summary>
        /// 比例输入2
        /// </summary>
        [Description("比例输入2")]
        public float PSet2{ get; set; }

        /// <summary>
        /// 比例输入3
        /// </summary>
        [Description("比例输入3")]
        public float PSet3{ get; set; }

        /// <summary>
        /// 比例输入4
        /// </summary>
        [Description("比例输入4")]
        public float PSet4{ get; set; }

        /// <summary>
        /// 比例输入5
        /// </summary>
        [Description("比例输入5")]
        public float PSet5{ get; set; }

        /// <summary>
        /// 比例输入6
        /// </summary>
        [Description("比例输入6")]
        public float PSet6{ get; set; }

        /// <summary>
        /// 比例修改通知1
        /// </summary>
        [Description("比例修改通知1")]
        public float IsPChanged1{ get; set; }

        /// <summary>
        /// 比例修改通知2
        /// </summary>
        [Description("比例修改通知2")]
        public float IsPChanged2{ get; set; }

        /// <summary>
        /// 比例修改通知3
        /// </summary>
        [Description("比例修改通知3")]
        public float IsPChanged3{ get; set; }

        /// <summary>
        /// 比例修改通知4
        /// </summary>
        [Description("比例修改通知4")]
        public float IsPChanged4{ get; set; }

        /// <summary>
        /// 比例修改通知5
        /// </summary>
        [Description("比例修改通知5")]
        public float IsPChanged5{ get; set; }

        /// <summary>
        /// 比例修改通知6
        /// </summary>
        [Description("比例修改通知6")]
        public float IsPChanged6{ get; set; }

        /// <summary>
        /// 积分输入1
        /// </summary>
        [Description("积分输入1")]
        public float ISet1{ get; set; }

        /// <summary>
        /// 积分输入2
        /// </summary>
        [Description("积分输入2")]
        public float ISet2{ get; set; }

        /// <summary>
        /// 积分输入3
        /// </summary>
        [Description("积分输入3")]
        public float ISet3{ get; set; }

        /// <summary>
        /// 积分输入4
        /// </summary>
        [Description("积分输入4")]
        public float ISet4{ get; set; }

        /// <summary>
        /// 积分输入5
        /// </summary>
        [Description("积分输入5")]
        public float ISet5{ get; set; }

        /// <summary>
        /// 积分输入6
        /// </summary>
        [Description("积分输入6")]
        public float ISet6{ get; set; }

        /// <summary>
        /// 积分修改通知1
        /// </summary>
        [Description("积分修改通知1")]
        public float IsIChanged1{ get; set; }

        /// <summary>
        /// 积分修改通知2
        /// </summary>
        [Description("积分修改通知2")]
        public float IsIChanged2{ get; set; }

        /// <summary>
        /// 积分修改通知3
        /// </summary>
        [Description("积分修改通知3")]
        public float IsIChanged3{ get; set; }

        /// <summary>
        /// 积分修改通知4
        /// </summary>
        [Description("积分修改通知4")]
        public float IsIChanged4{ get; set; }

        /// <summary>
        /// 积分修改通知5
        /// </summary>
        [Description("积分修改通知5")]
        public float IsIChanged5{ get; set; }

        /// <summary>
        /// 积分修改通知6
        /// </summary>
        [Description("积分修改通知6")]
        public float IsIChanged6{ get; set; }

        /// <summary>
        /// 微分输入1
        /// </summary>
        [Description("微分输入1")]
        public float DSet1{ get; set; }

        /// <summary>
        /// 微分输入2
        /// </summary>
        [Description("微分输入2")]
        public float DSet2{ get; set; }

        /// <summary>
        /// 微分输入3
        /// </summary>
        [Description("微分输入3")]
        public float DSet3{ get; set; }

        /// <summary>
        /// 微分输入4
        /// </summary>
        [Description("微分输入4")]
        public float DSet4{ get; set; }

        /// <summary>
        /// 微分输入5
        /// </summary>
        [Description("微分输入5")]
        public float DSet5{ get; set; }

        /// <summary>
        /// 微分输入6
        /// </summary>
        [Description("微分输入6")]
        public float DSet6{ get; set; }

        /// <summary>
        /// 微分修改通知1
        /// </summary>
        [Description("微分修改通知1")]
        public float IsDChanged1{ get; set; }

        /// <summary>
        /// 微分修改通知2
        /// </summary>
        [Description("微分修改通知2")]
        public float IsDChanged2{ get; set; }

        /// <summary>
        /// 微分修改通知3
        /// </summary>
        [Description("微分修改通知3")]
        public float IsDChanged3{ get; set; }

        /// <summary>
        /// 微分修改通知4
        /// </summary>
        [Description("微分修改通知4")]
        public float IsDChanged4{ get; set; }

        /// <summary>
        /// 微分修改通知5
        /// </summary>
        [Description("微分修改通知5")]
        public float IsDChanged5{ get; set; }

        /// <summary>
        /// 微分修改通知6
        /// </summary>
        [Description("微分修改通知6")]
        public float IsDChanged6{ get; set; }

        /// <summary>
        /// 温度修正1
        /// </summary>
        [Description("温度修正1")]
        public float TempCorr1{ get; set; }

        /// <summary>
        /// 温度修正2
        /// </summary>
        [Description("温度修正2")]
        public float TempCorr2{ get; set; }

        /// <summary>
        /// 温度修正3
        /// </summary>
        [Description("温度修正3")]
        public float TempCorr3{ get; set; }

        /// <summary>
        /// 温度修正4
        /// </summary>
        [Description("温度修正4")]
        public float TempCorr4{ get; set; }

        /// <summary>
        /// 温度修正5
        /// </summary>
        [Description("温度修正5")]
        public float TempCorr5{ get; set; }

        /// <summary>
        /// 温度修正6
        /// </summary>
        [Description("温度修正6")]
        public float TempCorr6{ get; set; }

        /// <summary>
        /// 温度修正修改通知
        /// </summary>
        [Description("温度修正修改通知")]
        public float IsTempCorrChanged{ get; set; }

        /// <summary>
        /// 冷却设定1
        /// </summary>
        [Description("冷却设定1")]
        public float CoolingSet1{ get; set; }

        /// <summary>
        /// 冷却设定2
        /// </summary>
        [Description("冷却设定2")]
        public float CoolingSet2{ get; set; }

        /// <summary>
        /// 冷却设定3
        /// </summary>
        [Description("冷却设定3")]
        public float CoolingSet3{ get; set; }

        /// <summary>
        /// 冷却设定4
        /// </summary>
        [Description("冷却设定4")]
        public float CoolingSet4{ get; set; }

        /// <summary>
        /// 整定开关1
        /// </summary>
        [Description("整定开关1")]
        public float IsSelfAdjustingSet1{ get; set; }

        /// <summary>
        /// 整定开关2
        /// </summary>
        [Description("整定开关2")]
        public float IsSelfAdjustingSet2{ get; set; }

        /// <summary>
        /// 整定开关3
        /// </summary>
        [Description("整定开关3")]
        public float IsSelfAdjustingSet3{ get; set; }

        /// <summary>
        /// 整定开关4
        /// </summary>
        [Description("整定开关4")]
        public float IsSelfAdjustingSet4{ get; set; }

        /// <summary>
        /// 整定开关5
        /// </summary>
        [Description("整定开关5")]
        public float IsSelfAdjustingSet5{ get; set; }

        /// <summary>
        /// 整定开关6
        /// </summary>
        [Description("整定开关6")]
        public float IsSelfAdjustingSet6{ get; set; }

        /// <summary>
        /// 整定显示1
        /// </summary>
        [Description("整定显示1")]
        public float IsSelfAdjusting1{ get; set; }

        /// <summary>
        /// 整定显示2
        /// </summary>
        [Description("整定显示2")]
        public float IsSelfAdjusting2{ get; set; }

        /// <summary>
        /// 整定显示3
        /// </summary>
        [Description("整定显示3")]
        public float IsSelfAdjusting3{ get; set; }

        /// <summary>
        /// 整定显示4
        /// </summary>
        [Description("整定显示4")]
        public float IsSelfAdjusting4{ get; set; }

        /// <summary>
        /// 整定显示5
        /// </summary>
        [Description("整定显示5")]
        public float IsSelfAdjusting5{ get; set; }

        /// <summary>
        /// 整定显示6
        /// </summary>
        [Description("整定显示6")]
        public float IsSelfAdjusting6{ get; set; }

        /// <summary>
        /// 比例显示1
        /// </summary>
        [Description("比例显示1")]
        public float P1{ get; set; }

        /// <summary>
        /// 比例显示2
        /// </summary>
        [Description("比例显示2")]
        public float P2{ get; set; }

        /// <summary>
        /// 比例显示3
        /// </summary>
        [Description("比例显示3")]
        public float P3{ get; set; }

        /// <summary>
        /// 比例显示4
        /// </summary>
        [Description("比例显示4")]
        public float P4{ get; set; }

        /// <summary>
        /// 比例显示5
        /// </summary>
        [Description("比例显示5")]
        public float P5{ get; set; }

        /// <summary>
        /// 比例显示6
        /// </summary>
        [Description("比例显示6")]
        public float P6{ get; set; }

        /// <summary>
        /// 积分显示1
        /// </summary>
        [Description("积分显示1")]
        public float I1{ get; set; }

        /// <summary>
        /// 积分显示2
        /// </summary>
        [Description("积分显示2")]
        public float I2{ get; set; }

        /// <summary>
        /// 积分显示3
        /// </summary>
        [Description("积分显示3")]
        public float I3{ get; set; }

        /// <summary>
        /// 积分显示4
        /// </summary>
        [Description("积分显示4")]
        public float I4{ get; set; }

        /// <summary>
        /// 积分显示5
        /// </summary>
        [Description("积分显示5")]
        public float I5{ get; set; }

        /// <summary>
        /// 积分显示6
        /// </summary>
        [Description("积分显示6")]
        public float I6{ get; set; }

        /// <summary>
        /// 微分显示1
        /// </summary>
        [Description("微分显示1")]
        public float D1{ get; set; }

        /// <summary>
        /// 微分显示2
        /// </summary>
        [Description("微分显示2")]
        public float D2{ get; set; }

        /// <summary>
        /// 微分显示3
        /// </summary>
        [Description("微分显示3")]
        public float D3{ get; set; }

        /// <summary>
        /// 微分显示4
        /// </summary>
        [Description("微分显示4")]
        public float D4{ get; set; }

        /// <summary>
        /// 微分显示5
        /// </summary>
        [Description("微分显示5")]
        public float D5{ get; set; }

        /// <summary>
        /// 微分显示6
        /// </summary>
        [Description("微分显示6")]
        public float D6{ get; set; }

        /// <summary>
        /// 温度输入1
        /// </summary>
        [Description("温度输入1")]
        public float TempSV1{ get; set; }

        /// <summary>
        /// 温度输入2
        /// </summary>
        [Description("温度输入2")]
        public float TempSV2{ get; set; }

        /// <summary>
        /// 温度输入3
        /// </summary>
        [Description("温度输入3")]
        public float TempSV3{ get; set; }

        /// <summary>
        /// 温度输入4
        /// </summary>
        [Description("温度输入4")]
        public float TempSV4{ get; set; }

        /// <summary>
        /// 温度输入5
        /// </summary>
        [Description("温度输入5")]
        public float TempSV5{ get; set; }

        /// <summary>
        /// 温度输入6
        /// </summary>
        [Description("温度输入6")]
        public float TempSV6{ get; set; }

        /// <summary>
        /// 冷却指示1
        /// </summary>
        [Description("冷却指示1")]
        public float IsCooling1{ get; set; }

        /// <summary>
        /// 冷却指示2
        /// </summary>
        [Description("冷却指示2")]
        public float IsCooling2 { get; set; }

        /// <summary>
        /// 冷却指示3
        /// </summary>
        [Description("冷却指示3")]
        public float IsCooling3 { get; set; }

        /// <summary>
        /// 冷却指示4
        /// </summary>
        [Description("冷却指示4")]
        public float IsCooling4 { get; set; }

        /// <summary>
        /// 加热指示1
        /// </summary>
        [Description("加热指示1")]
        public float IsHeating1{ get; set; }

        /// <summary>
        /// 加热指示2
        /// </summary>
        [Description("加热指示2")]
        public float IsHeating2{ get; set; }

        /// <summary>
        /// 加热指示3
        /// </summary>
        [Description("加热指示3")]
        public float IsHeating3{ get; set; }

        /// <summary>
        /// 加热指示4
        /// </summary>
        [Description("加热指示4")]
        public float IsHeating4{ get; set; }

        /// <summary>
        /// 加热指示5
        /// </summary>
        [Description("加热指示5")]
        public float IsHeating5{ get; set; }

        /// <summary>
        /// 加热指示6
        /// </summary>
        [Description("加热指示6")]
        public float IsHeating6{ get; set; }

        /// <summary>
        /// 加热开关1
        /// </summary>
        [Description("加热开关1")]
        public float IsHeatingSet1{ get; set; }

        /// <summary>
        /// 加热开关2
        /// </summary>
        [Description("加热开关2")]
        public float IsHeatingSet2{ get; set; }

        /// <summary>
        /// 加热开关3
        /// </summary>
        [Description("加热开关3")]
        public float IsHeatingSet3{ get; set; }

        /// <summary>
        /// 加热开关4
        /// </summary>
        [Description("加热开关4")]
        public float IsHeatingSet4{ get; set; }

        /// <summary>
        /// 加热开关5
        /// </summary>
        [Description("加热开关5")]
        public float IsHeatingSet5{ get; set; }

        /// <summary>
        /// 加热开关6
        /// </summary>
        [Description("加热开关6")]
        public float IsHeatingSet6{ get; set; }

        /// <summary>
        /// 温度输入被修改1
        /// </summary>
        [Description("温度输入被修改1")]
        public float IsTempSetChanged1{ get; set; }

        /// <summary>
        /// 温度输入被修改2
        /// </summary>
        [Description("温度输入被修改2")]
        public float IsTempSetChanged2{ get; set; }

        /// <summary>
        /// 温度输入被修改3
        /// </summary>
        [Description("温度输入被修改3")]
        public float IsTempSetChanged3{ get; set; }

        /// <summary>
        /// 温度输入被修改4
        /// </summary>
        [Description("温度输入被修改4")]
        public float IsTempSetChanged4{ get; set; }

        /// <summary>
        /// 温度输入被修改5
        /// </summary>
        [Description("温度输入被修改5")]
        public float IsTempSetChanged5{ get; set; }

        /// <summary>
        /// 温度输入被修改6
        /// </summary>
        [Description("温度输入被修改6")]
        public float IsTempSetChanged6{ get; set; }

        /// <summary>
        /// 全温度输入
        /// </summary>
        [Description("全温度输入")]
        public float AllTempSet{ get; set; }

        /// <summary>
        /// 全温度输入被修改
        /// </summary>
        [Description("全温度输入被修改")]
        public float IsAllTempSetChanged{ get; set; }

        /// <summary>
        /// 全温度开关
        /// </summary>
        [Description("全温度开关")]
        public float IsAllTempSame{ get; set; }

        /// <summary>
        /// 冷却风机报警
        /// </summary>
        [Description("冷却风机报警")]
        [IsError()]
        public bool IsCoolingMotorError{ get; set; }

        #endregion

        public string[] GetSyncPropNames()
        {
            return null;
        }

        public string[] GetNoSyncPropNames()
        {
            return new string[] {
                "Number",
                "Color",
                "BinCnt",
                "Ingredients",
                "IngredientParams"

            };
        }

        public List<TempCell> Temperatures { get; } = new List<TempCell>();

        /// <summary>
        /// 料仓,混料参数 绑定到 对应的队列
        /// </summary>
        void TemperaturesBinding()
        {
            Temperatures.Clear();

            for (int i = 0; i < 6; i++)
            {
                int no = i + 1;
                TempCell temperature = new TempCell();
                temperature.Number = no.ToString();

                Misc.BindingOperations.SetBinding(this, $"TempPV{no}", temperature, nameof(temperature.TempPV));
                Misc.BindingOperations.SetBinding(this, $"Channel{no}", temperature, nameof(temperature.Channel), Misc.BindingOperations.BindingMode.TwoWay);
                Misc.BindingOperations.SetBinding(this, $"PSet{no}", temperature, nameof(temperature.PSet), Misc.BindingOperations.BindingMode.TwoWay);
                Misc.BindingOperations.SetBinding(this, $"IsPChanged{no}", temperature, nameof(temperature.IsPChanged), Misc.BindingOperations.BindingMode.TwoWay);
                Misc.BindingOperations.SetBinding(this, $"ISet{no}", temperature, nameof(temperature.ISet), Misc.BindingOperations.BindingMode.TwoWay);
                Misc.BindingOperations.SetBinding(this, $"IsIChanged{no}", temperature, nameof(temperature.IsIChanged), Misc.BindingOperations.BindingMode.TwoWay);
                Misc.BindingOperations.SetBinding(this, $"DSet{no}", temperature, nameof(temperature.DSet), Misc.BindingOperations.BindingMode.TwoWay);
                Misc.BindingOperations.SetBinding(this, $"IsDChanged{no}", temperature, nameof(temperature.IsDChanged), Misc.BindingOperations.BindingMode.TwoWay);
                Misc.BindingOperations.SetBinding(this, $"TempCorr{no}", temperature, nameof(temperature.TempCorr), Misc.BindingOperations.BindingMode.TwoWay);
                Misc.BindingOperations.SetBinding(this, $"CoolingSet{no}", temperature, nameof(temperature.CoolingSet), Misc.BindingOperations.BindingMode.TwoWay);
                Misc.BindingOperations.SetBinding(this, $"IsSelfAdjustingSet{no}", temperature, nameof(temperature.IsSelfAdjustingSet), Misc.BindingOperations.BindingMode.TwoWay);
                Misc.BindingOperations.SetBinding(this, $"IsSelfAdjusting{no}", temperature, nameof(temperature.IsSelfAdjusting));
                Misc.BindingOperations.SetBinding(this, $"P{no}", temperature, nameof(temperature.P));
                Misc.BindingOperations.SetBinding(this, $"I{no}", temperature, nameof(temperature.I));
                Misc.BindingOperations.SetBinding(this, $"D{no}", temperature, nameof(temperature.D));
                Misc.BindingOperations.SetBinding(this, $"TempSV{no}", temperature, nameof(temperature.TempSV), Misc.BindingOperations.BindingMode.TwoWay);
                Misc.BindingOperations.SetBinding(this, $"Cooling{no}", temperature, nameof(temperature.IsCooling));
                Misc.BindingOperations.SetBinding(this, $"IsHeating{no}", temperature, nameof(temperature.IsHeating));
                Misc.BindingOperations.SetBinding(this, $"IsHeatingSet{no}", temperature, nameof(temperature.IsHeatingSet), Misc.BindingOperations.BindingMode.TwoWay);
                Misc.BindingOperations.SetBinding(this, $"IsTempSetChanged{no}", temperature, nameof(temperature.IsTempSetChanged), Misc.BindingOperations.BindingMode.TwoWay);

                Temperatures.Add(temperature);
            }


        }
        public event PropertyChangedEventHandler PropertyChanged;
    }

    public class TempCell : INotifyPropertyChanged
    {
        /// <summary>
        /// 序号
        /// </summary>
        public string Number { get; set; }
        /// <summary>
        /// 温度显示
        /// </summary>
        [Description("温度显示")]
        public float TempPV { get; set; }

        /// <summary>
        /// 通道选择
        /// </summary>
        [Description("通道选择")]
        public float Channel { get; set; }



        /// <summary>
        /// 比例输入
        /// </summary>
        [Description("比例输入")]
        public float PSet { get; set; }


        /// <summary>
        /// 比例修改通知
        /// </summary>
        [Description("比例修改通知")]
        public float IsPChanged { get; set; }

        /// <summary>
        /// 积分输入
        /// </summary>
        [Description("积分输入")]
        public float ISet { get; set; }


        /// <summary>
        /// 积分修改通知
        /// </summary>
        [Description("积分修改通知")]
        public float IsIChanged { get; set; }


        /// <summary>
        /// 微分输入
        /// </summary>
        [Description("微分输入")]
        public float DSet { get; set; }


        /// <summary>
        /// 微分修改通知
        /// </summary>
        [Description("微分修改通知")]
        public float IsDChanged { get; set; }


        /// <summary>
        /// 温度修正
        /// </summary>
        [Description("温度修正")]
        public float TempCorr { get; set; }


        /// <summary>
        /// 冷却设定
        /// </summary>
        [Description("冷却设定")]
        public float CoolingSet { get; set; }


        /// <summary>
        /// 整定开关
        /// </summary>
        [Description("整定开关")]
        public float IsSelfAdjustingSet { get; set; }


        /// <summary>
        /// 整定显示
        /// </summary>
        [Description("整定显示")]
        public float IsSelfAdjusting { get; set; }


        /// <summary>
        /// 比例显示
        /// </summary>
        [Description("比例显示")]
        public float P { get; set; }


        /// <summary>
        /// 积分显示
        /// </summary>
        [Description("积分显示")]
        public float I { get; set; }


        /// <summary>
        /// 微分显示
        /// </summary>
        [Description("微分显示")]
        public float D { get; set; }

        /// <summary>
        /// 温度输入
        /// </summary>
        [Description("温度输入")]
        public float TempSV { get; set; }

        /// <summary>
        /// 冷却指示
        /// </summary>
        [Description("冷却指示")]
        public bool IsCooling { get; set; }


        /// <summary>
        /// 加热指示
        /// </summary>
        [Description("加热指示")]
        public bool IsHeating { get; set; }


        /// <summary>
        /// 加热开关
        /// </summary>
        [Description("加热开关")]
        public bool IsHeatingSet { get; set; }



        /// <summary>
        /// 温度输入被修改通知
        /// </summary>
        [Description("温度输入被修改通知")]
        public bool IsTempSetChanged { get; set; }


        public event PropertyChangedEventHandler PropertyChanged;
    }
}