using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using FlyADBase; using FLY.Thick.Base.Common; using FLY.Thick.Base.IService; namespace FLY.Thick.Base.Server { public abstract class GM_Base : IGageMode, INotifyErrorArisen { /// /// 启动时出错,已经在运行了 /// public const byte ERRNO_StartUp_IsRunning = 1; /// /// 启动时出错,AD卡连接断开 /// public const byte ERRNO_StartUp_FlyADNoConnected = 2; /// /// 参数异常 /// public const byte ERRNO_StartUp_Param = 3; /// /// 参数异常 /// public const byte ERRNO_Running_Manual = 4; protected FlyAD7 mFlyAD; protected FObjBase.PollModule.PollHandler onpoll_func; #region IGageMode 接口 public CTRL_STATE GMState { get; protected set; } /// /// 运行中 /// public bool IsRunning { get; protected set; } public event ErrorArisenEventHander ErrorArisenEvent; protected void NotifyError(byte errno) { ErrorArisenEvent?.Invoke(this, new ErrorArisenEventArgs() { Errno = errno }); } #endregion public GM_Base(FlyAD7 flyad) { mFlyAD = flyad; onpoll_func = new FObjBase.PollModule.PollHandler(OnPoll); } protected virtual void OnPoll() { if (mFlyAD.IsFinish) { Stop(); } } #region IGageMode 接口 public virtual bool Start() { if (IsRunning) { NotifyError(ERRNO_StartUp_IsRunning); return false; } if (!mFlyAD.IsConnected) { NotifyError(ERRNO_StartUp_FlyADNoConnected); return false; } IsRunning = true; FObjBase.PollModule.Current.Poll_Config(onpoll_func); return true; } public virtual void Stop() { FObjBase.PollModule.Current.Poll_Config( FObjBase.PollModule.POLL_CONFIG.REMOVE, onpoll_func); IsRunning = false; } #endregion #region IGageMode 接口 protected void NotifyPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; #endregion /// /// 等待停止; /// 正常停止返回true,没有停止及异常停止返回false /// /// protected bool WaitFinish() { switch (mFlyAD.DriveStatus) { case DRIVE_MAN_STATUS.STOP://完成任务 case DRIVE_MAN_STATUS.LIMIT: { return true; } case DRIVE_MAN_STATUS.STOP_MANUAL://异常 { NotifyError(ERRNO_Running_Manual); Stop(); return false; } } return false; } } public class GM_Goto : GM_Base { /// /// 扫描速度 /// public UInt32 Velocity { get; set; } public GM_Goto(FlyAD7 flyad):base(flyad) { GMState = CTRL_STATE.RUNNING; Velocity = 5000; } public override bool Start() { return Start(1000); } public bool Start(int pos) { bool b = base.Start(); if (!b) return false; mFlyAD.SetVelocity(Velocity); mFlyAD.Runto(pos); return true; } } public class GM_Forward : GM_Base { /// /// 扫描速度 /// public UInt32 Velocity { get; set; } public GM_Forward(FlyAD7 flyad) :base(flyad) { GMState = CTRL_STATE.FORW; Velocity = 5000; } public override bool Start() { bool b = base.Start(); if (!b) return false; mFlyAD.SetVelocity(Velocity); mFlyAD.RuntoMax(); return true; } } public class GM_Backward : GM_Base { /// /// 扫描速度 /// public UInt32 Velocity { get; set; } public GM_Backward(FlyAD7 flyad) : base(flyad) { GMState = CTRL_STATE.BACKW; Velocity = 5000; } public override bool Start() { bool b = base.Start(); if (!b) return false; mFlyAD.SetVelocity(Velocity); mFlyAD.RuntoMin(); return true; } } public class GM_Origin : GM_Base { public GM_Origin(FlyAD7 flyad) : base(flyad) { GMState = CTRL_STATE.ORG; } public override bool Start() { bool b =base.Start(); if (!b) return false; mFlyAD.Origin(); return true; } } public class GM_Stop : GM_Base { public GM_Stop(FlyAD7 flyad) : base(flyad) { GMState = CTRL_STATE.STOP; } public override bool Start() { bool b = base.Start(); if (!b) return false; mFlyAD.Stop(); return true; } } public class GM_Disconnected: GM_Base { GM_AutoScan mGMAutoScan; DynArea mDynArea; DateTime dt_lastscan = DateTime.MinValue; public GM_Disconnected(FlyAD7 flyad) : base(flyad) { GMState = CTRL_STATE.DISCONNECTED; } public void Init(DynArea dynarea, GM_AutoScan gmAutoScan) { mDynArea = dynarea; mGMAutoScan = gmAutoScan; mDynArea.PropertyChanged += new PropertyChangedEventHandler(mDynArea_PropertyChanged); } void mDynArea_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "FLYADIsConnect") { if (!mDynArea.FLYADIsConnect) { //AD卡已经断开 //如果刚才在扫描,在1分钟内,AD卡连接后,重新执行扫描动作 if (mDynArea.ControllerState == CTRL_STATE.SCAN) { dt_lastscan = DateTime.Now; } Start(); } else { if (IsRunning) { if ((DateTime.Now - dt_lastscan) < TimeSpan.FromMinutes(1))//1min 内重新扫描 { //断开连接,到现在重新连上,只过了30秒,重新执行扫描 mGMAutoScan.Start(5); } else { Stop(); } } dt_lastscan = DateTime.MinValue; } } } public override bool Start() { IsRunning = true; return true; } public override void Stop() { IsRunning = false; } } public class GM_AutoScan : GM_Base { public int Delay { get; set; } private int counter=5; public int Counter { get { return counter; } set { if (counter != value) { counter = value; NotifyPropertyChanged("Counter"); } } } Action ReScan; DateTime dtLast = DateTime.MinValue; public GM_AutoScan(FlyAD7 flyad) : base(flyad) { GMState = CTRL_STATE.AUTOSCAN; Delay = 5; Counter = Delay; } public void Init(Action reScan) { ReScan = reScan; } protected override void OnPoll() { if ((DateTime.Now - dtLast).TotalSeconds >= 1) { dtLast = DateTime.Now; if (Counter > 0) Counter--; if (Counter <= 0) { Stop(); ReScan(); } } } public bool Start(int delay) { Delay = delay; return Start(); } public override bool Start() { IsRunning = true; Counter = Delay; dtLast = DateTime.Now; FObjBase.PollModule.Current.Poll_Config(onpoll_func); return true; } } public class GM_Pause : GM_Base { public int Delay { get; set; } public bool Enable { get; set; } DynArea mDynArea; GM_AutoScan mGMAutoScan; enum STATE { WAIT_ORG, WAIT_RESCAN } STATE mState; public GM_Pause(FlyAD7 flyad) : base(flyad) { GMState = CTRL_STATE.PAUSE; Enable = false; this.PropertyChanged += new PropertyChangedEventHandler(GM_Pause_PropertyChanged); } void GM_Pause_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "Enable") { if (Enable) { update_datavalid(); } else { if(IsRunning) Stop(); } } } public void Init(DynArea dynarea, GM_AutoScan gmAutoScan) { mDynArea = dynarea; mGMAutoScan = gmAutoScan; mDynArea.PropertyChanged+=new PropertyChangedEventHandler(mDynArea_PropertyChanged); } void update_datavalid() { if (mDynArea.DataValid) { switch(mDynArea.ControllerState) { case CTRL_STATE.FIX: case CTRL_STATE.PAUSE: mGMAutoScan.Start(Delay); break; } } else { switch (mDynArea.ControllerState) { case CTRL_STATE.SCAN: case CTRL_STATE.AUTOSCAN: Start(); break; default: mGMAutoScan.Stop(); break; } } } void mDynArea_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "DataValid") { if(Enable) update_datavalid(); } } protected override void OnPoll() { switch (mState) { case STATE.WAIT_ORG: if (mFlyAD.IsFinish) { mState = STATE.WAIT_RESCAN; } break; case STATE.WAIT_RESCAN: break; } } public override bool Start() { bool b = base.Start(); if (!b) return false; mState = STATE.WAIT_ORG; mFlyAD.Origin(); return true; } } }