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
{
    /// <summary>
    /// 硬件配置参数
    /// </summary>
    public class InitParam : IInitParamService, INotifyPropertyChanged
    {
        #region 属性，成员变量的代理
        /// <summary>
        /// 扫描架长
        /// </summary>
        public int PosLength { get; set; } = 8900;

        /// <summary>
        /// 从 flyad7 获取的
        /// </summary>
        public int PosOfGrid { get; set; } = 10;

        /// <summary>
        /// timeGridAdv 使能
        /// </summary>
        public bool IsTimeGridAdvEnabled { 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>
        /// //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 bool HasPunch { get; set; } = false;

        /// <summary>
        /// 有纵向光纤传感器
        /// </summary>
        public bool HasVSign { get; set; } = false;

        /// <summary>
        /// 有横向光纤传感器
        /// </summary>
        public bool HasHSign { get; set; } = false;


        /// <summary>
        /// 纵向光纤传感器 与 探头纵向偏移，单位mm
        /// X光在光纤传感器的后面，VSignOffset为正
        /// </summary>
        public int VSignOffset { get; set; } = 50;
        /// <summary>
        /// 打孔设备与探头中心偏移，单位mm
        /// </summary>
        public int PunchOffset { get; set; } = 120;


        /// <summary>
        /// 有机架修正功能
        /// </summary>
        public bool HasScanCorr { get; set; } = true;

        #endregion

        private string param_path = "initparam.json";
        /// <summary>
        /// 
        /// </summary>
        public InitParam()
        {

        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="param_path"></param>
        public InitParam(string param_path)
        {
            if (!string.IsNullOrEmpty(param_path))
                this.param_path = param_path;

            Load();
        }
        /// <summary>
        /// 加载
        /// </summary>
        /// <returns></returns>
        public bool Load()
        {
            //return Misc.SaveToXmlHepler.Load(param_path, this);
            if (!File.Exists(param_path))
            {
                return false;
            }
            try
            {
                string json = File.ReadAllText(param_path);
                Newtonsoft.Json.JsonConvert.PopulateObject(json, this);
            }
            catch
            {
                return false;
            }
            return true;
        }
        /// <summary>
        /// 保存
        /// </summary>
        public void Save()
        {
            string json = Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);
            File.WriteAllText(param_path, json);
        }


        #region INotifyPropertyChanged 成员

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        /// <summary>
        /// 应用
        /// </summary>
        public void Apply()
        {
            Save();
        }
    }


}
