using System;
using System.ComponentModel;
using OTSModelSharp;
using OTSDataType;
using System.Collections.Generic;
using static OTSDataType.otsdataconst;
using System.Drawing;
namespace OTSMeasureApp
{
public class CMeasureThreadWrapper
{
#region 变量生成汇总
//后台线程
public static System.ComponentModel.BackgroundWorker m_bgWorker;
OTSIncAMeasureAppForm m_MeasureApp = null;
OTSMeasureDisplayResult m_OTSMeasureResult = null;
//测量线程类
public CMeasure m_measure = null;
//线程执行类型 1:测量 2:获取样品孔图片
private MSR_RUN_TYPE doRunType = (MSR_RUN_TYPE)1;
private int holeIdForPreview;
NLog.Logger log ;
#endregion
COTSMsrPrjResultData m_ProjData;
public MSR_RUN_TYPE GetDoRunType()
{
return doRunType;
}
public void SetDoRunType(MSR_RUN_TYPE value)
{
doRunType = value;
}
#region 构造方法
public CMeasureThreadWrapper(OTSIncAMeasureAppForm MeasureApp)
{
log = NLog.LogManager.GetCurrentClassLogger();
m_ProjData = MeasureApp.m_ProjData;
m_MeasureApp = MeasureApp;
m_bgWorker = new BackgroundWorker();
//设置报告更新是否可用
m_bgWorker.WorkerReportsProgress = true;
//设置支持取消操作是否可用
m_bgWorker.WorkerSupportsCancellation = true;
m_bgWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
m_bgWorker.WorkerSupportsCancellation = true;
m_OTSMeasureResult = new OTSMeasureDisplayResult(m_MeasureApp,m_bgWorker);
m_measure = new CMeasure();
m_measure.ProgressEvent += M_MsrThread_ProgressEvent;
}
public bool IsHavingNotCompleteSamples()
{
foreach(var s in m_measure.GetListMeasurableSamples())
{
if (s.GetMsrStatus().GetStatus() == OTS_MSR_SAMPLE_STATUS.PAUSED)
{
return true;
}
}
return false;
}
#endregion
#region 设置获取样品孔中照片所需的参数
///
/// 设置获取样品孔中照片所需的参数
///
/// 样品孔编号的序号
/// 测量区域属性对象
public void SetHoleImagePreview(int HoleID)
{
//样品孔编号的序号
holeIdForPreview = HoleID;
}
#endregion
#region 启动测量线程
public void StartBGWorkThread()
{
m_bgWorker.RunWorkerAsync();
}
#endregion
#region 线程是否在运行
///
/// True: 线程正在运行
///
///
public bool BGWorkThreadIsRunning()
{
if (m_measure.GetMsrThreadStatus().GetStatus() == OTS_MSR_THREAD_STATUS.INPROCESS)
{
return true;
}
//if (m_bgWorker.IsBusy)
//{
// return true;
//}
return false;
}
public bool BgWorkIsPaused()
{
if (m_measure.GetMsrThreadStatus().GetStatus() == OTS_MSR_THREAD_STATUS.PAUSED)
{
return true;
}
return false;
}
#endregion
#region 判断线程挂起状态
///
/// True: 线程挂起状态
///
///
///
bool WorkThreadIsPending()
{
return m_bgWorker.CancellationPending;
}
#endregion
#region 线程挂起
///
/// 线程挂起
///
///
///
public void SetWorkThreadPending()
{
m_bgWorker.CancelAsync();
m_bgWorker = null;
}
#endregion
#region 后台进程开始工作_DoWork
///
/// 后台进程开始工作 ///
///
///
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
if (GetDoRunType() == MSR_RUN_TYPE.RUNMEASURE)
{
InitMeasureThread(m_MeasureApp.m_ProjData);
m_measure.SetMsrLoopStatus(otsdataconst.OTS_MSR_THREAD_STATUS.INPROCESS);
m_measure.DoMeasure();
}
else if (GetDoRunType() == MSR_RUN_TYPE.RUNSampleHoleImage)
{
InitMeasureThread(m_MeasureApp.m_ProjData);
SetMeasureThreadStatus(otsdataconst.OTS_MSR_THREAD_STATUS.INPROCESS);
DoHolePreview( );
}
}
public void InitMeasureThread(COTSMsrPrjResultData a_ProjData)
{
m_ProjData = a_ProjData;
m_measure.Init(m_ProjData);
}
private void M_MsrThread_ProgressEvent(OTSModelSharp.ST_MSTMsg msg)
{
AddMeasureMsg(msg);
}
private void AddMeasureMsg(OTSModelSharp.ST_MSTMsg MSTMsg)
{
ShowCurrentFieldPointMessage(MSTMsg.STMSampleRetData.SMsrField.FieldPos);
switch (MSTMsg.iMsgType)
{
case OTSModelSharp.ENUM_MSG_TYPE.MTHREADSTATUS:
if (MSTMsg.STMThreadStu.iMsrStatu == otsdataconst.OTS_MSR_THREAD_STATUS.INPROCESS)
{
StartMeasure(MSTMsg);
}
else if (MSTMsg.STMThreadStu.iMsrStatu == otsdataconst.OTS_MSR_THREAD_STATUS.STOPPED)
{
string csETime = MSTMsg.STMThreadStu.csMsrEndTime;
StopMeasure(MSTMsg);
}
else if (MSTMsg.STMThreadStu.iMsrStatu == otsdataconst.OTS_MSR_THREAD_STATUS.FAILED)
{
StopMeasure(MSTMsg);
log.Error("(OTSGetMreRetThread) MSTMsg.STMThreadStu.iMThreadStatus = RET_MEASURE_THREAD_STATUS.FAILED");
}
else if (MSTMsg.STMThreadStu.iMsrStatu == otsdataconst.OTS_MSR_THREAD_STATUS.COMPLETED)
{
StopMeasure(MSTMsg);
}
else if (MSTMsg.STMThreadStu.iMsrStatu == otsdataconst.OTS_MSR_THREAD_STATUS.PAUSED)
{
PauseMeasure(MSTMsg);
}
else
{
log.Error("(OTSGetMreRetThread) MSTMsg.STMThreadStu.iMThreadStatus =" + MSTMsg.STMThreadStu.iMsrStatu.ToString() + "Failed");
}
break;
case OTSModelSharp.ENUM_MSG_TYPE.MSAMPLESTATUS:
if (MSTMsg.STMSampleStu.iMsrSampleStatu == OTSDataType.OTS_MSR_SAMPLE_STATUS.INPROCESS) // 开始测量样品
{
string csName = MSTMsg.STMSampleStu.cSampleName;
m_MeasureApp.SwitchMeasureSample(csName);
StartMsrSample(MSTMsg);
}
else if (MSTMsg.STMSampleStu.iMsrSampleStatu == OTSDataType.OTS_MSR_SAMPLE_STATUS.STOPPED)
{
StopMeasure(MSTMsg);
}
else if (MSTMsg.STMSampleStu.iMsrSampleStatu == OTSDataType.OTS_MSR_SAMPLE_STATUS.FAILED)
{
//StopMeasure(MSTMsg);
log.Error("(OTSGetMreRetThread) MSTMsg.STMSampleStu.iMeasureSampleStatus = RET_MEASURE_SAMPLE_STATUS.FAILED Failed");
}
else if (MSTMsg.STMSampleStu.iMsrSampleStatu == OTSDataType.OTS_MSR_SAMPLE_STATUS.SUCCESSED)
{
//StopMeasure(MSTMsg);
}
else if(MSTMsg.STMSampleStu.iMsrSampleStatu == OTSDataType.OTS_MSR_SAMPLE_STATUS.PAUSED)
{
PauseMeasure(MSTMsg);
log.Warn("This sample measure is paused!");
}
break;
case OTSModelSharp.ENUM_MSG_TYPE.MSAMPLERESULT:
if (MSTMsg.STMSampleRetData.iRetDataType == OTSModelSharp.MSAMPLE_RET.BSE_DATA)
{
int iHeight = MSTMsg.STMSampleRetData.BSEData.iBSEDataHeight;
int iWidth = MSTMsg.STMSampleRetData.BSEData.iBSEDataWidth;
if (iHeight > 0 && iWidth > 0)
{
GetBSEData(MSTMsg);
}
else
{
log.Error("(OTSGetMreRetThread) BSEDataHeight = " + iHeight.ToString() + "BSEDataWidth = " + iWidth.ToString() + " Failed");
}
}
else if (MSTMsg.STMSampleRetData.iRetDataType == OTSModelSharp.MSAMPLE_RET.FIELD_DATA)
{
UpdateMeasureState(MSTMsg);
}
else if (MSTMsg.STMSampleRetData.iRetDataType == OTSModelSharp.MSAMPLE_RET.START_MSR_FIELD)
{
GetStartMsrField(MSTMsg);
}
else
{
log.Error("(OTSGetMreRetThread) MSTMsg.STMSampleRetData.iRetDataType =" + MSTMsg.STMSampleRetData.iRetDataType.ToString() + "Failed");
}
break;
}
}
#region privte part
private void StartMeasure(ST_MSTMsg SMsrData)
{
m_MeasureApp.SetStartMeasureRibbonStatus();
GetMsrRetData(ref SMsrData.STMThreadStu.SMsrCompleteData);
m_OTSMeasureResult.RunMeasureState(SMsrData);
}
private void ShowCurrentFieldPointMessage(Point currPoint)
{
//当前测量帧图视场坐标---------------------------------------------------------------------------------------
Point lsp = currPoint;
if (lsp.X != 0 || lsp.Y != 0)
{
string STSemCoordinate = "Current frame coordinates X:" + lsp.X.ToString() + " Y:" + lsp.Y.ToString();
//显示当前视场 XY轴
m_MeasureApp.ShowSemCoordvAL(STSemCoordinate);
}
//------------------------------------------------------------------------------------------------------------
}
//处理测量线程停止消息
private void StopMeasure(ST_MSTMsg SMsrData)
{
m_MeasureApp.SetStopMeasureRibbonStatus();
GetMsrRetData(ref SMsrData.STMThreadStu.SMsrCompleteData);
m_OTSMeasureResult.RunMeasureState(SMsrData);
}
private void PauseMeasure(ST_MSTMsg SMsrData)
{
m_MeasureApp.SetPauseMeasureRibbonStatus();
GetMsrRetData(ref SMsrData.STMThreadStu.SMsrCompleteData);
m_OTSMeasureResult.RunMeasureState(SMsrData);
}
private void GetBSEData(ST_MSTMsg SMsrData)
{
m_OTSMeasureResult.RunMeasureState(SMsrData);
}
private void UpdateMeasureState(ST_MSTMsg SMsrData)
{
this.GetSMsrUsedTime(ref SMsrData.STMSampleRetData.SFieldData.TUsedTime);
m_OTSMeasureResult.RunMeasureState(SMsrData);
}
private void GetStartMsrField(ST_MSTMsg SMsrData)
{
m_OTSMeasureResult.RunMeasureState(SMsrData);
}
private void StartMsrSample(ST_MSTMsg SMsrData)
{
DateTime SampleMsrStartTime = new DateTime();
m_MeasureApp.m_ProjParam.GetMsrSampleStartTime(ref SampleMsrStartTime);
SMsrData.STMSampleStu.csSampleMsrStartTime = SampleMsrStartTime.ToString("yyyy-MM-dd HH:mm:ss");
string csSName = "";
List FieldList = new List();
m_MeasureApp.m_ProjParam.GetBeforeCompleteField(ref csSName, ref FieldList);
string csSampleName = SMsrData.STMSampleStu.cSampleName;
if (csSName == csSampleName)
{
SMsrData.STMSampleStu.BCompleteFieldList = FieldList;
}
m_OTSMeasureResult.RunMeasureState(SMsrData);
}
private void GetSMsrUsedTime(ref TimeSpan MsrUsedTime)
{
TimeSpan UsedTime = new TimeSpan();
if (!m_MeasureApp.m_ProjParam.GetMsrSampleUsedTime(ref UsedTime))
{
return;
}
MsrUsedTime = UsedTime;
}
#endregion
public void InitMeasureSample()
{
m_measure.Init(m_ProjData);
return ;
}
public void InitHolePreview()
{
m_measure.Init(m_ProjData);
m_measure.ProgressEvent += M_MsrThread_ProgressEvent;
return ;
}
public void DoHolePreview()
{
m_measure.DoHolePreview();
}
// 开始样品测量
//停止测量
public void SetMeasureThreadStatus(otsdataconst.OTS_MSR_THREAD_STATUS ThreadStatus)
{
//设置测量线程状态
m_measure.SetMsrLoopStatus(ThreadStatus);
}
#endregion
public bool ConnectSEM()
{
return m_measure.GetSEMController().Connect();
}
public void DisconnectSEM()
{
m_measure.GetSEMController().DisConnect();
}
public void StopXrayAcquisition()
{
//var hw = m_MsrThread.GetSEMController().GetHardwareInterface();
//if (hw != null)
//{
// hw.StopXrayAcquisition();
//}
m_measure.GetSEMController().StopXrayAcquisition();
}
public bool IsSEMConnected()
{
return m_measure.GetSEMController().IsConnected();
}
public bool GetMsrRetData(ref SMSR_COMPLETE_DATA MsrCompleteData)
{
try
{
List MeasureCompleteSampleList = new List();
if (!m_ProjData.GetMsredSampleList(ref MeasureCompleteSampleList))
{
return false;
}
DateTime DTime = new DateTime();
if (m_measure.GetMsrThreadStatus() == null)
{
return false;
}
if (m_measure.GetMsrThreadStatus().GetStartTime() == null)
{
return false;
}
DTime = (DateTime)m_measure.GetMsrThreadStatus().GetStartTime();
MsrCompleteData.csMsrStartTime = DTime.ToString("yyyy-MM-dd HH:mm:ss");
MsrCompleteData.MsrUsedTime = (TimeSpan)m_measure.GetMsrThreadStatus().GetUsedTime();
DTime = (DateTime)m_measure.GetMsrThreadStatus().GetEndTime();
MsrCompleteData.csMsrEndTime = DTime.ToString("yyyy-MM-dd HH:mm:ss");
MsrCompleteData.iMsrCompleteSampleCount = MeasureCompleteSampleList.Count;
MsrCompleteData.iMsrCompleteFieldCount = 0;
MsrCompleteData.iParticleCount = 0;
for (int i = 0; i < MsrCompleteData.iMsrCompleteSampleCount; i++)
{
MsrCompleteData.iMsrCompleteFieldCount += MeasureCompleteSampleList[i].GetMsrStatus().GetCompletedFields();
List MsrRetClr = MeasureCompleteSampleList[i].GetMsrResults().GetResultItems();
for (int k = 0; k < MsrRetClr.Count; k++)
{
MsrCompleteData.iParticleCount += (int)MsrRetClr[k].GetNumber();
}
}
return true;
}
catch (Exception ex)
{
log.Error(ex.Message.ToString());
return false;
}
}
}
}