using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using FLY.Thick.Base.Common;
using FLY.Thick.Base.IService;
using Misc;
namespace FLY.Thick.Base.Server
{
public class GM_Fix : IGageMode, IFixService
{
#region IGageMode
public CTRL_STATE GMState
{
get { return CTRL_STATE.FIX; }
}
public bool IsRunning { get; protected set; }
#endregion
///
/// 闲置时(IsRunning==false) 忽略数据
///
public bool IsIgnoreDataWhenIdle { get; set; } = true;
protected FlyADBase.FlyAD7 mFlyAD;
protected DynArea mDynArea;
protected AD2ThickHandler AD2Thick;
public GM_Fix(FlyADBase.FlyAD7 flyad)
{
mFlyAD = flyad;
flyad.TimeGridEvent += new FlyADBase.TimeGridEventHandler(flyad_TimeGridEvent);
}
public void Init(DynArea dynarea, AD2ThickHandler func_ad2thick)
{
mDynArea = dynarea;
AD2Thick = func_ad2thick;
}
///
/// 1s 的AD值,就只是用来显示到主界面左上面角而已 DynArea.AD
///
List Data1s = new List();
void flyad_TimeGridEvent(object sender, FlyADBase.TimeGridEventArgs e)
{
//if (IsIgnoreDataWhenIdle && !IsRunning)
// return;
DateTime dt = e.Time;
TimeSpan ts = e.Ts;
List data = new List(e.Data);
//1秒数据
Data1s.AddRange(data);
if (TimeSpan.FromTicks(Data1s.Count * ts.Ticks) >= TimeSpan.FromSeconds(1))
{
int ad = (int)Data1s.Average();
Data1s.Clear();
mDynArea.AD = ad;
mDynArea.Thick = AD2Thick(ad);
}
//转换为thick
List thicks = new List();
foreach(int ad in data)
{
double thick;
int t = AD2Thick(ad);
if (Misc.MyBase.ISVALIDATA(t))
thick = t / 100.0;
else
thick = double.NaN;
thicks.Add(thick);
}
//需要限制大小,push 不能太大
//分拆为多个包
int size = 200;
while (data.Count()>0)
{
int cnt = (data.Count() > size) ? size : data.Count();
int[] ADs2 = data.Take(cnt).ToArray();
double[] thicks2 = thicks.Take(cnt).ToArray();
data.RemoveRange(0, cnt);
thicks.RemoveRange(0, cnt);
FixEvent?.Invoke(this,
new FixEventArgs()
{
time = dt,
ts = ts,
ADs = ADs2,
thicks = thicks2
});
dt += TimeSpan.FromTicks(cnt * ts.Ticks);
}
}
#region IGageMode
public bool Start()
{
IsRunning = true;
return true;
}
public void Stop()
{
IsRunning = false;
}
#endregion
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
event FixEventHandler FixEvent;
///
/// 注册定点数据事件 FixEvent += handler;
///
///
public void RegistTimeGridEvent(FixEventHandler handler)
{
FixEvent += handler;
}
///
/// 取消注册定点数据事件 FixEvent -= handler;
///
///
public void UnRegistTimeGridEvent(FixEventHandler handler)
{
FixEvent -= handler;
}
}
}