using System;
using System.Collections.Generic;
using System.Text;
using Misc;
using System.Net;
using System.IO;
using System.ComponentModel;
using System.Xml.Linq;
using FLY.Thick.Base.Common;
using FLY.Thick.Base.IService;

namespace FLY.Thick.Base.Server
{
    //硬件配置参数
    public class InitParam: IInitParamService,  INotifyPropertyChanged, Misc.ISaveToXml
    {
        #region 属性，成员变量的代理
        /// <summary>
        /// 扫描架长
        /// </summary>
        public int PosLength { get; set; } = 8900;

        /// <summary>
        /// 从 flyad7 获取的
        /// </summary>
        public int PosOfGrid { get; set; } = 10;
        
        /// <summary>
        /// ad 滞后量  ms
        /// </summary>
        public int ADLag { get; set; }

        /// <summary>
        /// 自动归原点间距
        /// </summary>
        public int AutoOrgInterval { get; set; } = 10;
       


        /// <summary>
        /// 线速度来源
        /// </summary>
        public FilmVSRC FilmVSrc { get; set; } = FilmVSRC.ROUND;
        
        /// <summary>
        /// 最小线速度 m/min
        /// </summary>
        public int FilmVThreshold { get; set; } = 5;




        /// <summary>
        /// 编码器2 mm/pulse
        /// </summary>
        public double Encoder2_mmpp { get; set; } = 0.1;

        
        /// <summary>
        /// 编码器2 放大
        /// </summary>
        public float Encoder2_comp { get; set; } = 1;
        
        /// <summary>
        /// //1圈多少mm
        /// </summary>
        public double MmOfR { get; set; } = 376.8;

        /// <summary>
        /// 编码器1 mm/pulse
        /// </summary>
        public double Encoder1_mmpp { get; set; } = 0.1;




        /// <summary>
        /// 设置的速度，与 实际速度比例
        /// </summary>
        public double Speed1Scale { get; set; } = 1;


        /// <summary>
        /// 扫描时速度
        /// </summary>
        public UInt32 VScan { get; set; } = 8000;



        /// <summary>
        /// 调试时速度，向前走，向后走
        /// </summary>
        public UInt32 VJOG { get; set; } = 5000;

        /// <summary>
        /// 精确速度 Velocity Of Accuracy  如: 机架修正, 样品取样, 机架信息获取
        /// </summary>
        public UInt32 VAccuracy { get; set; } = 3000;

        
        /// <summary>
        /// 开始速度 Start Velocity
        /// </summary>
        public UInt32 SVelocity { get; set; } = 500;
        
        /// <summary>
        /// 加速时间
        /// </summary>
        public UInt32 ATime { get; set; } = 200;
        
        /// <summary>
        /// 减速时间
        /// </summary>
        public UInt32 DTime { get; set; } = 200;
        
        /// <summary>
        /// 归0速度1
        /// </summary>
        public UInt32 HVelocity1 { get; set; } = 5000;
        
        /// <summary>
        /// 归0速度2
        /// </summary>
        public UInt32 HVelocity2 { get; set; } = 1000;




        /// <summary>
        /// 数据有效源
        /// </summary>
        public DATAVALIDSRC DataValidSrc { get; set; } = DATAVALIDSRC.VALID;

        /// <summary>
        /// 当数据有效状态改变，自动按F1，F3
        /// </summary>
        public bool AutoF1F3 { get; set; }


        /// <summary>
        /// 当数据有效状态  无效->有效 ，等待多久重新扫描 ，单位s
        /// </summary>
        public int ReStartDelay { get; set; } = 5;



        /// <summary>
        /// 有按样标定硬件
        /// </summary>
        public bool HasProfileSample { get; set; }


        /// <summary>
        /// 有小托辊
        /// </summary>
        public bool HasHold { get; set; } = true;

        /// <summary>
        /// 数据库保存的月数
        /// </summary>
        public int DBKeepMonth { get; set; } = 6;

        #endregion

        private string param_path = "initparam.xml";
        public InitParam()
        {

        }
        
        public InitParam(string param_path)
        {
            if (!string.IsNullOrEmpty(param_path))
                this.param_path = param_path;

            Load();
        }
        public bool Load() 
        {
            return Misc.SaveToXmlHepler.Load(param_path, this);
        }
        public bool Save() 
        {
            return Misc.SaveToXmlHepler.Save(param_path, this);
        }


        #region INotifyPropertyChanged 成员

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        #region ISaveToXml 成员

        public string[] GetSavePropertyNames()
        {
            return new string[]{
                "PosLength",
                "AutoOrgInterval",
                
                "VScan",
                "VJOG",
                "VAccuracy",
                "SVelocity","ATime","DTime","HVelocity1","HVelocity2",
        
                "Encoder1_mmpp",

                "FilmVSrc",
                "FilmVThreshold",
                "Encoder2_mmpp",
                "Encoder2_comp",
                "MmOfR",
                "DataValidSrc",

                "AutoF1F3",
                "ReStartDelay",

                "HasProfileSample",
                "HasHold",
                "DBKeepMonth"
            };
            
        }

        #endregion


        public void Apply()
        {
            Save();
        }
    }
    
    
}
