using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using FlyADBase;
using FLY.Thick.Base.IService;
namespace FLY.Thick.Base.Server
{
public class GM_GageInfo : GM_ScanMotion2, IGageInfoService, Misc.ISaveToXml
{
#region IGageInfoService 接口
///
/// 数据好了!!!!
/// 当 flyad7 的poslen, posOfGrid 发生变化时,DataOK = false, 需要重新记录。
///
public bool DataOK { get; set; }
private int poslen=9000;
///
/// 机架总长,脉冲
///
public int PosLen { get; set; }
private int posofgrid=10;
///
/// 1个grid = N个pos
///
public int PosOfGrid { get; set; } = 10;
[PropertyChanged.DoNotCheckEquality]
public int[] ForwData { get; private set; }
[PropertyChanged.DoNotCheckEquality]
public int[] BackwData { get; private set; }
///
/// 0~100
///
public int Progress { get; private set; }
///
/// 数据录制,记下来回扫描的AD值数组
///
public override bool Start()
{
bool b = base.Start();
if (!b)
return false;
Progress = 0;
tempDataCnt = 0;
ScanCnt = 1;
DataOK = false;
PosOfGrid = mFlyAD.PosOfGrid;
PosLen = mFlyAD.PosLen;
int grid_size = PosLen / PosOfGrid;
int[] fdatas = new int[grid_size];
int[] bdatas = new int[grid_size];
for (int i = 0; i < grid_size; i++)
{
fdatas[i] = Misc.MyBase.NULL_VALUE;
bdatas[i] = Misc.MyBase.NULL_VALUE;
}
ForwData = fdatas;
BackwData = bdatas;
return base.Start2();
}
public void StartMeasure() {
Start();
}
public override void Stop()
{
base.Stop();
if (DataOK)
{
Progress = 100;
}
else
{
PosOfGrid = mFlyAD.PosOfGrid;
PosLen = mFlyAD.PosLen;
int grid_size = PosLen / PosOfGrid;
int[] fdatas = new int[grid_size];
int[] bdatas = new int[grid_size];
for (int i = 0; i < grid_size; i++)
{
fdatas[i] = Misc.MyBase.NULL_VALUE;
bdatas[i] = Misc.MyBase.NULL_VALUE;
}
ForwData = fdatas;
BackwData = bdatas;
}
Save();
}
#endregion
private int tempDataCnt = 0;
private string param_path;
public GM_GageInfo(FlyAD7 flyad):this(flyad, "gageinfo.xml")
{
}
public GM_GageInfo(FlyAD7 flyad, string param_path)
: base(flyad)
{
GMState = Common.CTRL_STATE.GAGEINFO;
this.param_path = param_path;
Load();
if ((PosOfGrid != mFlyAD.PosOfGrid) || (PosLen != mFlyAD.PosLen))
DataOK = false;
else
DataOK = true;
flyad.PropertyChanged += new PropertyChangedEventHandler(flyad_PropertyChanged);
DataPosEvent += new EndEventHandler(pollCorrect_DataPosEvent);
EndEvent += new EndEventHandler(pollCorrect_EndEvent);
}
void flyad_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if ((e.PropertyName == "PosOfGrid") ||
(e.PropertyName == "PosLen"))
{
if ((PosOfGrid != mFlyAD.PosOfGrid) || (PosLen != mFlyAD.PosLen))
DataOK = false;
else
DataOK = true;
}
}
void pollCorrect_EndEvent(object obj, FlyADBase.MiniGridEventArgs e)
{
DataEnd(e.direction, e.posOfGrid, e.grid_start, e.buf);
}
void pollCorrect_DataPosEvent(object obj, FlyADBase.MiniGridEventArgs e)
{
int grid_len = PosLen / PosOfGrid;
if (e.direction == Misc.DIRECTION.FORWARD)
{
int p = e.grid_start * 100 / grid_len;
Progress = (100 * tempDataCnt + p) / (2);
}
else
{
int p = (grid_len - e.grid_start) * 100 / grid_len;
Progress = (100 * tempDataCnt + p) / (2);
}
}
void DataEnd(Misc.DIRECTION direction, int posOfGrid, int start_grid, int[] dat)
{
if (direction == Misc.DIRECTION.FORWARD)
{
for (int i = 0; i < dat.Length; i++)
{
int grid = i + start_grid;
if (grid >= ForwData.Count())
break;
ForwData[grid] = dat[i];
}
NotifyPropertyChanged("ForwData");
}
else
{
for (int i = 0; i < dat.Length; i++)
{
int grid = i + start_grid;
if (grid >= BackwData.Count())
break;
BackwData[grid] = dat[i];
}
NotifyPropertyChanged("BackwData");
DataOK = true;
}
tempDataCnt++;
Progress = 100 * tempDataCnt / (2);
}
void Save()
{
Misc.SaveToXmlHepler.Save(param_path, this);
}
void Load()
{
Misc.SaveToXmlHepler.Load(param_path, this);
}
public virtual string[] GetSavePropertyNames()
{
return new string[]{
"PosLen","PosOfGrid","ForwData","BackwData"
};
}
}
}