using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Misc;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace FLY.Thick.Base.Common
{
    /// <summary>
    /// 动态数据，推送当前所有状态
    /// </summary>
    public class DynArea : INotifyPropertyChanged
    {
        public DynArea() 
        {
            this.PropertyChanged += new PropertyChangedEventHandler(DynArea_PropertyChanged);
        }

        void DynArea_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "Hrs") 
            {
                if (Hrs == 0)
                {
                    SecuteLock = true;
                }
                else 
                {
                    SecuteLock = false;
                }
            }
        }

        #region BASE

        /// <summary>
        /// x100
        /// </summary>
        public int Thick { get; set; } = 3210;

        
        /// <summary>
        /// 编码器1 位置 脉冲
        /// </summary>
        public int Position { get; set; }


        /// <summary>
        /// 分区序号
        /// </summary>
        public int BoltIndex { get; set; }
        /// <summary>
        /// 分区号
        /// </summary>
        public int BoltNo
        {
            get { return BoltIndex + FirstBoltNo; }
        }
        /// <summary>
        /// AD值
        /// </summary>
        public int AD { get; set; } = 12345;
        /// <summary>
        /// 最大AD值
        /// </summary>
        public int ADMax { get; set; } = 65535;
        #endregion

        #region POSITION2

        /// <summary>
        /// 编码器2 位置 脉冲
        /// </summary>
        public int Position2 { get; set; }
        #endregion
        #region 扫描

        /// <summary>
        /// 最新样品AD
        /// </summary>
        [PropertyChanged.DoNotCheckEquality]
        public int[] SampleAD { get; set; }
 
        /// <summary>
        /// 数据是否有效， 当膜没有动时，为无效。 通过PLC获取，或编码器判断
        /// </summary>
        public bool DataValid { get; set; }

        /// <summary>
        /// 扫描方向
        /// </summary>
        public Misc.DIRECTION Direction { get; set; } = DIRECTION.FIX;

        /// <summary>
        /// 膜宽 mm
        /// </summary>
        public double Width { get; set; } = 600;
        /// <summary>
        /// 生产速度 m/min
        /// </summary>
        public double FilmVelocity { get; set; }
        /// <summary>
        /// 膜生产位置 m
        /// </summary>
        public double FilmPosition { get; set; }
        /// <summary>
        /// 测厚仪速度 m/min
        /// </summary>
        public double Velocity { get; set; }
        #endregion

        #region 运行状态
        /// <summary>
        /// 运行状态
        /// </summary>
        public CTRL_STATE ControllerState { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public int AutoScanCounter { get; set; } = 5;

        #endregion

        #region IO

        public UInt16 IStatus { get; set; } = 0xffff;

        public UInt16 OStatus { get; set; } = 0xffff;

        #endregion

        #region 系统
        /// <summary>
        /// 系统剩余小时数
        /// </summary>
        public int Hrs { get; set; } = 3;

        /// <summary>
        /// FLYAD 连接状态
        /// </summary>
        public bool FLYADIsConnect { get; set; }



        /// <summary>
        /// 过期， 锁ing
        /// </summary>
        public bool SecuteLock { get; set; }

        /// <summary>
        /// 服务器连接断开
        /// </summary>
        public bool ServerIsConnected { get; set; }


        #endregion

        #region PROFILE 运行参数

        /// <summary>
        /// 产品名称
        /// </summary>
        public string ProductName { get; set; } = "default";


        /// <summary>
        /// 目标值 x100
        /// </summary>
        public int Target { get; set; } = 3000;



        /// <summary>
        /// 报警值 x100
        /// </summary>
        public int Alarm { get; set; } = 100;

        /// <summary>
        /// Y轴范围
        /// </summary>
        public int YRange 
        {
            get { return Alarm * 3; }
        }
        /// <summary>
        /// 斜率补偿
        /// </summary>
        public double Comp { get; set; } = 1;

        /// <summary>
        /// 平移补偿
        /// </summary>
        public int Shift { get; set; } = 0;


        /// <summary>
        /// 数据开始分区号
        /// </summary>
        public int DataBoltNoBegin { get; set; } = 0;


        /// <summary>
        /// 数据结束分区号
        /// </summary>
        public int DataBoltNoEnd { get; set; } = 30;

        /// <summary>
        /// 扫描范围 开始
        /// </summary>
        public int ScanBoltNoBegin { get; set; } = 0;

        /// <summary>
        /// 扫描范围 结束
        /// </summary>
        public int ScanBoltNoEnd { get; set; } = 30;

        #endregion

        #region BOLTMAP 分区信息

        /// <summary>
        /// 总分区数
        /// </summary>
        public int NBolts { get; set; } = 50;

        /// <summary>
        /// 开始分区号
        /// </summary>
        public int FirstBoltNo { get; set; }

        #endregion


        #region INotifyPropertyChanged 成员

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion
    }
}
