using FlyADBase; using GalaSoft.MvvmLight.Command; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Threading; namespace Flyad7_WPF { [JsonObject(MemberSerialization.OptIn)] public class AutoGetGridAdv:INotifyPropertyChanged { IFlyADClientAdv flyad; public bool IsError { get; set; } public string ErrMsg { get; set; } public string ProgressMsg { get; set; } public bool IsRunning { get; private set; } [JsonProperty] public int FB_Pos1 { get; set; } = 1000; [JsonProperty] public int FB_Pos2 { get; set; } = 3000; [JsonProperty] public int StartV { get; set; } = 100; [JsonProperty] public int StepV { get; set; } = 100; [JsonProperty] public int EndV { get; set; } = 2000; public RelayCommand StartCmd { get; private set; } public RelayCommand StopCmd { get; private set; } public RelayCommand AnalyzeCmd { get; private set; } List timeGridAdv2Datas = new List(); public AutoGetGridAdv(IFlyADClientAdv flyad) { this.flyad = flyad; StartCmd = new RelayCommand(Start); StopCmd = new RelayCommand(Stop); AnalyzeCmd = new RelayCommand(Analyze); Load(); this.PropertyChanged += AutoSave; } CancellationTokenSource cancellationTokenSource; async void Start() { if (IsRunning) return; cancellationTokenSource = new CancellationTokenSource(); IsError = false; IsRunning = true; ProgressMsg = "准备动作,到达 开始位置"; await Task.Delay(1); flyad.SetVelocity((UInt32)(StartV + EndV) / 2); flyad.Runto(FB_Pos1); if (!await Wait()) goto _end; ProgressMsg = "正式开始"; await Task.Delay(1); //正式开始 timeGridAdv2Datas.Clear(); flyad.TimeGridAdv2Event += Flyad_TimeGridAdv2Event; int v = StartV; int cnt = (EndV - StartV) / StepV; for(int j=0;j Wait() { while (true) { try { await Task.Delay(2000, cancellationTokenSource.Token); } catch { //被叫醒了 ErrMsg = "强制退出"; IsError = true; await Task.Delay(1); return false; } if (!flyad.IsConnected) { ErrMsg = "连接断开"; IsError = true; await Task.Delay(1); return false; } if (flyad.DriveStatus == DRIVE_MAN_STATUS.RUNNING) { continue; } else if (flyad.DriveStatus == DRIVE_MAN_STATUS.STOP) { return true; } else { ErrMsg = $"异常停止 flyad.DriveStatus={flyad.DriveStatus}"; IsError = true; return false; } } } void Stop() { if (!IsRunning) return; if (cancellationTokenSource == null) return; if (cancellationTokenSource.IsCancellationRequested) return; cancellationTokenSource.Cancel(); } private void Analyze() { WdGridAdvAnalyze wd = new WdGridAdvAnalyze(); wd.Init(); wd.ShowDialog(); } public event PropertyChangedEventHandler PropertyChanged; private bool isIgnoreSave; private async void AutoSave(object sender, PropertyChangedEventArgs e) { if (isIgnoreSave) return; if (this.GetType() .GetProperty(e.PropertyName) .GetCustomAttributes(typeof(JsonPropertyAttribute), false) .Count() > 0) { isIgnoreSave = true; await Task.Delay(5000);//Task.Yield(); Save(); isIgnoreSave = false; } } void Save() { try { string json = Newtonsoft.Json.JsonConvert.SerializeObject(this, Formatting.Indented); File.WriteAllText("autoGridAdv.json", json); } catch (Exception e ) { } } void Load() { try { string json = File.ReadAllText("autoGridAdv.json"); isIgnoreSave = true; Newtonsoft.Json.JsonConvert.PopulateObject(json, this); isIgnoreSave = false; } catch (Exception e) { } } } }