using FLY.Thick.Base.Common; using FLY.Thick.Base.Server; using FlyADBase; using Misc; using System; using System.ComponentModel; namespace FLY.Thick.Base.Server { /// /// 使用 TimeGridAdv /// 只是来回走的逻辑,不包含数据处理; /// 可以设置扫描次数; /// 0~posLen; /// 可以显示进度; /// public class ScanMotion2 : INotifyPropertyChanged { #region 成员变量 /// /// 扫描次数, 当为-1时,无限次扫描,>0时,有限次扫描 /// protected int ScanCnt { get; private set; } /// /// 速度 /// public UInt32 Velocity { get; private set; } /// /// 完成 /// public bool IsFinish { get; private set; } public int Progress { get; private set; } public event EndEventHandler EndEvent; public event PropertyChangedEventHandler PropertyChanged; #endregion enum CTRLST { /// /// /// IDLE = 0, /// /// 准备动作:归0 /// READY_ORIGIN = 1, /// /// 准备动作:正在归0 /// READY_ORIGINWAIT = 2, /// /// 准备动作:后退到 0 脉冲 /// READY_BACKW = 3, /// /// 准备动作:正在后退 /// READY_BACKWAIT = 4, /// /// 前进到 机架总长 /// SFORWARD = 5, /// /// 前进等待 /// SFORWAIT_1 = 6, /// /// 前进结束,等待获取grid /// SFORWAIT_2 = 7, /// /// 后退到 0 脉冲 /// SBACKWARD = 8, /// /// 后退等待 /// SBACKWAIT_1 = 9, /// /// 后退结束,等待获取grid /// SBACKWAIT_2 = 10, } CTRLST state; private int tempDataCnt = 0; public int CurrCnt => tempDataCnt; DateTime mStartDataEndTime; FlyAD7 flyAd; public ScanMotion2() { state = CTRLST.IDLE; IsFinish = false; } public void Init(FlyAD7 flyAd) { this.flyAd = flyAd; this.flyAd.PositionChangedEvent += FlyAd_PositionChangedEvent; } private void FlyAd_PositionChangedEvent(object sender, PositionChangedEventArgs e) { if (state == CTRLST.SFORWAIT_1) { int p = e.Position * 50 / flyAd.PosLen; Progress = (100 * tempDataCnt + p) / ScanCnt; } else if(state == CTRLST.SBACKWAIT_1) { int p = (flyAd.PosLen - e.Position) * 50 / flyAd.PosLen; Progress = (100 * tempDataCnt + 50 + p) / ScanCnt; } } public void Start(int scanCnt, UInt32 velocity) { state = CTRLST.READY_ORIGIN; IsFinish = false; ScanCnt = scanCnt; Velocity = velocity; tempDataCnt = 0; Progress = 0; } /// //返回 false, 还没完成, true 已经完成 /// /// public bool OnPoll() { switch (state) { case CTRLST.IDLE: { return true; }break; case CTRLST.READY_ORIGIN: { flyAd.SetVelocity(Velocity); flyAd.Origin(); state = CTRLST.READY_ORIGINWAIT; } break; case CTRLST.READY_ORIGINWAIT: { if (!flyAd.IsFinish) break; if (flyAd.DriveStatus == DRIVE_MAN_STATUS.STOP_MANUAL) return true; state = CTRLST.READY_BACKW; } break; case CTRLST.READY_BACKW: { flyAd.RuntoMin(); state = CTRLST.READY_BACKWAIT; } break; case CTRLST.READY_BACKWAIT: { if (!flyAd.IsFinish) break; if (flyAd.DriveStatus == DRIVE_MAN_STATUS.STOP_MANUAL) return true; if (flyAd.IsTimeToPushTimeGridAdv) break; state = CTRLST.SFORWARD; } break; case CTRLST.SFORWARD: { //记下时间 mStartDataEndTime = flyAd.Now; flyAd.RuntoMax(); state = CTRLST.SFORWAIT_1; } break; case CTRLST.SFORWAIT_1: { if (!flyAd.IsFinish) break; if (flyAd.DriveStatus == DRIVE_MAN_STATUS.STOP_MANUAL) return true; if (flyAd.IsTimeToPushTimeGridAdv) break; FlushAD(DIRECTION.FORWARD); state = CTRLST.SFORWAIT_2; } break; case CTRLST.SFORWAIT_2: { state = CTRLST.SBACKWARD; } break; case CTRLST.SBACKWARD: { mStartDataEndTime = flyAd.Now; flyAd.RuntoMin(); state = CTRLST.SBACKWAIT_1; } break; case CTRLST.SBACKWAIT_1: { if (!flyAd.IsFinish) break; if (flyAd.DriveStatus == DRIVE_MAN_STATUS.STOP_MANUAL) return true; if (flyAd.IsTimeToPushTimeGridAdv) break; FlushAD(DIRECTION.BACKWARD); state = CTRLST.SBACKWAIT_2; } break; case CTRLST.SBACKWAIT_2: { state = CTRLST.SFORWARD; //扫描次数 tempDataCnt++; if (tempDataCnt>=ScanCnt) { //扫描完成 state = CTRLST.IDLE; IsFinish = true; return true; } } break; } return false; } private void FlushAD(Misc.DIRECTION direction) { int start_grid = 0; int end_grid = flyAd.PosLen / flyAd.PosOfGrid; int gridLen = end_grid - start_grid + 1; var timeGridAdv2 = flyAd.GetTimeGridAdv2Event(mStartDataEndTime); var dat = TimeGridAdvHelperExt.ToGrid(timeGridAdv2.AdList, timeGridAdv2.PosList, flyAd.PosOfGrid, gridLen); EndEvent?.Invoke(this, new MiniGridEventArgs() { grid_start = start_grid, direction = direction, posOfGrid = flyAd.PosOfGrid, buf = dat }); } } }