using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Misc;
using System.IO;
using System.ComponentModel;
using FLY.Thick.Base.IService;
using FLY.Thick.Base.Common;
using System.Collections.ObjectModel;
namespace FLY.Thick.Base.Server
{
//public class CoatingSegmentSearch : ICoatingSegmentService, ISaveToXml
//{
// #region 延时推送 MARKNO
// const int MARKNO_PUSH_SAVE = 1;
// #endregion
// #region ISegmentService
// private bool enable = false;
// public bool Enable
// {
// get { return enable; }
// set
// {
// if (enable != value)
// {
// enable = value;
// NotifyPropertyChanged("Enable");
// }
// }
// }
// private bool ensave = false;
// public bool EnSave
// {
// get
// {
// return ensave;
// }
// set
// {
// if (ensave != value)
// {
// ensave = value;
// NotifyPropertyChanged("EnSave");
// }
// }
// }
// private int savecnt = 500;
// public int SaveCnt
// {
// get
// {
// return savecnt;
// }
// set
// {
// if (savecnt != value)
// {
// savecnt = value;
// NotifyPropertyChanged("SaveCnt");
// }
// }
// }
// private int recentCnt = 20;
// ///
// /// 列表的行数
// ///
// public int RecentCnt
// {
// get { return recentCnt; }
// set {
// if (recentCnt != value)
// {
// recentCnt = value;
// NotifyPropertyChanged("RecentCnt");
// }
// }
// }
// private int inidxofvside = 12;
// public int InIdxOfVSide
// {
// get
// {
// return inidxofvside;
// }
// set
// {
// if (inidxofvside != value)
// {
// inidxofvside = value;
// NotifyPropertyChanged("InIdxOfVSide");
// }
// }
// }
// private int inidxofround = 11;
// public int InIdxOfRound
// {
// get
// {
// return inidxofround;
// }
// set
// {
// if (inidxofround != value)
// {
// inidxofround = value;
// NotifyPropertyChanged("InIdxOfRound");
// }
// }
// }
// private double mmpr;
// public double MmOfR
// {
// get
// {
// return mmpr;
// }
// set
// {
// if (mmpr != value)
// {
// mmpr = value;
// NotifyPropertyChanged("MmOfR");
// }
// }
// }
// private double warningtol_total;
// public double WarningTol_Total
// {
// get
// {
// return warningtol_total;
// }
// set
// {
// if (warningtol_total != value)
// {
// warningtol_total = value;
// NotifyPropertyChanged("WarningTol_Total");
// }
// }
// }
// private double warningtol_distance;
// public double WarningTol_Distance
// {
// get
// {
// return warningtol_distance;
// }
// set
// {
// if (warningtol_distance != value)
// {
// warningtol_distance = value;
// NotifyPropertyChanged("WarningTol_Distance");
// }
// }
// }
// ObservableCollection m_coatingPartList = new ObservableCollection();
// public ObservableCollection Recent
// {
// get { return m_coatingPartList; }
// }
// FlyData_CoatingSegmentHistory last=null;
// public FlyData_CoatingSegmentHistory Last
// {
// get {
// return last;
// }
// set {
// last = value;
// NotifyPropertyChanged("Last");
// }
// }
// #endregion
// #region 工艺
// CoatingSegmentProfile profile = new CoatingSegmentProfile();
// public CoatingSegmentProfile Profile { get { return profile; } }
// #endregion
// #region 输出
// double velocity;
// public double Velocity
// {
// get { return velocity; }
// set
// {
// if (velocity != value)
// {
// velocity = value;
// NotifyPropertyChanged("Velocity");
// }
// }
// }
// double length;
// public double Length
// {
// get { return length; }
// set
// {
// if (length != value)
// {
// length = value;
// NotifyPropertyChanged("Length");
// }
// }
// }
// #endregion
// class IOSign
// {
// public DateTime time;
// public bool b;
// public bool bHasSetPos2 = false;
// public double mm_pos2;
// public IOSign(DateTime t, bool b)
// {
// time = t;
// this.b = b;
// }
// }
// RList m_vsideList;
// RList m_roundList;
// DateTime m_lasttv = DateTime.MinValue;
// ///
// /// 时间与pos2关系
// ///
// class Pos2TV
// {
// public DateTime time;
// public double mm_pos2;
// public Pos2TV(DateTime t, double mm_pos2)
// {
// time = t;
// this.mm_pos2 = mm_pos2;
// }
// }
// RList m_pos2tvList;
// public FLY.Thick.RemoteHistory.History mHistory;
// ///
// /// 下一次得到(总长,留白),应该检测 的产品的序号, -1,上一次失败
// ///
// int m_check_idx=-1;
// ///
// /// 当前(总长,留白), 对应于产品的序号
// ///
// int mCurrCoatingPart_Idx=0;
// enum Errno
// {
// OK = 0,
// ErrTotal=1,
// ErrDistance=2,
// ErrCount=3
// }
// ///
// /// 当前(总长,留白),的错误
// ///
// Errno mCurrCoatingPartErrno = Errno.OK;
// private IWarningServiceSimple mWarning;
// private FlyADBase.IFlyAD mFlyAD;
// public CoatingSegmentSearch()
// {
// m_vsideList = new RList(200);
// m_roundList = new RList(200);
// m_pos2tvList = new RList(200);
// mHistory = new Thick.RemoteHistory.History("history_coatingsegment");
// Load();
// }
// void Profile_PropertyChanged(object sender, PropertyChangedEventArgs e)
// {
// if (e.PropertyName == "ProductName")
// {
// //文件名被修改,读取
// LoadProductParam(Profile.ProductName);
// }
// }
// void CoatingSegmentSearch_PropertyChanged(object sender, PropertyChangedEventArgs e)
// {
// if (e.PropertyName == "Enable")
// {
// if (Enable)
// {
// mFlyAD.IStatusChangedEvent += flyad_IStatusChangedEvent;
// FObjBase.PollModule.Current.Poll_Config(FObjBase.PollModule.POLL_CONFIG.ADD, OnPoll, TimeSpan.FromSeconds(1));
// }
// else
// {
// mFlyAD.IStatusChangedEvent -= flyad_IStatusChangedEvent;
// FObjBase.PollModule.Current.Poll_Config(FObjBase.PollModule.POLL_CONFIG.REMOVE, OnPoll, TimeSpan.FromSeconds(1));
// }
// }
// }
// public void Init(FlyADBase.IFlyAD flyad, WarningSystem warning, DynArea dynarea, InitParam initparam)
// {
// Misc.BindingOperations.SetBinding(initparam, "MmOfR", this, "MmOfR");
// Misc.BindingOperations.SetBinding(dynarea, "ProductName", Profile, "ProductName");
// Misc.BindingOperations.SetBinding(this, "Velocity", dynarea, "FilmVelocity");
// mWarning = warning;
// mFlyAD = flyad;
// if(Enable)
// {
// flyad.IStatusChangedEvent += flyad_IStatusChangedEvent;
// FObjBase.PollModule.Current.Poll_Config(FObjBase.PollModule.POLL_CONFIG.ADD, OnPoll, TimeSpan.FromSeconds(1));
// }
// this.PropertyChanged += new PropertyChangedEventHandler(CoatingSegmentSearch_PropertyChanged);
// Profile.PropertyChanged += new PropertyChangedEventHandler(Profile_PropertyChanged);
// }
// void flyad_IStatusChangedEvent(object sender, FlyADBase.IStatusChangedEventArgs e)
// {
// bool bnew = false;
// if (Misc.MyBase.CHECKBIT(e.IChanged, InIdxOfVSide - 1))//纵向边界传感器 input 序号
// {
// bool bVSideSign = false;
// if (!Misc.MyBase.CHECKBIT(e.IStatus, InIdxOfVSide - 1))
// bVSideSign = true;
// //添加
// IOSign ios = new IOSign(e.Time, bVSideSign);
// m_vsideList.Add(ios);
// bnew = true;
// }
// if (Misc.MyBase.CHECKBIT(e.IChanged, InIdxOfRound - 1))//辊圈数传感器 input 序号
// {
// bool bRoundSign = false;
// if (!Misc.MyBase.CHECKBIT(e.IStatus, InIdxOfRound - 1))
// bRoundSign = true;
// //添加
// IOSign ios = new IOSign(e.Time, bRoundSign);
// m_roundList.Add(ios);
// m_lasttv = e.Time;
// while (RoundToPos2Tv()) ;//辊圈数传感器信息 列表 -> (时间&mm_脉冲2) 列表
// bnew = true;
// }
// if (bnew)
// {
// VSideFill_mm_pos2();
// while (VSide2CoatingPart()) ;
// }
// }
// void OnPoll()
// {
// OnPoll_CheckVelocity();
// }
// ///
// /// 1秒触发一次,为了检查什么时候没信号
// ///
// void OnPoll_CheckVelocity()
// {
// if (Velocity == 0)
// return;
// //最后一次获取信号到现在的时间间隔
// TimeSpan ts = mFlyAD.Now - m_lasttv;
// double mm_pos2 = MmOfR;
// double velocity = mm_pos2 / 1000.0 / ts.TotalMinutes;
// if (velocity < 2)//小于2m/mim
// {
// //长时间没信号,复位
// Velocity = 0;
// m_pos2tvList.Clear();
// m_vsideList.Clear();//纵向边界传感器 信号 列表
// m_roundList.Clear();//辊圈数传感器 信号 列表
// m_lasttv = DateTime.MinValue;
// m_check_idx = -1;
// h = new FlyData_CoatingSegmentHistory();
// }
// else if (velocity < (Velocity / 2))
// {
// Velocity = velocity;
// }
// }
// //辊圈数传感器信息 列表 -> (时间&mm_脉冲2) 列表
// bool RoundToPos2Tv()
// {
// //辊圈数传感器 信号 列表 数量要大于2
// int cnt = m_roundList.Count();
// if (cnt < 2)
// return false;
// IOSign ios_round;
// IOSign ios_round_next;
// //一定要是 1..0...............
// ios_round = m_roundList[0];
// ios_round_next = m_roundList[1];
// if (ios_round.b != true)
// {
// //删除
// m_roundList.RemoveAt(0);
// return true;
// }
// TimeSpan ts = ios_round_next.time - ios_round.time;
// ts = TimeSpan.FromTicks(ts.Ticks / 2);
// DateTime dt = ios_round_next.time - ts;
// Pos2TV p2tv = new Pos2TV(dt, 0);
// if (m_pos2tvList.Count() > 0)
// {
// Pos2TV p2tv_last = m_pos2tvList.Last();
// p2tv.mm_pos2 = p2tv_last.mm_pos2 + MmOfR;
// }
// m_pos2tvList.Add(p2tv);
// m_roundList.RemoveAt(0);
// m_roundList.RemoveAt(0);
// //(时间&mm_脉冲2) 转为速度
// Pos2TvToVelocity();
// return true;
// }
// ///
// /// (时间&mm_脉冲2) 转为速度
// ///
// void Pos2TvToVelocity()
// {
// int cnt = m_pos2tvList.Count();
// if (cnt < 2)
// return;
// Pos2TV pos2tv = m_pos2tvList[cnt - 2];
// Pos2TV pos2tv_1 = m_pos2tvList[cnt - 1];
// double mm_pos2 = (pos2tv_1.mm_pos2 - pos2tv.mm_pos2);
// TimeSpan ts = pos2tv_1.time - pos2tv.time;
// Velocity = mm_pos2 / ts.TotalMinutes / 1000.0;
// Length = pos2tv_1.mm_pos2 / 1000;
// }
// ///
// /// 时间 -> mm_脉冲2,
// /// <0, 时间在mm_pos2前面,永远转不了
// /// ==0, 时间在mm_pos2内,转换成功
// /// >0, 时间在mm_pos2后面,以后可以转换
// ///
// ///
// ///
// ///
// int tvTo_mm_pos2(DateTime time, out double out_mm_pos2)
// {
// out_mm_pos2 = 0;
// //从最后开始查找,找出tv 夹在哪两个之间
// int cnt = m_pos2tvList.Count();
// int i;
// bool hasFind = false;
// for (i = cnt - 1; i >= 0; i--)
// {
// Pos2TV pos2tv = m_pos2tvList[i];
// if (time >= pos2tv.time)
// {
// hasFind = true;//已经找到,它在 i 与 i+1 之间
// break;
// }
// }
// if (hasFind)
// {
// if (i == cnt - 1)
// {
// //第0个就是,不行,等以后有数据,再转换
// return 1;
// }
// Pos2TV pos2tv = m_pos2tvList[i];
// Pos2TV pos2tv_1 = m_pos2tvList[i + 1];
// TimeSpan ts = time - pos2tv.time;
// TimeSpan ts2 = pos2tv_1.time - pos2tv.time;
// long usec2 = ts2.Ticks;
// long usec = ts.Ticks;
// double mm_pos2 = (pos2tv_1.mm_pos2 - pos2tv.mm_pos2) * usec / usec2 + pos2tv.mm_pos2;
// out_mm_pos2 = mm_pos2;
// return 0;
// }
// return -1;
// }
// ///
// /// 纵向边界信号 填充 mm_脉冲2信息
// ///
// void VSideFill_mm_pos2()
// {
// int cnt = m_vsideList.Count();
// int i;
// //当上一个没法从时间转为mm_pos2, 但这个可以,把上一个删除掉
// for (i = 0; i < cnt; i++)
// {
// IOSign ios_vside = m_vsideList[i];
// if (!ios_vside.bHasSetPos2)//还没翻译
// {
// double mm_pos2;
// int ret = tvTo_mm_pos2(ios_vside.time, out mm_pos2);
// if (ret < 0)//边界信号的时间,在mm_pos2队列的前面,把这个和前面的边界信号全部删除
// {
// //删除
// int j;
// for (j = 0; j <= i; j++)
// m_vsideList.RemoveAt(0);
// cnt -= (i + 1);
// i = -1;
// }
// else if (ret == 0)//翻译成功
// {
// ios_vside.mm_pos2 = mm_pos2;
// ios_vside.bHasSetPos2 = true;
// }
// else//边界信号的时间,在mm_pos2队列的未来,停止翻译
// {
// break;
// }
// }
// }
// }
// //纵向边界信号 -> 涂布信息,涂长,留白,总长
// bool VSide2CoatingPart()
// {
// int cnt = m_vsideList.Count();
// if (cnt < 3)
// return false;
// //1为留白,0为涂料
// //一块涂布为 0000000000000000011111
// //对应信号列表为 0----------------1----0
// IOSign ios_vside0 = m_vsideList[0];
// IOSign ios_vside1 = m_vsideList[1];
// IOSign ios_vside2 = m_vsideList[2];
// if (!ios_vside0.bHasSetPos2)
// return false;
// if (!ios_vside1.bHasSetPos2)
// return false;
// if (!ios_vside2.bHasSetPos2)
// return false;
// //LogMessage2("segment.c",1,"SEGMENT_VSide2CoatingPart (%d,%d,%d)",ios_vside0->b,ios_vside1->b,ios_vside2->b);
// if (ios_vside0.b == true)
// {
// //删除,没用
// m_vsideList.RemoveAt(0);
// cnt = m_vsideList.Count();
// if (cnt < 3)
// return false;
// return true;
// }
// //FlyData_CoatingSegmentHistory h = new FlyData_CoatingSegmentHistory();
// //h.time = ios_vside0.time;
// //ToSaveList(h);
// CoatingSegmentPart coatingpart = new CoatingSegmentPart();
// coatingpart.Total = ios_vside2.mm_pos2 - ios_vside0.mm_pos2;//涂长+留白单位mm
// coatingpart.Distance = ios_vside2.mm_pos2 - ios_vside1.mm_pos2;//留白单位mm
// CheckWarning(coatingpart);
// ToSaveList(coatingpart);
// //ToSaveList(coatingpart);
// //删除前两个!!!!!
// m_vsideList.RemoveAt(0);
// m_vsideList.RemoveAt(0);
// cnt = m_vsideList.Count();
// if (cnt < 3)
// return false;
// return true;
// }
// //下辊
// void RollDown()
// {
// mHistory.Flush();
// Recent.Clear();
// }
// FlyData_CoatingSegmentHistory h = new FlyData_CoatingSegmentHistory();
// void ToSaveList(CoatingSegmentPart coatingpart)
// {
// int cnt = Profile.CoatingPartList.Count();
// if (cnt == 0)
// cnt = 1;
// h.PartCount = cnt;
// while (h.CoatingPart.Count < mCurrCoatingPart_Idx)
// {
// h.CoatingPart.Add(new CoatingSegmentPart());
// }
// h.CoatingPart.Add(coatingpart);
// h.Errno = (int)mCurrCoatingPartErrno;
// h.Time = mFlyAD.Now;
// if (h.CoatingPart.Count == h.PartCount)
// {
// //完成
// ToSaveList(h);
// h = new FlyData_CoatingSegmentHistory();
// }
// else if (mCurrCoatingPartErrno != Errno.OK) //报警
// {
// //完成
// ToSaveList(h);
// h = new FlyData_CoatingSegmentHistory();
// }
// }
// //压入数据列
// void ToSaveList(FlyData_CoatingSegmentHistory coatingpart)
// {
// Last = coatingpart;
// Recent.Add(coatingpart);
// if (Recent.Count > RecentCnt)
// Recent.RemoveAt(0);
// if (EnSave)
// mHistory.Add(coatingpart);
// }
// //异常检测,触发报警
// void CheckWarning(CoatingSegmentPart coatingpart)
// {
// if (IsWarning(coatingpart, ref m_check_idx))
// {
// //报警!!!!!!!!
// mWarning.Add(
// ERRNOs.SEGMENT_ERRNO_OVERRUN.Type,
// ERRNOs.SEGMENT_ERRNO_OVERRUN.Code,
// ERRNOs.SEGMENT_ERRNO_OVERRUN.Descrption,
// ERR_STATE.ONCE);
// }
// }
// int FindSame(CoatingSegmentPart coatingpart)
// {
// int cnt = Profile.CoatingPartList.Count();
// //找最接近的
// int i;
// double min = 99999;
// int idx = -1;
// for (i = 0; i < cnt; i++)
// {
// CoatingSegmentPart cp = Profile.CoatingPartList[i];
// double d = Math.Abs(cp.Total - coatingpart.Total);
// if ((idx == -1) || (min > d))
// {
// min = d;
// idx = i;
// }
// }
// return idx;
// }
// bool IsWarning_1(CoatingSegmentPart coatingpart, int check_idx)
// {
// int cnt = Profile.CoatingPartList.Count();
// CoatingSegmentPart cp = Profile.CoatingPartList[check_idx];
// double[] d = new double[3];
// d[0] = Math.Abs(cp.Distance - coatingpart.Distance);
// //d[1] = cp->mm_segment-coatingpart->mm_segment;
// d[2] = Math.Abs(cp.Total - coatingpart.Total);
// if (d[2] > WarningTol_Total)
// {
// mCurrCoatingPartErrno = Errno.ErrTotal;
// return true;
// }
// if (d[0] > WarningTol_Distance)
// {
// mCurrCoatingPartErrno = Errno.ErrDistance;
// return true;
// }
// mCurrCoatingPartErrno = Errno.OK;
// return false;
// }
// //该段涂布,是否异常!!!
// bool IsWarning(CoatingSegmentPart coatingpart, ref int check_idx)
// {
// int cnt = Profile.CoatingPartList.Count();
// if (cnt == 0)
// {
// mCurrCoatingPart_Idx = 0;
// mCurrCoatingPartErrno = Errno.OK;
// check_idx = -1;
// return false;
// }
// int ci = check_idx;
// if ((ci < 0) || (ci >= cnt))//上次匹配失败!
// {
// //找最接近的
// ci = FindSame(coatingpart);
// mCurrCoatingPart_Idx = ci;
// if (ci != 0)
// {
// mCurrCoatingPartErrno = Errno.ErrCount;
// }
// }
// //检测 ci 是否一致
// bool isWarning = IsWarning_1(coatingpart, ci);
// if (isWarning)//不一致,报警!!!!
// {
// check_idx = -1;
// return true;
// }
// else //一致,检测下一个
// {
// ci++;
// if (ci >= cnt)
// ci = 0;
// check_idx = ci;//更新下一个要检测的!!
// return false;
// }
// }
// void Save()
// {
// Misc.SaveToXmlHepler.Save("segment.xml", this);
// }
// bool Load()
// {
// return Misc.SaveToXmlHepler.Load("segment.xml", this);
// }
// bool isloading=false;
// void LoadProductParam(string productname)
// {
// isloading = true;
// mHistory.FileNameCustom = productname;
// string path = @"CoatingSegment\" + productname + ".xml";
// //所有产品段长信息,保存在 Gage1/CoatingWidth/..... 里面
// if (File.Exists(path))
// Misc.SaveToXmlHepler.Load(path, Profile);
// isloading = false;
// }
// bool SaveProductParam()
// {
// if (isloading)
// return false;
// //所有产品涂宽信息,保存在 Gage1/coatingwidth/..... 里面
// if (!Directory.Exists("CoatingSegment"))
// Directory.CreateDirectory("CoatingSegment");
// string path = @"CoatingSegment\" + Profile.ProductName + ".xml";
// return Misc.SaveToXmlHepler.Save(path, Profile);
// }
// public void ProfileApply()
// {
// SaveProductParam();
// }
// public void Apply()
// {
// Save();
// }
// protected void NotifyPropertyChanged(string propertyName)
// {
// if (PropertyChanged != null)
// {
// PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
// }
// }
// public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
// public string[] GetSavePropertyNames()
// {
// return new string[] {
// "Enable",
// "EnSave",
// "SaveCnt",
// "RecentCnt",
// "InIdxOfVSide",
// "WarningTol_Total",
// "WarningTol_Distance"
// };
// }
//}
}