From 71f2870968f7227a872fcee7c32625292ec76bb1 Mon Sep 17 00:00:00 2001 From: panxu Date: Sat, 12 May 2018 23:16:13 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90FormationCreator.sln=E3=80=91=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E6=80=A7=E8=83=BD=E6=A3=80=E6=9F=A5=20[App.xaml.cs]?= =?UTF-8?q?=E5=81=9C=E7=94=A8tcp=E8=BF=9E=E6=8E=A5=E5=92=8C=E7=BC=96?= =?UTF-8?q?=E9=98=9F=E6=8E=A7=E5=88=B6=E5=99=A8formationController=20[Copt?= =?UTF-8?q?er.cs]=E5=85=B3=E9=97=AD=E5=BF=83=E8=B7=B3=E5=8C=85=E5=8F=91?= =?UTF-8?q?=E9=80=81=EF=BC=8C=E5=87=8F=E5=B0=8F=E6=95=B0=E6=8D=AE=E5=8F=91?= =?UTF-8?q?=E9=80=81=E9=87=8F=20[Plane.FormationCreator.csproj]=E5=8A=A0?= =?UTF-8?q?=E5=85=A5ParamFile.cs=E4=BF=AE=E6=94=B9=E5=8F=82=E6=95=B0=20[Co?= =?UTF-8?q?ntrolPanelViewModel.cs]=201=E5=8A=A0=E5=85=A5=E8=AF=BB=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E6=96=87=E4=BB=B6=EF=BC=8C=E5=8F=AF=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=8F=82=E6=95=B0=202=E4=BF=AE=E6=94=B9ReadR?= =?UTF-8?q?TKPacketAsync=E7=9A=84bug=EF=BC=8C=E5=AF=BC=E8=87=B4=E5=8F=91?= =?UTF-8?q?=E9=80=81=E6=95=B0=E6=8D=AE=E9=87=8F=E5=A4=AA=E5=A4=A7>1000/s?= =?UTF-8?q?=203=E8=88=AA=E7=BA=BF=E6=9A=82=E6=97=B6=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=81=9C2=E7=A7=92=20[CopterListViewModel.cs]=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E6=95=B0=E6=8D=AE=E6=94=B6=E5=8F=91=E9=87=8F=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plane.FormationCreator.sln | 3 + Plane.FormationCreator/App.xaml.cs | 13 ++- Plane.FormationCreator/Formation/Copter.cs | 2 +- .../Plane.FormationCreator.csproj | 1 + .../ViewModels/ControlPanelViewModel.cs | 106 +++++++++++++++--- .../ViewModels/CopterListViewModel.cs | 38 +++++++ .../Views/ControlPanelView.xaml | 2 + .../Views/CopterListView.xaml | 4 +- 8 files changed, 145 insertions(+), 24 deletions(-) diff --git a/Plane.FormationCreator.sln b/Plane.FormationCreator.sln index adcb603..902217f 100644 --- a/Plane.FormationCreator.sln +++ b/Plane.FormationCreator.sln @@ -24,6 +24,9 @@ EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "PlaneGcsSdk.Contract_Shared", "..\Plane.Sdk3\PlaneGcsSdk.Contract_Shared\PlaneGcsSdk.Contract_Shared.shproj", "{695733D7-99FF-4707-8C89-474E949CADCB}" EndProject Global + GlobalSection(Performance) = preSolution + HasPerformanceSessions = true + EndGlobalSection GlobalSection(SharedMSBuildProjectFiles) = preSolution ..\Plane.Sdk3\PlaneGcsSdk_Shared\PlaneGcsSdk_Shared.projitems*{0111eb6e-72e3-499c-a3ba-022f5bbc4caf}*SharedItemsImports = 4 ..\Plane.Sdk3\PlaneGcsSdk_Shared\PlaneGcsSdk_Shared.projitems*{2be393dc-21a4-48b3-83fd-f21cbe8b038b}*SharedItemsImports = 13 diff --git a/Plane.FormationCreator/App.xaml.cs b/Plane.FormationCreator/App.xaml.cs index cc675a4..b0aa765 100644 --- a/Plane.FormationCreator/App.xaml.cs +++ b/Plane.FormationCreator/App.xaml.cs @@ -45,10 +45,10 @@ namespace Plane.FormationCreator } return LoadAssembly(simpleName); }; - this.DispatcherUnhandledException += async (s, e) => + this.DispatcherUnhandledException += (s, e) => { _logger.Log(e.Exception); - await _formationController.AllStop(); + // await _formationController.AllStop(); TcpServerConnectionManager.Instance.StopListening(); UdpServerConnectionManager.Instance.StopReceiving(); }; @@ -56,7 +56,7 @@ namespace Plane.FormationCreator { try { - TcpServerConnectionManager.Instance.StopListening(); + // TcpServerConnectionManager.Instance.StopListening(); UdpServerConnectionManager.Instance.StopReceiving(); } catch (Exception ex) @@ -115,19 +115,24 @@ namespace Plane.FormationCreator MainWindow.Show(); try { - + /* by panxu tcp 不使用了 --使用TCP监听在自动获取IP的情况下,刚开始会导致界面无响应,过一会就好 TcpServerConnectionManager.Instance.ConnectionEstablished += ConnectionManager_ConnectionEstablished; if (!TcpServerConnectionManager.Instance.StartListening()) { Alert.Show("网络连接不正常,无法连接飞机。"); return; } + */ + + UdpServerConnectionManager.Instance.ExceptionThrown += (sender, e1) => { _logger.Log(e1.Exception); }; UdpServerConnectionManager.Instance.ConnectionEstablished += ConnectionManager_ConnectionEstablished; UdpServerConnectionManager.Instance.StartReceiving(); + + } catch (Exception ex) { diff --git a/Plane.FormationCreator/Formation/Copter.cs b/Plane.FormationCreator/Formation/Copter.cs index 8ee4b29..cacb720 100644 --- a/Plane.FormationCreator/Formation/Copter.cs +++ b/Plane.FormationCreator/Formation/Copter.cs @@ -12,7 +12,7 @@ namespace Plane.FormationCreator.Formation { class Copter : PLCopter { - public Copter(IConnection Connection, SynchronizationContext uiThreadContext) : base(Connection, uiThreadContext) + public Copter(IConnection Connection, SynchronizationContext uiThreadContext) : base(Connection, uiThreadContext,false) { Brush = _brushes[NextBrushIndex()]; } diff --git a/Plane.FormationCreator/Plane.FormationCreator.csproj b/Plane.FormationCreator/Plane.FormationCreator.csproj index afcdca2..333062b 100644 --- a/Plane.FormationCreator/Plane.FormationCreator.csproj +++ b/Plane.FormationCreator/Plane.FormationCreator.csproj @@ -145,6 +145,7 @@ + diff --git a/Plane.FormationCreator/ViewModels/ControlPanelViewModel.cs b/Plane.FormationCreator/ViewModels/ControlPanelViewModel.cs index 312f20d..ef40b4f 100644 --- a/Plane.FormationCreator/ViewModels/ControlPanelViewModel.cs +++ b/Plane.FormationCreator/ViewModels/ControlPanelViewModel.cs @@ -15,6 +15,8 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Input; using Plane.Communication; +using Microsoft.Win32; +using Plane.Util; namespace Plane.FormationCreator.ViewModels { @@ -178,6 +180,55 @@ namespace Plane.FormationCreator.ViewModels })); } } + private ICommand _LoadParamfile; + public ICommand LoadParamfile + { + get + { + return _LoadParamfile ?? (_LoadParamfile = new RelayCommand(async () => + { + + var dialog = new OpenFileDialog + { + DefaultExt = "param", + Filter = "飞行参数 (*.param)|*.param" + }; + if (dialog.ShowDialog() == true) + { + + bool ifallok = true; + var paramlist = ParamFile.loadParamFile(dialog.FileName); + + foreach (string name in paramlist.Keys) + { + float value = float.Parse( paramlist[name].ToString()); + await Task.WhenAll(_copterManager.AcceptingControlCopters.Select + (copter => copter.SetParamAsync(name, value))); + + await Task.WhenAll( + + _copterManager.AcceptingControlCopters.Select(async copter => + { + float getvaule = await copter.GetParamAsync(name); + if (getvaule != value) + { + ifallok = false; + Alert.Show(copter.Id +"参数["+ name+ "]设置失败,读取的值是[" + getvaule+"]", "提示", MessageBoxButton.OK, MessageBoxImage.Information); + } + } + + )); + + } + + if (ifallok) + Alert.Show("所有已选的飞机参数设置完成", "提示", MessageBoxButton.OK, MessageBoxImage.Information); + else + Alert.Show("有部分飞机参数设置失败,请检查并再次设置", "提示", MessageBoxButton.OK, MessageBoxImage.Information); + } + })); + } + } private ICommand _ParamModify; @@ -247,20 +298,25 @@ namespace Plane.FormationCreator.ViewModels } // limit to 110 byte packets - byte[] buffer = new byte[180]; + byte[] buffer; int length = 0; try { - if (Rtkport.BytesToRead() > 0)//while (Rtkport.BytesToRead() > 0) - + length = Math.Min(180, Rtkport.BytesToRead()); + + if (length > 0)//while (Rtkport.BytesToRead() > 0) { - int read = await Rtkport.ReadAsync(buffer, 0, Math.Min(buffer.Length, Rtkport.BytesToRead())); - - // sendData(buffer, (byte)read); + buffer = new byte[length]; + + int read = await Rtkport.ReadAsync(buffer, 0, Math.Min(buffer.Length, length)); + + // sendData(buffer, (byte)read); } + else + return null; /* if (await Rtkport.ReadAsync(buffer, 0, 1) == 0) @@ -273,7 +329,7 @@ namespace Plane.FormationCreator.ViewModels } */ - + } catch (Exception ex) { @@ -324,13 +380,19 @@ namespace Plane.FormationCreator.ViewModels { //读入RTK数据 var packet = await ReadRTKPacketAsync().ConfigureAwait(false); - //分发到每个飞机 - foreach (var copter in _copterManager.Copters) + if (packet != null) { - // int iid = Convert.ToInt32(copter.Name); - //临时用来区分RTK发送数据 - //if (iid<50) + Console.WriteLine("rev:" + (ushort)packet.Length); + + //分发到每个飞机 + foreach (var copter in _copterManager.Copters) + { + // int iid = Convert.ToInt32(copter.Name); + //临时用来区分RTK发送数据 + //if (iid<50) await copter.InjectGpsDataAsync(packet, (ushort)packet.Length); + + } } @@ -544,13 +606,14 @@ namespace Plane.FormationCreator.ViewModels var _flightTaskManager = _taskmodimodel.FlightTaskManager; int coptercount = _copterManager.Copters.Count; int taskcount = _flightTaskManager.Tasks.Count; + bool havewritefault = true; if (taskcount < 2) return; for (int i = 0; i < coptercount; i++) { ///写航线开始 - var missions = new IMission[taskcount + 1]; //不要起飞任务但增加一个起飞后低空航点,见起飞任务,再增加一个降落低空航点,见降落部分 + var missions = new IMission[taskcount]; //不要起飞任务但增加一个起飞后低空航点,见起飞任务,再增加一个降落低空航点,见降落部分 int missindex = 0; for (int j = 0; j < _flightTaskManager.Tasks.Count; j++) @@ -560,14 +623,14 @@ namespace Plane.FormationCreator.ViewModels { case FlightTaskType.TakeOff: - missions[missindex++] = Mission.CreateTakeoffMission(10,10,_flightTaskManager.Tasks[j + 1].SingleCopterInfos[i].TargetLat, - _flightTaskManager.Tasks[j + 1].SingleCopterInfos[i].TargetLng, 3); + missions[missindex++] = Mission.CreateTakeoffMission(2,5,_flightTaskManager.Tasks[j + 1].SingleCopterInfos[i].TargetLat, + _flightTaskManager.Tasks[j + 1].SingleCopterInfos[i].TargetLng, _flightTaskManager.Tasks[j+1].SingleCopterInfos[i].TargetAlt); //要起飞任务 break; case FlightTaskType.FlyTo: - missions[missindex++] = Mission.CreateWaypointMission(10,10,_flightTaskManager.Tasks[j].SingleCopterInfos[i].TargetLat, - _flightTaskManager.Tasks[j].SingleCopterInfos[i].TargetLng, 3); + missions[missindex++] = Mission.CreateWaypointMission(5,15,_flightTaskManager.Tasks[j].SingleCopterInfos[i].TargetLat, + _flightTaskManager.Tasks[j].SingleCopterInfos[i].TargetLng, _flightTaskManager.Tasks[j].SingleCopterInfos[i].TargetAlt); break; case FlightTaskType.Loiter: // missions[missindex++] = Mission.CreateWaypointMission(10,10,_flightTaskManager.Tasks[j].SingleCopterInfos[i].TargetLat, @@ -588,8 +651,15 @@ namespace Plane.FormationCreator.ViewModels } var result = await _copterManager.Copters[i].WriteMissionListAsync(missions); - //MessageBox.Show($"The result of WriteMissions: {result}"); + if (!result) + { + + Alert.Show($"飞机:{_copterManager.Copters[i].Name} 任务写入失败!"); + return; + } + } + Alert.Show($"所有任务写入成功!"); // var firstCopter = _copterManager.Copters.First(); diff --git a/Plane.FormationCreator/ViewModels/CopterListViewModel.cs b/Plane.FormationCreator/ViewModels/CopterListViewModel.cs index 6d89ce6..909d6c8 100644 --- a/Plane.FormationCreator/ViewModels/CopterListViewModel.cs +++ b/Plane.FormationCreator/ViewModels/CopterListViewModel.cs @@ -25,6 +25,37 @@ namespace Plane.FormationCreator.ViewModels _copterManager = copterManager; _mapManager = mapManager; _flightTaskManager = flightTaskManager; + System.Timers.Timer t = new System.Timers.Timer(5000); //实例化Timer类,设置间隔时间为1秒; + t.Elapsed += new System.Timers.ElapsedEventHandler(theout); //到达时间的时候执行事件; + t.AutoReset = true; //设置是执行一次(false)还是一直执行(true); + t.Enabled = true; //是否执行System.Timers.Timer.Elapsed事件; + + + + } + + public void theout(object source, System.Timers.ElapsedEventArgs e) + { + int allrec = 0; + int allsend = 0; + int copterrec = 0; + int coptersend = 0; + foreach (var copter in _copterManager.Copters) + { + copter.GetCommunicationNumber(out copterrec, out coptersend); + allrec += copterrec; + allsend += coptersend; + copter.ResetCommunicationNumber(); + + + } + allrec /= 5; + allsend /= 5; + if (_copterManager.Copters.Count>0) + Communinfo = "接收:" + allrec + "/s;发送:"+ allsend+"/s 单机:"+ allrec/ _copterManager.Copters.Count+"/s;"+ + allsend / _copterManager.Copters.Count+"/s"; + + } private CopterManager _copterManager; @@ -43,6 +74,13 @@ namespace Plane.FormationCreator.ViewModels private int _virtualCopterId = 1; private LatLng? _lastVirtualCopterLocation; + private string _Communinfo = "0字节/秒"; + public string Communinfo + { + get { return _Communinfo; } + set { Set(nameof(Communinfo), ref _Communinfo, value); } + } + private ICommand _AddVirtualCopterCommand; public ICommand AddVirtualCopterCommand diff --git a/Plane.FormationCreator/Views/ControlPanelView.xaml b/Plane.FormationCreator/Views/ControlPanelView.xaml index cdf738a..352967e 100644 --- a/Plane.FormationCreator/Views/ControlPanelView.xaml +++ b/Plane.FormationCreator/Views/ControlPanelView.xaml @@ -42,6 +42,8 @@ Command="{Binding FloatCommand}" />