From 8bebf0c3945c080d74c63dc7f7da0bb0e057b07c Mon Sep 17 00:00:00 2001 From: Michael Oborne Date: Sun, 22 Jul 2012 15:51:05 +0800 Subject: [PATCH] APM Planner 1.1.99 Convert to IActivate, IDeactivate scheme, thanks andrew add support for rfcomm* interfaces on linux fix guage off screen draw mono issue. remove use of BackStageViewContentPanel andrews spacer changes - not using dues to screen space issue change configpanel constructor to load xml directly remove IMavlink Interface fix hsi off screen draw issue on mono modify hud to use sprite fonts, instead of drawing via GDI+ modify progress reporter to use a 10hz timer to update screen, using invoke/begininvoke fails on mono at 50hz (over 100ms per call). fix targetalt and target airspeed jumping issue. lots of cleanup on tab switching, ie stoping timers/other 3dr radio status led update update ardurover car icon speedup georef image screen. tested on over 1000 images. --- .../Antenna/Tracker.Designer.cs | 1 - Tools/ArdupilotMegaPlanner/Antenna/Tracker.cs | 4 +- .../ArdupilotMegaPlanner/ArdupilotMega.csproj | 3 +- Tools/ArdupilotMegaPlanner/Common.cs | 2 +- .../Comms/CommsSerialPort.cs | 1 + Tools/ArdupilotMegaPlanner/Controls/AGauge.cs | 33 +- .../BackStageViewContentPanel.cs | 36 +- .../BackstageView/BackstageView.Designer.cs | 6 +- .../Controls/BackstageView/BackstageView.cs | 205 +++++--- .../Controls/ConfigPanel.cs | 6 +- .../Controls/ConnectionStats.cs | 4 +- .../Controls/CustomMessageBox.cs | 14 +- Tools/ArdupilotMegaPlanner/Controls/HSI.cs | 23 + Tools/ArdupilotMegaPlanner/Controls/HUD.cs | 142 ++++- .../Controls/LabelWithPseudoOpacity.cs | 5 - .../Controls/LineSeparator.cs | 80 +-- .../Controls/MainSwitcher.cs | 11 + .../ArdupilotMegaPlanner/Controls/MyLabel.cs | 23 +- .../Controls/MyUserControl.cs | 4 + .../Controls/ProgressReporterDialogue.cs | 51 +- .../ProgressReporterDialogue.designer.cs | 11 +- .../Controls/ProgressReporterDialogue.resx | 3 + .../Controls/PseudoOpacityHelper.cs | 3 - Tools/ArdupilotMegaPlanner/CurrentState.cs | 50 +- .../ConfigAP_Limits.Designer.cs | 1 - .../ConfigurationView/ConfigAP_Limits.cs | 4 +- ...gAccelerometerCalibrationPlane.Designer.cs | 1 - .../ConfigAccelerometerCalibrationPlane.cs | 4 +- ...igAccelerometerCalibrationQuad.Designer.cs | 211 ++++---- .../ConfigAccelerometerCalibrationQuad.cs | 122 +++-- .../ConfigAccelerometerCalibrationQuad.resx | 488 +++++++++--------- .../ConfigArducopter.Designer.cs | 6 +- .../ConfigurationView/ConfigArducopter.cs | 13 +- .../ConfigurationView/ConfigArducopter.resx | 12 +- .../ConfigArduplane.Designer.cs | 1 - .../ConfigurationView/ConfigArduplane.cs | 6 +- .../ConfigArdurover.Designer.cs | 1 - .../ConfigurationView/ConfigArdurover.cs | 6 +- .../ConfigBatteryMonitoring.Designer.cs | 2 - .../ConfigBatteryMonitoring.cs | 19 +- .../ConfigBatteryMonitoring.resx | 2 +- .../ConfigCameraStab.Designer.cs | 1 - .../ConfigurationView/ConfigCameraStab.cs | 4 +- .../ConfigFlightModes.Designer.cs | 1 - .../ConfigurationView/ConfigFlightModes.cs | 17 +- .../ConfigFriendlyParams.Designer.cs | 1 - .../ConfigurationView/ConfigFriendlyParams.cs | 6 +- .../ConfigHardwareOptions.Designer.cs | 1 - .../ConfigHardwareOptions.cs | 4 +- .../ConfigurationView/ConfigPlanner.cs | 189 ++++--- .../ConfigRadioInput.Designer.cs | 1 - .../ConfigurationView/ConfigRadioInput.cs | 23 +- .../ConfigRawParams.Designer.cs | 1 - .../ConfigurationView/ConfigRawParams.cs | 4 +- .../ConfigTradHeli.Designer.cs | 2 - .../ConfigurationView/ConfigTradHeli.cs | 17 +- .../GCSViews/ConfigurationView/Setup.cs | 16 +- .../GCSViews/FlightData.Designer.cs | 1 + .../GCSViews/FlightData.cs | 139 +++-- .../GCSViews/FlightData.resx | 68 +-- .../GCSViews/FlightPlanner.Designer.cs | 29 +- .../GCSViews/FlightPlanner.cs | 119 ++++- .../GCSViews/FlightPlanner.resx | 66 ++- .../GCSViews/Simulation.Designer.cs | 9 +- .../GCSViews/Simulation.cs | 11 +- .../GCSViews/Simulation.resx | 115 ++--- .../ArdupilotMegaPlanner/GCSViews/Terminal.cs | 9 +- Tools/ArdupilotMegaPlanner/Log.Designer.cs | 1 + Tools/ArdupilotMegaPlanner/Log.resx | 12 +- Tools/ArdupilotMegaPlanner/MainV2.cs | 39 +- Tools/ArdupilotMegaPlanner/Mavlink/MAVLink.cs | 129 ++--- .../Presenter/ConfigCameraStabPresenter.cs | 4 +- Tools/ArdupilotMegaPlanner/Program.cs | 26 +- .../Properties/AssemblyInfo.cs | 2 +- .../Properties/Resources.Designer.cs | 12 + .../Properties/Resources.resx | 8 +- .../Radio/3DRradio.Designer.cs | 19 + Tools/ArdupilotMegaPlanner/Radio/3DRradio.cs | 11 +- .../ArdupilotMegaPlanner/Radio/3DRradio.resx | 144 ++++-- .../Resources/new frames-05X.png | Bin 0 -> 133811 bytes .../Utilities/ParameterMetaDataParser.cs | 3 +- .../Utilities/ParameterMetaDataRepository.cs | 2 +- .../Utilities/ThemeManager.cs | 2 +- Tools/ArdupilotMegaPlanner/georefimage.cs | 20 +- Tools/ArdupilotMegaPlanner/srtm.cs | 2 +- Tools/ArdupilotMegaPlanner/temp.cs | 6 +- 86 files changed, 1779 insertions(+), 1137 deletions(-) create mode 100644 Tools/ArdupilotMegaPlanner/Resources/new frames-05X.png diff --git a/Tools/ArdupilotMegaPlanner/Antenna/Tracker.Designer.cs b/Tools/ArdupilotMegaPlanner/Antenna/Tracker.Designer.cs index 90eea7c067..ef9c5d36ea 100644 --- a/Tools/ArdupilotMegaPlanner/Antenna/Tracker.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/Antenna/Tracker.Designer.cs @@ -253,7 +253,6 @@ this.Controls.Add(this.label1); this.Controls.Add(this.CMB_interface); this.Name = "Tracker"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Tracker_FormClosing); ((System.ComponentModel.ISupportInitialize)(this.TRK_pantrim)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.TRK_tilttrim)).EndInit(); this.ResumeLayout(false); diff --git a/Tools/ArdupilotMegaPlanner/Antenna/Tracker.cs b/Tools/ArdupilotMegaPlanner/Antenna/Tracker.cs index 5db7724fd1..8287d79f6a 100644 --- a/Tools/ArdupilotMegaPlanner/Antenna/Tracker.cs +++ b/Tools/ArdupilotMegaPlanner/Antenna/Tracker.cs @@ -12,7 +12,7 @@ using ArdupilotMega.Utilities; namespace ArdupilotMega.Antenna { - public partial class Tracker : BackStageViewContentPanel + public partial class Tracker : UserControl, IDeactivate { System.Threading.Thread t12; static bool threadrun = false; @@ -217,7 +217,7 @@ namespace ArdupilotMega.Antenna } - private void Tracker_FormClosing(object sender, FormClosingEventArgs e) + public void Deactivate() { saveconfig(); } diff --git a/Tools/ArdupilotMegaPlanner/ArdupilotMega.csproj b/Tools/ArdupilotMegaPlanner/ArdupilotMega.csproj index 8581ec4862..dbe1bbcf92 100644 --- a/Tools/ArdupilotMegaPlanner/ArdupilotMega.csproj +++ b/Tools/ArdupilotMegaPlanner/ArdupilotMega.csproj @@ -308,7 +308,6 @@ ConfigArdurover.cs - @@ -1208,6 +1207,8 @@ + + diff --git a/Tools/ArdupilotMegaPlanner/Common.cs b/Tools/ArdupilotMegaPlanner/Common.cs index d6f34ea45e..6deb109620 100644 --- a/Tools/ArdupilotMegaPlanner/Common.cs +++ b/Tools/ArdupilotMegaPlanner/Common.cs @@ -84,7 +84,7 @@ namespace ArdupilotMega // undo autochange in mouse over if (Pen.Color == Color.Blue) Pen.Color = Color.White; - + double width = (MainMap.Manager.GetDistance(MainMap.FromLocalToLatLng(0, 0), MainMap.FromLocalToLatLng(MainMap.Width, 0)) * 1000.0); double height = (MainMap.Manager.GetDistance(MainMap.FromLocalToLatLng(0, 0), MainMap.FromLocalToLatLng(MainMap.Height, 0)) * 1000.0); double m2pixelwidth = MainMap.Width / width; diff --git a/Tools/ArdupilotMegaPlanner/Comms/CommsSerialPort.cs b/Tools/ArdupilotMegaPlanner/Comms/CommsSerialPort.cs index 5685593422..41088c0211 100644 --- a/Tools/ArdupilotMegaPlanner/Comms/CommsSerialPort.cs +++ b/Tools/ArdupilotMegaPlanner/Comms/CommsSerialPort.cs @@ -48,6 +48,7 @@ namespace ArdupilotMega.Comms allPorts.AddRange(Directory.GetFiles("/dev/serial/by-id/", "*")); allPorts.AddRange(Directory.GetFiles("/dev/", "ttyACM*")); allPorts.AddRange(Directory.GetFiles("/dev/", "ttyUSB*")); + allPorts.AddRange(Directory.GetFiles("/dev/", "rfcomm*")); } string[] ports = System.IO.Ports.SerialPort.GetPortNames() diff --git a/Tools/ArdupilotMegaPlanner/Controls/AGauge.cs b/Tools/ArdupilotMegaPlanner/Controls/AGauge.cs index 9221e63906..6caed49415 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/AGauge.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/AGauge.cs @@ -1410,6 +1410,8 @@ System.ComponentModel.Description("Enables or disables the range selected by Nee } } + + #endregion #region helper @@ -1471,22 +1473,37 @@ System.ComponentModel.Description("Enables or disables the range selected by Nee } #endregion + /// + /// Override to prevent offscreen drawing the control - mono mac + /// + public new void Invalidate() + { + if (!ThisReallyVisible()) + { + return; + } + + base.Invalidate(); + } + + public override void Refresh() + { + base.Refresh(); + } + /// /// this is to fix a mono off screen drawing issue /// /// public bool ThisReallyVisible() { - if (Parent != null) - return this.Bounds.IntersectsWith(Parent.ClientRectangle); - - return true; + Control ctl = Control.FromHandle(this.Handle); + return ctl.Visible; } #region base member overrides protected override void OnPaintBackground(PaintEventArgs pevent) { - base.OnPaintBackground(pevent); } protected override void OnPaint(PaintEventArgs pe) @@ -1497,9 +1514,11 @@ System.ComponentModel.Description("Enables or disables the range selected by Nee } if (!ThisReallyVisible()) + { + Console.WriteLine(this.Visible); + base.OnPaint(pe); return; - - base.OnPaint(pe); + } float scale = 1; diff --git a/Tools/ArdupilotMegaPlanner/Controls/BackstageView/BackStageViewContentPanel.cs b/Tools/ArdupilotMegaPlanner/Controls/BackstageView/BackStageViewContentPanel.cs index c74b8a3dd9..b9c41fb8fe 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/BackstageView/BackStageViewContentPanel.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/BackstageView/BackStageViewContentPanel.cs @@ -5,7 +5,31 @@ using System.Windows.Forms; namespace ArdupilotMega.Controls.BackstageView { - public class BackStageViewContentPanel : UserControl + /// + /// The implementor executes some logic on activation, for e.g when moving + /// from not selected to selected in a tab control + /// + public interface IActivate + { + // Should be idempotent + void Activate(); + } + + /// + /// The implementor executes some logic on deactivation, for e.g when moving + /// from selected to not selected in a tab control + /// + public interface IDeactivate + { + // Should be idempotent + void Deactivate(); + } + + /// + /// Base class for user controls that wish to participate as a backstage view + /// + [Obsolete("This doesn't do much any more, and should be replaced by indicating lifecycle features with IActivate etc")] + public class BackStageViewContentPanel : UserControl, IActivate, IDeactivate { public event FormClosingEventHandler FormClosing; @@ -25,5 +49,15 @@ namespace ArdupilotMega.Controls.BackstageView // this is now done on page load via parent control // base.OnLoad(e); } + + public void Activate() + { + DoLoad(EventArgs.Empty); + } + + public void Deactivate() + { + Close(); + } } } diff --git a/Tools/ArdupilotMegaPlanner/Controls/BackstageView/BackstageView.Designer.cs b/Tools/ArdupilotMegaPlanner/Controls/BackstageView/BackstageView.Designer.cs index 66d1128636..1b741e1086 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/BackstageView/BackstageView.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/BackstageView/BackstageView.Designer.cs @@ -37,10 +37,10 @@ this.pnlPages.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.pnlPages.Location = new System.Drawing.Point(150, 0); + this.pnlPages.Location = new System.Drawing.Point(152, 0); this.pnlPages.MinimumSize = new System.Drawing.Size(100, 0); this.pnlPages.Name = "pnlPages"; - this.pnlPages.Size = new System.Drawing.Size(297, 192); + this.pnlPages.Size = new System.Drawing.Size(291, 192); this.pnlPages.TabIndex = 0; // // pnlMenu @@ -49,7 +49,7 @@ | System.Windows.Forms.AnchorStyles.Left))); this.pnlMenu.Location = new System.Drawing.Point(0, 0); this.pnlMenu.Name = "pnlMenu"; - this.pnlMenu.Size = new System.Drawing.Size(150, 192); + this.pnlMenu.Size = new System.Drawing.Size(152, 192); this.pnlMenu.TabIndex = 1; // // BackstageView diff --git a/Tools/ArdupilotMegaPlanner/Controls/BackstageView/BackstageView.cs b/Tools/ArdupilotMegaPlanner/Controls/BackstageView/BackstageView.cs index 1ae5b2bc97..2514a96868 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/BackstageView/BackstageView.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/BackstageView/BackstageView.cs @@ -9,6 +9,12 @@ using ArdupilotMega.Utilities; namespace ArdupilotMega.Controls.BackstageView { + /// + /// A Control to somewhat emulate the 'backstage view' as in MS Office 2010 + /// + /// + /// 'Tabs' are added as a control in a + /// public partial class BackstageView : UserControl { private Color _buttonsAreaBgColor = Color.White; @@ -18,13 +24,14 @@ namespace ArdupilotMega.Controls.BackstageView private Color _highlightColor1 = Color.DarkBlue; private Color _highlightColor2 = Color.Blue; - private readonly List _pages= new List(); + private readonly List _items = new List(); private BackstageViewPage _activePage; private const int ButtonSpacing = 30; private const int ButtonHeight = 30; public BackstageViewPage SelectedPage { get { return _activePage; } } - public List Pages { get { return _pages; } } + + public List Pages { get { return _items.OfType().ToList(); } } public BackstageView() { @@ -38,12 +45,6 @@ namespace ArdupilotMega.Controls.BackstageView pnlMenu.GradColor = this.BackColor; } - protected override void OnPaint(PaintEventArgs e) - { - base.OnPaint(e); - } - - public override Color BackColor { get @@ -53,7 +54,7 @@ namespace ArdupilotMega.Controls.BackstageView set { base.BackColor = value; - UpdateButtons(); + UpdateButtonAppearance(); pnlMenu.GradColor = this.BackColor; } } @@ -68,7 +69,7 @@ namespace ArdupilotMega.Controls.BackstageView _buttonsAreaPencilColor = value; pnlMenu.PencilBorderColor = _buttonsAreaPencilColor; pnlMenu.Invalidate(); - UpdateButtons(); + UpdateButtonAppearance(); Invalidate(); } } @@ -96,7 +97,7 @@ namespace ArdupilotMega.Controls.BackstageView set { _selectedTextColor = value; - UpdateButtons(); + UpdateButtonAppearance(); } } @@ -108,7 +109,7 @@ namespace ArdupilotMega.Controls.BackstageView set { _unSelectedTextColor = value; - UpdateButtons(); + UpdateButtonAppearance(); Invalidate(); } } @@ -121,7 +122,7 @@ namespace ArdupilotMega.Controls.BackstageView set { _highlightColor1 = value; - UpdateButtons(); + UpdateButtonAppearance(); Invalidate(); } } @@ -134,36 +135,33 @@ namespace ArdupilotMega.Controls.BackstageView set { _highlightColor2 = value; - UpdateButtons(); + UpdateButtonAppearance(); Invalidate(); } } - - - private void UpdateButtons() + + /// + /// Add a page (tab) to this backstage view. Will be added at the end/bottom + /// + public void AddPage(UserControl userControl, string headerText) { - foreach (var backstageViewButton in pnlMenu.Controls.OfType()) - { - backstageViewButton.HighlightColor2 = _highlightColor2; - backstageViewButton.HighlightColor1 = _highlightColor1; - backstageViewButton.UnSelectedTextColor = _unSelectedTextColor; - backstageViewButton.SelectedTextColor = _selectedTextColor; - backstageViewButton.ContentPageColor = this.BackColor; - backstageViewButton.PencilBorderColor = _buttonsAreaPencilColor; + var page = new BackstageViewPage(userControl, headerText) + { + Page = + { + Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top, + Location = new Point(pnlMenu.Width, 0), + Dock = DockStyle.Fill + } + }; - backstageViewButton.Invalidate(); - } - } - - public void AddPage(BackstageViewPage page) - { - page.Page.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top; - page.Page.Location = new Point(pnlMenu.Width, 0); - page.Page.Dock = DockStyle.Fill; - - _pages.Add(page); + _items.Add(page); + CreateLinkButton(page); - //this.pnlPages.Controls.Add(page.Page); + + page.Page.Visible = false; + + this.pnlPages.Controls.Add(page.Page); if (_activePage == null) { @@ -173,13 +171,22 @@ namespace ArdupilotMega.Controls.BackstageView } } + /// + /// Add a spacer to this backstage view. Will be added at the end/bottom + /// + /// the amount to space by + public void AddSpacer(int spacerheight) + { + _items.Add(new BackstageViewSpacer(spacerheight)); + } + private void CreateLinkButton(BackstageViewPage page) { var lnkButton = new BackstageViewButton { Text = page.LinkText, Tag = page, - Top = _pages.IndexOf(page) * ButtonSpacing, + Top = _items.TakeWhile(i => i != page).Sum(i => i.Spacing), Width = this.pnlMenu.Width, Height = ButtonHeight, ContentPageColor = this.BackColor, @@ -195,12 +202,32 @@ namespace ArdupilotMega.Controls.BackstageView lnkButton.DoubleClick += lnkButton_DoubleClick; } - void lnkButton_DoubleClick(object sender, EventArgs e) + private void UpdateButtonAppearance() + { + foreach (var backstageViewButton in pnlMenu.Controls.OfType()) + { + backstageViewButton.HighlightColor2 = _highlightColor2; + backstageViewButton.HighlightColor1 = _highlightColor1; + backstageViewButton.UnSelectedTextColor = _unSelectedTextColor; + backstageViewButton.SelectedTextColor = _selectedTextColor; + backstageViewButton.ContentPageColor = this.BackColor; + backstageViewButton.PencilBorderColor = _buttonsAreaPencilColor; + + backstageViewButton.Invalidate(); + } + } + + /* + * Experimental - double clicking a button will spawn it out into a new form + * Care must be given to lifecycle here - two pages can now be interacted with + * 'simultaneously' + */ + private void lnkButton_DoubleClick(object sender, EventArgs e) { var backstageViewButton = ((BackstageViewButton)sender); var associatedPage = backstageViewButton.Tag as BackstageViewPage; - Form popoutForm = new Form(); + var popoutForm = new Form(); popoutForm.FormClosing += popoutForm_FormClosing; int maxright = 0, maxdown = 0; @@ -214,7 +241,7 @@ namespace ArdupilotMega.Controls.BackstageView // set the height to 0, so we can derive the header height in the next step popoutForm.Height = 0; - popoutForm.Size = new System.Drawing.Size(maxright + 20, maxdown + 20 + popoutForm.Height); + popoutForm.Size = new Size(maxright + 20, maxdown + 20 + popoutForm.Height); popoutForm.Controls.Add(associatedPage.Page); popoutForm.Tag = associatedPage; @@ -226,19 +253,18 @@ namespace ArdupilotMega.Controls.BackstageView popoutForm.Show(this); } - void popoutForm_FormClosing(object sender, FormClosingEventArgs e) + private void popoutForm_FormClosing(object sender, FormClosingEventArgs e) { // get the page back var temp = ((Form)sender).Tag as BackstageViewPage; + // add back to where it belongs this.pnlPages.Controls.Add(temp.Page); - // clear the controls, so we dont dispose the good control + // clear the controls, so we dont dispose the good control when it closes ((Form)sender).Controls.Clear(); - } - private void ButtonClick(object sender, EventArgs e) { var backstageViewButton = ((BackstageViewButton) sender); @@ -248,29 +274,36 @@ namespace ArdupilotMega.Controls.BackstageView public void ActivatePage(BackstageViewPage associatedPage) { - // deactivate the old page - _activePage.Page.Close(); - Pages.ForEach(x => + // Deactivate old page + if (_activePage.Page is IDeactivate) { - x.Page.Visible = false; - }); - this.pnlPages.Controls.Remove(_activePage.Page); + ((IDeactivate)(_activePage.Page)).Deactivate(); + } + + // deactivate the old page - obsolete way of notifying activation + //_activePage.Page.Close(); + + foreach (var p in Pages) + p.Page.Visible = false; // deactivate button _activePage.Page.Visible = false; var oldButton = this.pnlMenu.Controls.OfType().Single(b => b.Tag == _activePage); oldButton.IsSelected = false; + // ensure fields have been init - obsolete way of notifying activation + //associatedPage.Page.DoLoad(new EventArgs()); - ThemeManager.ApplyThemeTo(associatedPage.Page); + // new way of notifying activation. Goal is to get rid of BackStageViewContentPanel + // so plain old user controls can be added + if (associatedPage.Page is IActivate) + { + ((IActivate)(associatedPage.Page)).Activate(); + } - // ensure fields have been init - associatedPage.Page.DoLoad(new EventArgs()); // show it associatedPage.Page.Visible = true; - // add control - this.pnlPages.Controls.Add(associatedPage.Page); - + var newButton = this.pnlMenu.Controls.OfType().Single(b => b.Tag == associatedPage); newButton.IsSelected = true; @@ -279,22 +312,70 @@ namespace ArdupilotMega.Controls.BackstageView public void Close() { - foreach (BackstageViewPage page in _pages) + foreach (var page in _items) { - page.Page.Close(); + if (((BackstageViewPage)page).Page is IDeactivate) + { + ((IDeactivate)((BackstageViewPage)(page)).Page).Deactivate(); + } + else + { + ((BackstageViewPage)page).Page.Dispose(); + } } } - public class BackstageViewPage + public abstract class BackstageViewItem + { + public abstract int Spacing { get; } + } + + /// + /// Place-holder for a bit of blank space in a + /// Used to visually seperate logically related groups of link buttons + /// + public class BackstageViewSpacer : BackstageViewItem + { + private int _spacing; + + public BackstageViewSpacer(int spacerheight) + { + _spacing = spacerheight; + } + + // How much (vertical) space the thing takes up in the button menu + public override int Spacing + { + get { return _spacing; } + } + } + + + /// + /// Data structure to hold information about a 'tab' in the + /// + public class BackstageViewPage : BackstageViewItem { - public BackstageViewPage(BackStageViewContentPanel page, string linkText) + public BackstageViewPage(UserControl page, string linkText) { Page = page; LinkText = linkText; } - public BackStageViewContentPanel Page { get; set; } + /// + /// The user content of the tab + /// + public UserControl Page { get; set; } + + /// + /// The text to go in the 'tab header' + /// public string LinkText { get; set; } + + public override int Spacing + { + get { return ButtonSpacing; } + } } } diff --git a/Tools/ArdupilotMegaPlanner/Controls/ConfigPanel.cs b/Tools/ArdupilotMegaPlanner/Controls/ConfigPanel.cs index 9aeb5289ca..7591c3099a 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/ConfigPanel.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/ConfigPanel.cs @@ -13,7 +13,7 @@ using ArdupilotMega.Utilities; namespace ArdupilotMega.Controls { - public partial class ConfigPanel : BackStageViewContentPanel + public partial class ConfigPanel : UserControl { /// /// store temp pending changes @@ -22,9 +22,11 @@ namespace ArdupilotMega.Controls // store linked param options Hashtable _linkedParams = new Hashtable(); - public ConfigPanel() + public ConfigPanel(string XMLFile) { InitializeComponent(); + + LoadXML(XMLFile); } /// diff --git a/Tools/ArdupilotMegaPlanner/Controls/ConnectionStats.cs b/Tools/ArdupilotMegaPlanner/Controls/ConnectionStats.cs index a9f455a6ec..5705d01048 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/ConnectionStats.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/ConnectionStats.cs @@ -11,10 +11,10 @@ namespace ArdupilotMega.Controls { public partial class ConnectionStats : UserControl { - private readonly IMAVLink _mavlink; + private readonly MAVLink _mavlink; private CompositeDisposable _subscriptionsDisposable; - public ConnectionStats(IMAVLink comPort) + public ConnectionStats(MAVLink comPort) : this() { _mavlink = comPort; diff --git a/Tools/ArdupilotMegaPlanner/Controls/CustomMessageBox.cs b/Tools/ArdupilotMegaPlanner/Controls/CustomMessageBox.cs index de5e9592a5..e6e11168ac 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/CustomMessageBox.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/CustomMessageBox.cs @@ -52,7 +52,7 @@ namespace System.Windows.Forms var msgBoxFrm = new Form { FormBorderStyle = FormBorderStyle.FixedDialog, - ShowInTaskbar = false, + ShowInTaskbar = true, StartPosition = FormStartPosition.CenterScreen, Text = caption, MaximizeBox = false, @@ -60,7 +60,7 @@ namespace System.Windows.Forms Width = textSize.Width + 50, Height = textSize.Height + 100, TopMost = true, - TopLevel = true, + TopLevel = true }; Rectangle screenRectangle = msgBoxFrm.RectangleToScreen(msgBoxFrm.ClientRectangle); @@ -103,6 +103,8 @@ namespace System.Windows.Forms } catch { } + Console.WriteLine("CustomMessageBox 1"); + if (System.Windows.Forms.Application.OpenForms.Count > 0) { msgBoxFrm.StartPosition = FormStartPosition.Manual; @@ -110,13 +112,17 @@ namespace System.Windows.Forms // center of first form msgBoxFrm.Location = new Point(parentForm.Location.X + parentForm.Width / 2 - msgBoxFrm.Width / 2, parentForm.Location.Y + parentForm.Height / 2 - msgBoxFrm.Height / 2); - DialogResult test = msgBoxFrm.ShowDialog(); + Console.WriteLine("CustomMessageBox 2a"); + DialogResult test = msgBoxFrm.ShowDialog(null); } else { - DialogResult test = msgBoxFrm.ShowDialog(); + Console.WriteLine("CustomMessageBox 2b"); + DialogResult test = msgBoxFrm.ShowDialog(null); } + Console.WriteLine("CustomMessageBox 3"); + DialogResult answer = _state; return answer; diff --git a/Tools/ArdupilotMegaPlanner/Controls/HSI.cs b/Tools/ArdupilotMegaPlanner/Controls/HSI.cs index 6f105a6c13..48642745a3 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/HSI.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/HSI.cs @@ -31,6 +31,29 @@ namespace ArdupilotMega.Controls set { _navbearing = value; } } + /// + /// Override to prevent offscreen drawing the control - mono mac + /// + public new void Invalidate() + { + if (!ThisReallyVisible()) + { + return; + } + + base.Invalidate(); + } + + /// + /// this is to fix a mono off screen drawing issue + /// + /// + public bool ThisReallyVisible() + { + Control ctl = Control.FromHandle(this.Handle); + return ctl.Visible; + } + public HSI() { InitializeComponent(); diff --git a/Tools/ArdupilotMegaPlanner/Controls/HUD.cs b/Tools/ArdupilotMegaPlanner/Controls/HUD.cs index e28715c258..f553075732 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/HUD.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/HUD.cs @@ -182,10 +182,38 @@ namespace ArdupilotMega.Controls public override void Refresh() { + if (!ThisReallyVisible()) + { + return; + } + //base.Refresh(); OnPaint(new PaintEventArgs(this.CreateGraphics(),this.ClientRectangle)); } + /// + /// Override to prevent offscreen drawing the control - mono mac + /// + public new void Invalidate() + { + if (!ThisReallyVisible()) + { + return; + } + + base.Invalidate(); + } + + /// + /// this is to fix a mono off screen drawing issue + /// + /// + public bool ThisReallyVisible() + { + //Control ctl = Control.FromHandle(this.Handle); + return this.Visible; + } + protected override void OnLoad(EventArgs e) { if (opengl) @@ -245,9 +273,11 @@ namespace ArdupilotMega.Controls started = true; } + object lockit = new object(); bool inOnPaint = false; string otherthread = ""; + protected override void OnPaint(PaintEventArgs e) { //GL.Enable(EnableCap.AlphaTest) @@ -270,16 +300,21 @@ namespace ArdupilotMega.Controls return; } - if (inOnPaint) + lock (lockit) { - log.Info("Was in onpaint Hud th:" + System.Threading.Thread.CurrentThread.Name + " in " + otherthread); - return; + + if (inOnPaint) + { + log.Info("Was in onpaint Hud th:" + System.Threading.Thread.CurrentThread.Name + " in " + otherthread); + return; + } + + otherthread = System.Threading.Thread.CurrentThread.Name; + + inOnPaint = true; + } - otherthread = System.Threading.Thread.CurrentThread.Name; - - inOnPaint = true; - starttime = DateTime.Now; try @@ -701,6 +736,8 @@ namespace ArdupilotMega.Controls graphicsObjectGDIP.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SystemDefault; } + graphicsObjectGDIP.InterpolationMode = InterpolationMode.Bilinear; + graphicsObject.Clear(Color.Gray); @@ -1310,7 +1347,7 @@ namespace ArdupilotMega.Controls graphicsObject.DrawLine(redPen, scrollbg.Left, scrollbg.Top - (int)(fontsize * 2.2) - 2, scrollbg.Left + 50, scrollbg.Top - (int)(fontsize * 2.2) - 2 - 20); } - drawstring(graphicsObject, _datetime.ToString("HH:mm:ss"), font, fontsize, whiteBrush, scrollbg.Left - 20, scrollbg.Top - fontsize - 2 - 20); + drawstring(graphicsObject, _datetime.ToString("HH:mm:ss"), font, fontsize, whiteBrush, scrollbg.Left - 30, scrollbg.Top - fontsize - 2 - 20); // battery @@ -1558,27 +1595,86 @@ namespace ArdupilotMega.Controls if (text == null || text == "") return; - pth.Reset(); - - if (text != null) - pth.AddString(text, font.FontFamily, 0, fontsize + 5, new Point((int)x, (int)y), StringFormat.GenericTypographic); + + char[] chars = text.ToCharArray(); - //Draw the edge - // this uses lots of cpu time + float maxy = 0; - //e.SmoothingMode = SmoothingMode.HighSpeed; + foreach (char cha in chars) + { + int charno = (int)cha; + + int charid = charno + (128 * (int)fontsize); + + if (charbitmaps[charid] == null) + { + charbitmaps[charid] = new Bitmap(128, 128, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + + charbitmaps[charid].MakeTransparent(Color.Transparent); + + //charbitmaptexid + + float maxx = this.Width / 150; // for space + + + // create bitmap + using (Graphics gfx = Graphics.FromImage(charbitmaps[charid])) + { + pth.Reset(); + + if (text != null) + pth.AddString(cha + "", font.FontFamily, 0, fontsize + 5, new Point((int)0, (int)0), StringFormat.GenericTypographic); + + gfx.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + + gfx.DrawPath(P, pth); + + //Draw the face + + gfx.FillPath(brush, pth); + + + if (pth.PointCount > 0) + { + foreach (PointF pnt in pth.PathPoints) + { + if (pnt.X > maxx) + maxx = pnt.X; + + if (pnt.Y > maxy) + maxy = pnt.Y; + } + } + } + + charwidth[charid] = (int)(maxx + 2); + } + + // draw it + + float scale = 1.0f; + + DrawImage(charbitmaps[charid], (int)x, (int)y, charbitmaps[charid].Width, charbitmaps[charid].Height); + + x += charwidth[charid] * scale; + + /* + pth.Reset(); + + if (text != null) + pth.AddString(text, font.FontFamily, 0, fontsize + 5, new Point((int)x, (int)y), StringFormat.GenericTypographic); + + if (e == null || P == null || pth == null || pth.PointCount == 0) + return; - if (e == null || P == null || pth == null || pth.PointCount == 0) - return; - - //if (!ArdupilotMega.MainV2.MONO) e.DrawPath(P, pth); - //Draw the face + //Draw the face - e.FillPath(brush, pth); + e.FillPath(brush, pth); + */ + } - //pth.Dispose(); } protected override void OnHandleCreated(EventArgs e) @@ -1646,6 +1742,8 @@ namespace ArdupilotMega.Controls { if (opengl) { + MakeCurrent(); + GL.MatrixMode(MatrixMode.Projection); GL.LoadIdentity(); GL.Ortho(0, Width, Height, 0, -1, 1); diff --git a/Tools/ArdupilotMegaPlanner/Controls/LabelWithPseudoOpacity.cs b/Tools/ArdupilotMegaPlanner/Controls/LabelWithPseudoOpacity.cs index 6b25ba319d..1617f2110d 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/LabelWithPseudoOpacity.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/LabelWithPseudoOpacity.cs @@ -35,12 +35,7 @@ namespace ArdupilotMega.Controls throw new ArgumentOutOfRangeException(); _opacity = value; - Console.WriteLine("Opacity:" + _opacity); Invalidate(); - Invalidate(); - Invalidate(); - Invalidate(); - } } diff --git a/Tools/ArdupilotMegaPlanner/Controls/LineSeparator.cs b/Tools/ArdupilotMegaPlanner/Controls/LineSeparator.cs index 5c96aff3e4..6d8f781574 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/LineSeparator.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/LineSeparator.cs @@ -1,51 +1,73 @@ using System; -using System.Collections.Generic; using System.ComponentModel; using System.Drawing; -using System.Data; -using System.Linq; -using System.Text; +using System.Drawing.Drawing2D; using System.Windows.Forms; namespace ArdupilotMega.Controls { - + /// + /// A seperator that is fundamentally made from two lines the top 'Primary' and the + /// bottom 'Secondary' Thus the height is always 2 pixels + /// In addition, the opacity can be modulated for the left, middle and right most + /// points, and the color blended between. That way the seperator can be made to + /// fade out to the left or right or both, and more subtle UI effects made etc + /// public partial class LineSeparator : UserControl { + [Description("Primary Color of the secondary line"), Category("Appearance")] + [DefaultValue(typeof(Color), "DarkGray")] + public Color PrimaryColor { get; set; } + + [Description("Secondary Color of the secondary line"), Category("Appearance")] + [DefaultValue(typeof(Color), "White")] + public Color SecondaryColor { get; set; } + + [Description("Opacity at the left most point"), Category("Appearance")] + [DefaultValue(typeof(float), "1.0")] + public float Opacity1 { get; set; } + + [Description("Opacity at the mid point"), Category("Appearance")] + [DefaultValue(typeof(float), "1.0")] + public float Opacity2 { get; set; } + + [Description("Opacity at the right most point"), Category("Appearance")] + [DefaultValue(typeof(float), "1.0")] + public float Opacity3 { get; set; } + public LineSeparator() { + this.PrimaryColor = Color.DarkGray; + this.SecondaryColor = Color.White; + this.Opacity1 = Opacity2 = Opacity3 = 1f; + this.Height = 2; - - this.Paint += new PaintEventHandler(LineSeparator_Paint); - - + this.Paint += LineSeparator_Paint; this.MaximumSize = new Size(2000, 2); - - this.MinimumSize = new Size(0, 2); - - //this.Width = 350; - } - private void LineSeparator_Paint(object sender, PaintEventArgs e) { - - - - - Graphics g = e.Graphics; - - g.DrawLine( - - Pens.DarkGray, new Point(0, 0), new Point(this.Width, 0)); - - g.DrawLine( - - Pens.White, new Point(0, 1), new Point(this.Width, 1)); - + DrawLine(PrimaryColor, 0, e.Graphics); + DrawLine(SecondaryColor, 1, e.Graphics); } + private void DrawLine(Color baseColor, int y, Graphics g) + { + var c1 = Color.FromArgb((int)(Opacity1 * 255), baseColor.R, baseColor.G, baseColor.B); + var c2 = Color.FromArgb((int)(Opacity2 * 255), baseColor.R, baseColor.G, baseColor.B); + var c3 = Color.FromArgb((int)(Opacity3 * 255), baseColor.R, baseColor.G, baseColor.B); + + var point1 = new Point(0, y); + var point2 = new Point(Width / 2, y); + var point = new Point(Width, y); + + var b1 = new LinearGradientBrush(point1, point2, c1, c2); + var b2 = new LinearGradientBrush(point2, point, c2, c3); + + g.DrawLine(new Pen(b1), point1, point2); + g.DrawLine(new Pen(b2), point2, point); + } } } \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/Controls/MainSwitcher.cs b/Tools/ArdupilotMegaPlanner/Controls/MainSwitcher.cs index 65b4d00d94..8fa9f8b47d 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/MainSwitcher.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/MainSwitcher.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Text; using System.Windows.Forms; using ArdupilotMega.Utilities; +using ArdupilotMega.Controls.BackstageView; namespace ArdupilotMega.Controls { @@ -43,6 +44,11 @@ namespace ArdupilotMega.Controls // check if we need to remove the current control if (!current.Persistent) { + if (current.Control is IDeactivate) + { + ((IDeactivate)(current.Control)).Deactivate(); + } + // cleanup current.Control.Close(); @@ -63,6 +69,11 @@ namespace ArdupilotMega.Controls nextscreen.Visible = true; + if (nextscreen.Control is IActivate) + { + ((IActivate)(nextscreen.Control)).Activate(); + } + this.Controls.Add(nextscreen.Control); ThemeManager.ApplyThemeTo(nextscreen.Control); diff --git a/Tools/ArdupilotMegaPlanner/Controls/MyLabel.cs b/Tools/ArdupilotMegaPlanner/Controls/MyLabel.cs index c5393c2c9c..a3ff19f0b3 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/MyLabel.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/MyLabel.cs @@ -64,7 +64,22 @@ namespace ArdupilotMega.Controls return this.Bounds.IntersectsWith(Parent.ClientRectangle); return true; - } + } + + public override void Refresh() + { + base.Refresh(); + } + + protected override void OnParentBindingContextChanged(EventArgs e) + { + base.OnParentBindingContextChanged(e); + } + + protected override void OnVisibleChanged(EventArgs e) + { + base.OnVisibleChanged(e); + } SolidBrush s = new SolidBrush(Color.White); @@ -75,9 +90,7 @@ namespace ArdupilotMega.Controls protected override void OnPaint(PaintEventArgs e) { - TextRenderer.DrawText(e.Graphics, label, this.Font, new Point(0, 0), ForeColor); - /* - //return; + // TextRenderer.DrawText(e.Graphics, label, this.Font, new Point(0, 0), ForeColor); stringFormat.Alignment = StringAlignment.Near; stringFormat.LineAlignment = StringAlignment.Center; @@ -85,7 +98,7 @@ namespace ArdupilotMega.Controls s = new SolidBrush(ForeColor); e.Graphics.DrawString(label, this.Font, s, new PointF(0, this.Height / 2.0f), stringFormat); - */ + } protected override void OnPaintBackground(PaintEventArgs pevent) diff --git a/Tools/ArdupilotMegaPlanner/Controls/MyUserControl.cs b/Tools/ArdupilotMegaPlanner/Controls/MyUserControl.cs index 5903f7d2d8..d668d91bf1 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/MyUserControl.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/MyUserControl.cs @@ -11,6 +11,10 @@ namespace System.Windows.Forms /// public class MyUserControl : System.Windows.Forms.UserControl { + /// + /// implement an on closing event to tidy up enviroment. + /// Using preedefined refrence as can easerly change betwen form and user control this way. + /// public event FormClosingEventHandler FormClosing; public void Close(object sender, FormClosingEventArgs e) diff --git a/Tools/ArdupilotMegaPlanner/Controls/ProgressReporterDialogue.cs b/Tools/ArdupilotMegaPlanner/Controls/ProgressReporterDialogue.cs index 58b2fdd223..7fec2e5eeb 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/ProgressReporterDialogue.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/ProgressReporterDialogue.cs @@ -17,6 +17,9 @@ namespace ArdupilotMega.Controls private Exception workerException; public ProgressWorkerEventArgs doWorkArgs; + internal int _progress = -1; + internal string _status = ""; + public delegate void DoWorkEventHandler(object sender, ProgressWorkerEventArgs e); // This is the event that will be raised on the BG thread @@ -48,7 +51,7 @@ namespace ArdupilotMega.Controls // mono fix - ensure the dialog is running while (this.IsHandleCreated == false) - System.Threading.Thread.Sleep(5); + System.Threading.Thread.Sleep(1); try { @@ -59,10 +62,18 @@ namespace ArdupilotMega.Controls // The background operation thew an exception. // Examine the work args, if there is an error, then display that and the exception details // Otherwise display 'Unexpected error' and exception details + timer1.Stop(); ShowDoneWithError(e, doWorkArgs.ErrorMessage); return; } + // stop the timer + timer1.Stop(); + // run once more to do final message and progressbar + this.Invoke((MethodInvoker)delegate + { + timer1_Tick(null, null); + }); if (doWorkArgs.CancelRequested && doWorkArgs.CancelAcknowledged) { @@ -183,24 +194,9 @@ namespace ArdupilotMega.Controls if (doWorkArgs.CancelRequested && !doWorkArgs.CancelAcknowledged) return; - if (this.InvokeRequired) - { - // invoke async - this.BeginInvoke((MethodInvoker) delegate - { + _progress = progress; + _status = status; - lblProgressMessage.Text = status; - if (progress == -1) - { - this.progressBar1.Style = ProgressBarStyle.Marquee; - } - else - { - this.progressBar1.Style = ProgressBarStyle.Continuous; - this.progressBar1.Value = progress; - } - }); - } } private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) @@ -212,6 +208,25 @@ namespace ArdupilotMega.Controls CustomMessageBox.Show(message,"Exception Details",MessageBoxButtons.OK,MessageBoxIcon.Information); } + /// + /// prevent using invokes on main update status call "UpdateProgressAndStatus", as this is slow on mono + /// + /// + /// + private void timer1_Tick(object sender, EventArgs e) + { + lblProgressMessage.Text = _status; + if (_progress == -1) + { + this.progressBar1.Style = ProgressBarStyle.Marquee; + } + else + { + this.progressBar1.Style = ProgressBarStyle.Continuous; + this.progressBar1.Value = _progress; + } + } + } public class ProgressWorkerEventArgs : EventArgs diff --git a/Tools/ArdupilotMegaPlanner/Controls/ProgressReporterDialogue.designer.cs b/Tools/ArdupilotMegaPlanner/Controls/ProgressReporterDialogue.designer.cs index 93261295d6..15e1bdaff6 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/ProgressReporterDialogue.designer.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/ProgressReporterDialogue.designer.cs @@ -33,12 +33,14 @@ namespace ArdupilotMega.Controls /// private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); this.progressBar1 = new System.Windows.Forms.ProgressBar(); this.lblProgressMessage = new System.Windows.Forms.Label(); this.btnCancel = new System.Windows.Forms.Button(); this.imgWarning = new System.Windows.Forms.PictureBox(); this.linkLabel1 = new System.Windows.Forms.LinkLabel(); this.btnClose = new System.Windows.Forms.Button(); + this.timer1 = new System.Windows.Forms.Timer(this.components); ((System.ComponentModel.ISupportInitialize)(this.imgWarning)).BeginInit(); this.SuspendLayout(); // @@ -94,7 +96,7 @@ namespace ArdupilotMega.Controls this.linkLabel1.Visible = false; this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); // - // btn_Close + // btnClose // this.btnClose.Location = new System.Drawing.Point(213, 109); this.btnClose.Name = "btnClose"; @@ -104,6 +106,11 @@ namespace ArdupilotMega.Controls this.btnClose.UseVisualStyleBackColor = true; this.btnClose.Click += new System.EventHandler(this.btn_Close_Click); // + // timer1 + // + this.timer1.Enabled = true; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // // ProgressReporterDialogue // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -123,6 +130,7 @@ namespace ArdupilotMega.Controls this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "Progress"; + this.TopMost = true; ((System.ComponentModel.ISupportInitialize)(this.imgWarning)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -137,5 +145,6 @@ namespace ArdupilotMega.Controls private PictureBox imgWarning; private LinkLabel linkLabel1; private Button btnClose; + private Timer timer1; } } \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/Controls/ProgressReporterDialogue.resx b/Tools/ArdupilotMegaPlanner/Controls/ProgressReporterDialogue.resx index 7080a7d118..886d0de36e 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/ProgressReporterDialogue.resx +++ b/Tools/ArdupilotMegaPlanner/Controls/ProgressReporterDialogue.resx @@ -117,4 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/Controls/PseudoOpacityHelper.cs b/Tools/ArdupilotMegaPlanner/Controls/PseudoOpacityHelper.cs index bc3230ce08..879f1ec9bd 100644 --- a/Tools/ArdupilotMegaPlanner/Controls/PseudoOpacityHelper.cs +++ b/Tools/ArdupilotMegaPlanner/Controls/PseudoOpacityHelper.cs @@ -10,9 +10,6 @@ namespace ArdupilotMega.Controls { var bgcolor = c.BackColor; int alpha = 255 - ((int)(opacity * 255)); - - Console.WriteLine("Alpha:" + alpha); - var opacityColor = Color.FromArgb(alpha, bgcolor.R, bgcolor.G, bgcolor.B); using (var brush = new SolidBrush(opacityColor)) diff --git a/Tools/ArdupilotMegaPlanner/CurrentState.cs b/Tools/ArdupilotMegaPlanner/CurrentState.cs index 4a43983cea..e48233ea7a 100644 --- a/Tools/ArdupilotMegaPlanner/CurrentState.cs +++ b/Tools/ArdupilotMegaPlanner/CurrentState.cs @@ -78,6 +78,7 @@ namespace ArdupilotMega public float mz { get; set; } public float magfield { get { return (float)Math.Sqrt(Math.Pow(mx, 2) + Math.Pow(my, 2) + Math.Pow(mz, 2)); } } + public float accelsq { get { return (float)Math.Sqrt(Math.Pow(ax, 2) + Math.Pow(ay, 2) + Math.Pow(az, 2)) / 980.665f; } } // calced turn rate public float turnrate { get { if (groundspeed <= 1) return 0; return (roll * 9.8f) / groundspeed; } } @@ -131,9 +132,9 @@ namespace ArdupilotMega public float nav_bearing { get; set; } public float target_bearing { get; set; } public float wp_dist { get { return (_wpdist * multiplierdist); } set { _wpdist = value; } } - public float alt_error { get { return _alt_error * multiplierdist; } set { _alt_error = value; _targetalt = (float)Math.Round(alt + alt_error, 0); } } + public float alt_error { get { return _alt_error * multiplierdist; } set { if (_alt_error == value) return; _alt_error = value; _targetalt = _targetalt * 0.5f + (float)Math.Round(alt + alt_error, 0) * 0.5f; Console.WriteLine(_targetalt); } } public float ber_error { get { return (target_bearing - yaw); } set { } } - public float aspd_error { get { return _aspd_error * multiplierspeed; } set { _aspd_error = value; } } + public float aspd_error { get { return _aspd_error * multiplierspeed; } set { if (_aspd_error == value) return; _aspd_error = value; _targetairspeed = _targetairspeed * 0.5f + (float)Math.Round(airspeed + aspd_error / 100, 0) * 0.5f; } } public float xtrack_error { get; set; } public float wpno { get; set; } public string mode { get; set; } @@ -142,12 +143,13 @@ namespace ArdupilotMega float _aspd_error; float _alt_error; float _targetalt; + float _targetairspeed; public float targetaltd100 { get { return (_targetalt / 100) % 10; } } public float targetalt { get { return _targetalt; } } //airspeed_error = (airspeed_error - airspeed); - public float targetairspeed { get { return (float)Math.Round(airspeed + aspd_error / 100, 0); } } + public float targetairspeed { get { return _targetairspeed; } } //message @@ -352,7 +354,7 @@ namespace ArdupilotMega UpdateCurrentSettings(bs, false, MainV2.comPort); } */ - public void UpdateCurrentSettings(System.Windows.Forms.BindingSource bs, bool updatenow, IMAVLink mavinterface) + public void UpdateCurrentSettings(System.Windows.Forms.BindingSource bs, bool updatenow, MAVLink mavinterface) { if (DateTime.Now > lastupdate.AddMilliseconds(19) || updatenow) // 50 hz { @@ -430,24 +432,6 @@ namespace ArdupilotMega //MAVLink.packets[MAVLink.MAVLINK_MSG_ID_HWSTATUS] = null; } - - bytearray = mavinterface.packets[MAVLink.MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT]; - - if (bytearray != null) - { - var nav = bytearray.ByteArrayToStructure(6); - - nav_roll = nav.nav_roll; - nav_pitch = nav.nav_pitch; - nav_bearing = nav.nav_bearing; - target_bearing = nav.target_bearing; - wp_dist = nav.wp_dist; - alt_error = nav.alt_error; - aspd_error = nav.aspd_error; - xtrack_error = nav.xtrack_error; - - //MAVLink.packets[MAVLink.MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT] = null; - } #if MAVLINK10 @@ -849,6 +833,26 @@ namespace ArdupilotMega } #endif + + + bytearray = mavinterface.packets[MAVLink.MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT]; + + if (bytearray != null) + { + var nav = bytearray.ByteArrayToStructure(6); + + nav_roll = nav.nav_roll; + nav_pitch = nav.nav_pitch; + nav_bearing = nav.nav_bearing; + target_bearing = nav.target_bearing; + wp_dist = nav.wp_dist; + alt_error = nav.alt_error; + aspd_error = nav.aspd_error; + xtrack_error = nav.xtrack_error; + + //MAVLink.packets[MAVLink.MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT] = null; + } + bytearray = mavinterface.packets[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_RAW]; if (bytearray != null) { @@ -964,7 +968,7 @@ namespace ArdupilotMega //System.Diagnostics.Debug.WriteLine(DateTime.Now.Millisecond); //Console.WriteLine(DateTime.Now.Millisecond); bs.DataSource = this; - //Console.WriteLine(DateTime.Now.Millisecond + " 1 " + updatenow); + // Console.WriteLine(DateTime.Now.Millisecond + " 1 " + updatenow + " " + System.Threading.Thread.CurrentThread.Name); bs.ResetBindings(false); //Console.WriteLine(DateTime.Now.Millisecond + " done "); } diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAP_Limits.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAP_Limits.Designer.cs index 059559a5c5..7ed6e03606 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAP_Limits.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAP_Limits.Designer.cs @@ -259,7 +259,6 @@ this.Controls.Add(this.LIM_ENABLED); this.Controls.Add(this.LNK_wiki); this.Name = "ConfigAP_Limits"; - this.Load += new System.EventHandler(this.ConfigAP_Limits_Load); this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); this.groupBox5.ResumeLayout(false); diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAP_Limits.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAP_Limits.cs index 152ae47e76..090de0a367 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAP_Limits.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAP_Limits.cs @@ -13,7 +13,7 @@ using System.Diagnostics; namespace ArdupilotMega.GCSViews.ConfigurationView { - public partial class ConfigAP_Limits : BackStageViewContentPanel + public partial class ConfigAP_Limits : UserControl, IActivate { public ConfigAP_Limits() { @@ -73,7 +73,7 @@ namespace ArdupilotMega.GCSViews.ConfigurationView ProcessChange(sender, e); } - private void ConfigAP_Limits_Load(object sender, EventArgs e) + public void Activate() { PopulateData(); } diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationPlane.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationPlane.Designer.cs index 265f207745..c4468673f5 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationPlane.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationPlane.Designer.cs @@ -83,7 +83,6 @@ this.Controls.Add(this.BUT_levelplane); this.Name = "ConfigAccelerometerCalibrationPlane"; this.toolTip1.SetToolTip(this, resources.GetString("$this.ToolTip")); - this.Load += new System.EventHandler(this.ConfigAccelerometerCalibration_Load); this.ResumeLayout(false); this.PerformLayout(); diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationPlane.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationPlane.cs index 9a5ed1adbc..488cc8fb6b 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationPlane.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationPlane.cs @@ -11,7 +11,7 @@ using ArdupilotMega.Controls; namespace ArdupilotMega.GCSViews.ConfigurationView { - public partial class ConfigAccelerometerCalibrationPlane : BackStageViewContentPanel + public partial class ConfigAccelerometerCalibrationPlane : UserControl, IActivate { bool startup = false; @@ -20,7 +20,7 @@ namespace ArdupilotMega.GCSViews.ConfigurationView InitializeComponent(); } - private void ConfigAccelerometerCalibration_Load(object sender, EventArgs e) + public void Activate() { if (!MainV2.comPort.BaseStream.IsOpen) { diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationQuad.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationQuad.Designer.cs index bab5902f1c..08a98c9041 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationQuad.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationQuad.Designer.cs @@ -1,4 +1,6 @@ -namespace ArdupilotMega.GCSViews.ConfigurationView +using ArdupilotMega.Controls; + +namespace ArdupilotMega.GCSViews.ConfigurationView { partial class ConfigAccelerometerCalibrationQuad { @@ -29,52 +31,77 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConfigAccelerometerCalibrationQuad)); - this.label28 = new System.Windows.Forms.Label(); - this.label15 = new System.Windows.Forms.Label(); - this.pictureBoxQuadX = new System.Windows.Forms.PictureBox(); - this.pictureBoxQuad = new System.Windows.Forms.PictureBox(); - this.BUT_levelac2 = new ArdupilotMega.Controls.MyButton(); - this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.pictureBox2 = new System.Windows.Forms.PictureBox(); - this.pictureBox3 = new System.Windows.Forms.PictureBox(); - this.pictureBox4 = new System.Windows.Forms.PictureBox(); + this.radioButton_Plus = new System.Windows.Forms.RadioButton(); + this.radioButton_X = new System.Windows.Forms.RadioButton(); + this.label5 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); - this.lbl_frame = new System.Windows.Forms.Label(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxQuadX)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxQuad)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.pictureBoxPlus = new ArdupilotMega.Controls.PictureBoxWithPseudoOpacity(); + this.pictureBoxX = new ArdupilotMega.Controls.PictureBoxWithPseudoOpacity(); + this.BUT_levelac2 = new ArdupilotMega.Controls.MyButton(); + this.label4 = new System.Windows.Forms.Label(); + this.lineSeparator3 = new ArdupilotMega.Controls.LineSeparator(); + this.lineSeparator2 = new ArdupilotMega.Controls.LineSeparator(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxPlus)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxX)).BeginInit(); this.SuspendLayout(); // - // label28 + // radioButton_Plus // - resources.ApplyResources(this.label28, "label28"); - this.label28.Name = "label28"; + resources.ApplyResources(this.radioButton_Plus, "radioButton_Plus"); + this.radioButton_Plus.Name = "radioButton_Plus"; + this.radioButton_Plus.TabStop = true; + this.radioButton_Plus.UseVisualStyleBackColor = true; + this.radioButton_Plus.CheckedChanged += new System.EventHandler(this.RadioButtonPlusCheckedChanged); // - // label15 + // radioButton_X // - resources.ApplyResources(this.label15, "label15"); - this.label15.Name = "label15"; + resources.ApplyResources(this.radioButton_X, "radioButton_X"); + this.radioButton_X.Name = "radioButton_X"; + this.radioButton_X.TabStop = true; + this.radioButton_X.UseVisualStyleBackColor = true; + this.radioButton_X.CheckedChanged += new System.EventHandler(this.RadioButtonPlusCheckedChanged); // - // pictureBoxQuadX + // label5 // - this.pictureBoxQuadX.Cursor = System.Windows.Forms.Cursors.Hand; - this.pictureBoxQuadX.Image = global::ArdupilotMega.Properties.Resources.quadx; - resources.ApplyResources(this.pictureBoxQuadX, "pictureBoxQuadX"); - this.pictureBoxQuadX.Name = "pictureBoxQuadX"; - this.pictureBoxQuadX.TabStop = false; - this.pictureBoxQuadX.Click += new System.EventHandler(this.pictureBoxQuadX_Click); + resources.ApplyResources(this.label5, "label5"); + this.label5.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label5.Name = "label5"; // - // pictureBoxQuad + // label1 // - this.pictureBoxQuad.Cursor = System.Windows.Forms.Cursors.Hand; - this.pictureBoxQuad.Image = global::ArdupilotMega.Properties.Resources.quad; - resources.ApplyResources(this.pictureBoxQuad, "pictureBoxQuad"); - this.pictureBoxQuad.Name = "pictureBoxQuad"; - this.pictureBoxQuad.TabStop = false; - this.pictureBoxQuad.Click += new System.EventHandler(this.pictureBoxQuad_Click); + resources.ApplyResources(this.label1, "label1"); + this.label1.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label1.Name = "label1"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // pictureBoxPlus + // + this.pictureBoxPlus.Cursor = System.Windows.Forms.Cursors.Hand; + this.pictureBoxPlus.Image = global::ArdupilotMega.Properties.Resources.frames_plus; + resources.ApplyResources(this.pictureBoxPlus, "pictureBoxPlus"); + this.pictureBoxPlus.Name = "pictureBoxPlus"; + this.pictureBoxPlus.TabStop = false; + this.pictureBoxPlus.Click += new System.EventHandler(this.pictureBox_Click); + // + // pictureBoxX + // + this.pictureBoxX.Cursor = System.Windows.Forms.Cursors.Hand; + this.pictureBoxX.Image = global::ArdupilotMega.Properties.Resources.frames_x; + resources.ApplyResources(this.pictureBoxX, "pictureBoxX"); + this.pictureBoxX.Name = "pictureBoxX"; + this.pictureBoxX.TabStop = false; + this.pictureBoxX.Click += new System.EventHandler(this.pictureBox_Click); // // BUT_levelac2 // @@ -83,75 +110,54 @@ this.BUT_levelac2.UseVisualStyleBackColor = true; this.BUT_levelac2.Click += new System.EventHandler(this.BUT_levelac2_Click); // - // pictureBox1 + // label4 // - this.pictureBox1.Cursor = System.Windows.Forms.Cursors.Hand; - this.pictureBox1.Image = global::ArdupilotMega.Properties.Resources.frames_06; - resources.ApplyResources(this.pictureBox1, "pictureBox1"); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.TabStop = false; - this.pictureBox1.Click += new System.EventHandler(this.pictureBoxQuadX_Click); + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; // - // pictureBox2 + // lineSeparator3 // - this.pictureBox2.Cursor = System.Windows.Forms.Cursors.Hand; - this.pictureBox2.Image = global::ArdupilotMega.Properties.Resources.hexa; - resources.ApplyResources(this.pictureBox2, "pictureBox2"); - this.pictureBox2.Name = "pictureBox2"; - this.pictureBox2.TabStop = false; - this.pictureBox2.Click += new System.EventHandler(this.pictureBoxQuad_Click); + resources.ApplyResources(this.lineSeparator3, "lineSeparator3"); + this.lineSeparator3.MaximumSize = new System.Drawing.Size(2000, 2); + this.lineSeparator3.MinimumSize = new System.Drawing.Size(0, 2); + this.lineSeparator3.Name = "lineSeparator3"; + this.lineSeparator3.Opacity1 = 0.6F; + this.lineSeparator3.Opacity2 = 0.7F; + this.lineSeparator3.Opacity3 = 0.1F; + this.lineSeparator3.PrimaryColor = System.Drawing.Color.Black; + this.lineSeparator3.SecondaryColor = System.Drawing.Color.Gainsboro; // - // pictureBox3 + // lineSeparator2 // - this.pictureBox3.Cursor = System.Windows.Forms.Cursors.Hand; - this.pictureBox3.Image = global::ArdupilotMega.Properties.Resources.octox; - resources.ApplyResources(this.pictureBox3, "pictureBox3"); - this.pictureBox3.Name = "pictureBox3"; - this.pictureBox3.TabStop = false; - this.pictureBox3.Click += new System.EventHandler(this.pictureBoxQuadX_Click); - // - // pictureBox4 - // - this.pictureBox4.Cursor = System.Windows.Forms.Cursors.Hand; - this.pictureBox4.Image = global::ArdupilotMega.Properties.Resources.octo; - resources.ApplyResources(this.pictureBox4, "pictureBox4"); - this.pictureBox4.Name = "pictureBox4"; - this.pictureBox4.TabStop = false; - this.pictureBox4.Click += new System.EventHandler(this.pictureBoxQuad_Click); - // - // label1 - // - resources.ApplyResources(this.label1, "label1"); - this.label1.Name = "label1"; - // - // lbl_frame - // - resources.ApplyResources(this.lbl_frame, "lbl_frame"); - this.lbl_frame.Name = "lbl_frame"; + resources.ApplyResources(this.lineSeparator2, "lineSeparator2"); + this.lineSeparator2.MaximumSize = new System.Drawing.Size(2000, 2); + this.lineSeparator2.MinimumSize = new System.Drawing.Size(0, 2); + this.lineSeparator2.Name = "lineSeparator2"; + this.lineSeparator2.Opacity1 = 0.6F; + this.lineSeparator2.Opacity2 = 0.7F; + this.lineSeparator2.Opacity3 = 0.1F; + this.lineSeparator2.PrimaryColor = System.Drawing.Color.Black; + this.lineSeparator2.SecondaryColor = System.Drawing.Color.Gainsboro; // // ConfigAccelerometerCalibrationQuad // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.lbl_frame); + this.Controls.Add(this.lineSeparator2); + this.Controls.Add(this.lineSeparator3); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); this.Controls.Add(this.label1); - this.Controls.Add(this.pictureBox3); - this.Controls.Add(this.pictureBox4); - this.Controls.Add(this.pictureBox1); - this.Controls.Add(this.pictureBox2); - this.Controls.Add(this.label28); - this.Controls.Add(this.label15); - this.Controls.Add(this.pictureBoxQuadX); - this.Controls.Add(this.pictureBoxQuad); + this.Controls.Add(this.label5); + this.Controls.Add(this.radioButton_X); + this.Controls.Add(this.radioButton_Plus); + this.Controls.Add(this.pictureBoxPlus); + this.Controls.Add(this.pictureBoxX); this.Controls.Add(this.BUT_levelac2); this.Name = "ConfigAccelerometerCalibrationQuad"; - this.Load += new System.EventHandler(this.ConfigAccelerometerCalibration_Load); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxQuadX)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBoxQuad)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxPlus)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxX)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -159,16 +165,17 @@ #endregion - private System.Windows.Forms.Label label28; - private System.Windows.Forms.Label label15; - private System.Windows.Forms.PictureBox pictureBoxQuadX; - private System.Windows.Forms.PictureBox pictureBoxQuad; + private PictureBoxWithPseudoOpacity pictureBoxX; private ArdupilotMega.Controls.MyButton BUT_levelac2; - private System.Windows.Forms.PictureBox pictureBox1; - private System.Windows.Forms.PictureBox pictureBox2; - private System.Windows.Forms.PictureBox pictureBox3; - private System.Windows.Forms.PictureBox pictureBox4; + private PictureBoxWithPseudoOpacity pictureBoxPlus; + private System.Windows.Forms.RadioButton radioButton_Plus; + private System.Windows.Forms.RadioButton radioButton_X; + private System.Windows.Forms.Label label5; private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label lbl_frame; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private LineSeparator lineSeparator3; + private LineSeparator lineSeparator2; } } diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationQuad.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationQuad.cs index 9d3d7516ac..84ad9c6cbb 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationQuad.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationQuad.cs @@ -1,90 +1,118 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Linq; -using System.Text; +using System.Reflection; using System.Windows.Forms; using ArdupilotMega.Controls.BackstageView; -using ArdupilotMega.Controls; +using log4net; +using Transitions; namespace ArdupilotMega.GCSViews.ConfigurationView { - public partial class ConfigAccelerometerCalibrationQuad : BackStageViewContentPanel + public partial class ConfigAccelerometerCalibrationQuad : UserControl, IActivate, IDeactivate { + private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private const float DisabledOpacity = 0.2F; + private const float EnabledOpacity = 1.0F; + public ConfigAccelerometerCalibrationQuad() { InitializeComponent(); } - private void pictureBoxQuadX_Click(object sender, EventArgs e) - { - try - { - MainV2.comPort.setParam("FRAME", 1f); - CustomMessageBox.Show("Set to x"); - - lbl_frame.Text = "X"; - } - catch { CustomMessageBox.Show("Set frame failed"); } - } - private void BUT_levelac2_Click(object sender, EventArgs e) { try { #if MAVLINK10 + Log.Info("Sending level command (mavlink 1.0)"); int fixme; // needs to be accel only MainV2.comPort.doCommand(MAVLink.MAV_CMD.PREFLIGHT_CALIBRATION,1,1,1,1,1,1,1); #else + log.Info("Sending level command (mavlink 0.9)"); MainV2.comPort.doAction(MAVLink.MAV_ACTION.MAV_ACTION_CALIBRATE_ACC); #endif BUT_levelac2.Text = "Complete"; } - catch + catch(Exception ex) { + Log.Error("Exception on level", ex); CustomMessageBox.Show("Failed to level : ac2 2.0.37+ is required"); } } - private void pictureBoxQuad_Click(object sender, EventArgs e) + private void pictureBox_Click(object sender, EventArgs e) { - try - { - MainV2.comPort.setParam("FRAME", 0f); - CustomMessageBox.Show("Set to +"); - lbl_frame.Text = "+"; - } - catch { CustomMessageBox.Show("Set frame failed"); } + if (sender == pictureBoxPlus) + radioButton_Plus.Checked = true; + else + radioButton_X.Checked = true; } - private void ConfigAccelerometerCalibration_Load(object sender, EventArgs e) + private void SetPlus() { - if (!MainV2.comPort.BaseStream.IsOpen) + FadePicBoxes(DisabledOpacity, EnabledOpacity); + SetFrameParam(true); + } + + private void SetX() + { + FadePicBoxes(EnabledOpacity, DisabledOpacity); + SetFrameParam(false); + } + + private void SetFrameParam(bool isPlus) + { + var f = isPlus ? 0f : 1f; + + try { - this.Enabled = false; - return; + MainV2.comPort.setParam("FRAME", f); + } + catch + { + CustomMessageBox.Show("Set frame failed", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + + private void FadePicBoxes(float xOpacity, float plusOpacity) + { + var fade = new Transition(new TransitionType_Linear(400)); + fade.add(pictureBoxX, "Opacity", xOpacity); + fade.add(pictureBoxPlus, "Opacity", plusOpacity); + fade.run(); + } + + public void Activate() + { + if ((float)MainV2.comPort.param["FRAME"] == 0) + { + this.radioButton_Plus.Checked = true; + pictureBoxX.Opacity = DisabledOpacity; + pictureBoxPlus.Opacity = EnabledOpacity; } else { - if (MainV2.cs.firmware == MainV2.Firmwares.ArduCopter2) - { - this.Enabled = true; - } - else - { - this.Enabled = false; - return; - } + this.radioButton_X.Checked = true; + pictureBoxX.Opacity = EnabledOpacity; + pictureBoxPlus.Opacity = DisabledOpacity; } - try - { - lbl_frame.Text = ((float)MainV2.comPort.param["FRAME"] == 0) ? "+" : "X"; - } - catch { lbl_frame.Text = "Invalid Frame"; } + radioButton_Plus.CheckedChanged += RadioButtonPlusCheckedChanged; + } + + public void Deactivate() + { + radioButton_Plus.CheckedChanged -= RadioButtonPlusCheckedChanged; + + } + + void RadioButtonPlusCheckedChanged(object sender, EventArgs e) + { + if (radioButton_X.Checked) + SetX(); + else + SetPlus(); } } } diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationQuad.resx b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationQuad.resx index e8c9f7ce21..2d8586c882 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationQuad.resx +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigAccelerometerCalibrationQuad.resx @@ -118,271 +118,115 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + True - + NoControl - - 194, 8 + + 76, 96 - - 239, 13 + + 14, 13 - - 15 + + 23 - - Level your MultiCopter to set default accel offsets + + radioButton_Plus - - label28 + + System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + $this - - 6 - - - True - - - NoControl - - - 254, 94 - - - 102, 13 - - - 12 - - - Frame Setup (+ or x) - - - label15 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 7 - - - NoControl - - - 71, 285 - - - 150, 150 - - - Zoom - - - 11 - - - pictureBoxQuadX - - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - + 8 - + + True + + NoControl - - 71, 115 + + 76, 197 - - 150, 150 + + 14, 13 - - Zoom + + 24 - - 10 + + radioButton_X - - pictureBoxQuad + + System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + $this - - 9 + + 7 - - 269, 38 + + True - - 75, 23 + + Microsoft Sans Serif, 12pt - - 16 - - - Level - - - BUT_levelac2 - - - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.1.4503.13960, Culture=neutral, PublicKeyToken=null - - - $this - - - 10 - - + NoControl - - 227, 285 + + 16, 282 - - 150, 150 + + 191, 20 - - Zoom + + 65 - - 18 + + Accelerometer Calibration - - pictureBox1 + + label5 - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - - 4 - - - NoControl - - - 227, 115 - - - 150, 150 - - - Zoom - - - 17 - - - pictureBox2 - - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 5 - - - NoControl - - - 383, 285 - - - 150, 150 - - - Zoom - - - 20 - - - pictureBox3 - - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - NoControl - - - 383, 115 - - - 150, 150 - - - Zoom - - - 19 - - - pictureBox4 - - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 + + 6 True + + Microsoft Sans Serif, 12pt + NoControl - 262, 74 + 16, 13 - 57, 13 + 102, 20 - 21 + 66 - Currently : + Frame Setup label1 @@ -394,36 +238,216 @@ $this - 1 + 5 - + True - + NoControl - - 323, 74 + + 39, 96 - - 13, 13 + + 31, 13 - - 22 + + 68 - - + + + 'Plus' - - lbl_frame + + label2 - + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + + 4 + + + True + + + NoControl + + + 52, 197 + + + 18, 13 + + + 69 + + + 'X' + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + NoControl + + + 116, 65 + + + 248, 81 + + + Zoom + + + 17 + + + pictureBoxPlus + + + ArdupilotMega.Controls.PictureBoxWithPseudoOpacity, ArdupilotMegaPlanner10, Version=1.1.4581.34461, Culture=neutral, PublicKeyToken=null + + + $this + + + 9 + + + NoControl + + + 116, 164 + + + 248, 85 + + + Zoom + + + 11 + + + pictureBoxX + + + ArdupilotMega.Controls.PictureBoxWithPseudoOpacity, ArdupilotMegaPlanner10, Version=1.1.4581.34461, Culture=neutral, PublicKeyToken=null + + + $this + + + 10 + + + NoControl + + + 378, 318 + + + 102, 23 + + + 16 + + + Calibrate Now + + + BUT_levelac2 + + + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4581.34461, Culture=neutral, PublicKeyToken=null + + + $this + + + 11 + + + True + + + 85, 323 + + + 279, 13 + + + 70 + + + Level your Multicopter to set default accelerometer offsets + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 20, 36 + + + 460, 2 + + + 80 + + + lineSeparator3 + + + ArdupilotMega.Controls.LineSeparator, ArdupilotMegaPlanner10, Version=1.1.4581.34461, Culture=neutral, PublicKeyToken=null + + + $this + + + 1 + + + 20, 300 + + + 460, 2 + + + 81 + + + lineSeparator2 + + + ArdupilotMega.Controls.LineSeparator, ArdupilotMegaPlanner10, Version=1.1.4581.34461, Culture=neutral, PublicKeyToken=null + + + $this + + 0 @@ -433,12 +457,12 @@ 6, 13 - 621, 460 + 495, 363 ConfigAccelerometerCalibrationQuad - ArdupilotMega.Controls.BackstageView.BackStageViewContentPanel, ArdupilotMegaPlanner, Version=1.1.4503.13960, Culture=neutral, PublicKeyToken=null + System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArducopter.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArducopter.Designer.cs index b1247dc95a..001ff14236 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArducopter.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArducopter.Designer.cs @@ -303,6 +303,11 @@ // THR_RATE_IMAX // resources.ApplyResources(this.THR_RATE_IMAX, "THR_RATE_IMAX"); + this.THR_RATE_IMAX.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); this.THR_RATE_IMAX.Name = "THR_RATE_IMAX"; // // THR_RATE_I @@ -896,7 +901,6 @@ this.Controls.Add(this.groupBox24); this.Controls.Add(this.groupBox25); this.Name = "ConfigArducopter"; - this.Load += new System.EventHandler(this.ConfigArducopter_Load); ((System.ComponentModel.ISupportInitialize)(this.TUNE_LOW)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.TUNE_HIGH)).EndInit(); this.groupBox5.ResumeLayout(false); diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArducopter.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArducopter.cs index b0ccea8669..6f01f8c2ba 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArducopter.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArducopter.cs @@ -12,7 +12,7 @@ using ArdupilotMega.Controls; namespace ArdupilotMega.GCSViews.ConfigurationView { - public partial class ConfigArducopter : BackStageViewContentPanel + public partial class ConfigArducopter : UserControl, IActivate { Hashtable changes = new Hashtable(); static Hashtable tooltips = new Hashtable(); @@ -34,7 +34,7 @@ namespace ArdupilotMega.GCSViews.ConfigurationView public string desc; } - private void ConfigArducopter_Load(object sender, EventArgs e) + public void Activate() { if (!MainV2.comPort.BaseStream.IsOpen) { @@ -203,6 +203,12 @@ namespace ArdupilotMega.GCSViews.ConfigurationView thisctl.Minimum = -180; } + if (thisctl.Name.ToUpper().EndsWith("THR_RATE_IMAX")) + { + thisctl.Maximum = 1000; // is a pwm + thisctl.Minimum = 0; + } + thisctl.Enabled = true; thisctl.BackColor = Color.FromArgb(0x43, 0x44, 0x45); @@ -412,7 +418,8 @@ namespace ArdupilotMega.GCSViews.ConfigurationView ((Control)sender).Enabled = true; - this.DoLoad(new EventArgs()); + + this.Activate(); } diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArducopter.resx b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArducopter.resx index c155d19dff..5f85ba9576 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArducopter.resx +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArducopter.resx @@ -135,7 +135,7 @@ myLabel3 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4564.20854, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4585.13688, Culture=neutral, PublicKeyToken=null $this @@ -201,7 +201,7 @@ myLabel2 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4564.20854, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4585.13688, Culture=neutral, PublicKeyToken=null $this @@ -312,7 +312,7 @@ myLabel1 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4564.20854, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4585.13688, Culture=neutral, PublicKeyToken=null $this @@ -2506,7 +2506,7 @@ BUT_writePIDS - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4564.20854, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.13688, Culture=neutral, PublicKeyToken=null $this @@ -2536,7 +2536,7 @@ BUT_rerequestparams - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4564.20854, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.13688, Culture=neutral, PublicKeyToken=null $this @@ -2782,6 +2782,6 @@ ConfigArducopter - ArdupilotMega.Controls.BackstageView.BackStageViewContentPanel, ArdupilotMegaPlanner10, Version=1.1.4564.20854, Culture=neutral, PublicKeyToken=null + System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArduplane.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArduplane.Designer.cs index 0fd14d9cc3..dcc8c52269 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArduplane.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArduplane.Designer.cs @@ -824,7 +824,6 @@ this.Controls.Add(this.groupBox9); this.Controls.Add(this.groupBox8); this.Name = "ConfigArduplane"; - this.Load += new System.EventHandler(this.ConfigArduplane_Load); this.groupBox3.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.THR_FS_VALUE)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.THR_MAX)).EndInit(); diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArduplane.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArduplane.cs index 575b7e9cb6..3eeccc8333 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArduplane.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArduplane.cs @@ -12,7 +12,7 @@ using ArdupilotMega.Controls; namespace ArdupilotMega.GCSViews.ConfigurationView { - public partial class ConfigArduplane : BackStageViewContentPanel + public partial class ConfigArduplane : UserControl, IActivate { Hashtable changes = new Hashtable(); static Hashtable tooltips = new Hashtable(); @@ -23,7 +23,7 @@ namespace ArdupilotMega.GCSViews.ConfigurationView InitializeComponent(); } - private void ConfigArduplane_Load(object sender, EventArgs e) + public void Activate() { if (!MainV2.comPort.BaseStream.IsOpen) { @@ -318,7 +318,7 @@ namespace ArdupilotMega.GCSViews.ConfigurationView ((Control)sender).Enabled = true; - this.DoLoad(new EventArgs()); + this.Activate(); } } diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArdurover.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArdurover.Designer.cs index 271fce64f2..c0b39b4a6b 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArdurover.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArdurover.Designer.cs @@ -509,7 +509,6 @@ this.Controls.Add(this.groupBox14); this.Controls.Add(this.groupBox11); this.Name = "ConfigArdurover"; - this.Load += new System.EventHandler(this.ConfigArduplane_Load); this.groupBox3.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.THR_FS_VALUE)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.THR_MAX)).EndInit(); diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArdurover.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArdurover.cs index 12feeefa1a..1c5036dd79 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArdurover.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigArdurover.cs @@ -12,7 +12,7 @@ using ArdupilotMega.Controls; namespace ArdupilotMega.GCSViews.ConfigurationView { - public partial class ConfigArdurover : BackStageViewContentPanel + public partial class ConfigArdurover : UserControl, IActivate { Hashtable changes = new Hashtable(); static Hashtable tooltips = new Hashtable(); @@ -23,7 +23,7 @@ namespace ArdupilotMega.GCSViews.ConfigurationView InitializeComponent(); } - private void ConfigArduplane_Load(object sender, EventArgs e) + public void Activate() { if (!MainV2.comPort.BaseStream.IsOpen) { @@ -318,7 +318,7 @@ namespace ArdupilotMega.GCSViews.ConfigurationView ((Control)sender).Enabled = true; - this.DoLoad(new EventArgs()); + this.Activate(); } } diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigBatteryMonitoring.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigBatteryMonitoring.Designer.cs index 13627c83b7..ca8aa746cf 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigBatteryMonitoring.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigBatteryMonitoring.Designer.cs @@ -186,7 +186,6 @@ // // timer1 // - this.timer1.Enabled = true; this.timer1.Interval = 1000; this.timer1.Tick += new System.EventHandler(this.timer1_Tick); // @@ -204,7 +203,6 @@ this.Controls.Add(this.CMB_batmontype); this.Controls.Add(this.pictureBox5); this.Name = "ConfigBatteryMonitoring"; - this.Load += new System.EventHandler(this.ConfigBatteryMonitoring_Load); this.groupBox4.ResumeLayout(false); this.groupBox4.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).EndInit(); diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigBatteryMonitoring.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigBatteryMonitoring.cs index 953efb94fc..c420b57305 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigBatteryMonitoring.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigBatteryMonitoring.cs @@ -11,7 +11,7 @@ using ArdupilotMega.Controls; namespace ArdupilotMega.GCSViews.ConfigurationView { - public partial class ConfigBatteryMonitoring : BackStageViewContentPanel + public partial class ConfigBatteryMonitoring : UserControl, IActivate, IDeactivate { bool startup = false; @@ -278,18 +278,13 @@ namespace ArdupilotMega.GCSViews.ConfigurationView } } - private void ConfigBatteryMonitoring_Load(object sender, EventArgs e) + public void Deactivate() { - if (!MainV2.comPort.BaseStream.IsOpen) - { - this.Enabled = false; - return; - } - else - { - this.Enabled = true; - } + timer1.Stop(); + } + public void Activate() + { startup = true; bool not_supported = false; if (MainV2.comPort.param["BATT_MONITOR"] != null) @@ -345,6 +340,8 @@ namespace ArdupilotMega.GCSViews.ConfigurationView } startup = false; + + timer1.Start(); } int getIndex(ComboBox ctl, int no) diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigBatteryMonitoring.resx b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigBatteryMonitoring.resx index 34d2e7f1d5..3f3991e00d 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigBatteryMonitoring.resx +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigBatteryMonitoring.resx @@ -682,6 +682,6 @@ Then subtract 0.3v from that value and enter it in field #1 at left. ConfigBatteryMonitoring - ArdupilotMega.Controls.BackstageView.BackStageViewContentPanel, ArdupilotMegaPlanner10, Version=1.1.4564.19603, Culture=neutral, PublicKeyToken=null + System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigCameraStab.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigCameraStab.Designer.cs index f8e6c3c7f5..8099c6e16c 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigCameraStab.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigCameraStab.Designer.cs @@ -574,7 +574,6 @@ namespace ArdupilotMega.GCSViews.ConfigurationView this.Controls.Add(this.pictureBox1); this.Name = "ConfigCameraStab"; this.Size = new System.Drawing.Size(674, 432); - this.Load += new System.EventHandler(this.ConfigCameraStab_Load); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.presenterBindingSource)).EndInit(); diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigCameraStab.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigCameraStab.cs index ca3a0f5cfc..3c03d48102 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigCameraStab.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigCameraStab.cs @@ -10,7 +10,7 @@ using Transitions; namespace ArdupilotMega.GCSViews.ConfigurationView { - public partial class ConfigCameraStab : BackStageViewContentPanel + public partial class ConfigCameraStab : UserControl, IActivate { private ConfigCameraStabPresenter _presenter; private Transition[] _ErrorTransition; @@ -23,7 +23,7 @@ namespace ArdupilotMega.GCSViews.ConfigurationView LBL_Error.Opacity = 0.0F; } - private void ConfigCameraStab_Load(object sender, EventArgs ev) + public void Activate() { _presenter = new ConfigCameraStabPresenter(MainV2.comPort); presenterBindingSource.DataSource = _presenter; diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFlightModes.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFlightModes.Designer.cs index 23b51bcdcb..137f3e145b 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFlightModes.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFlightModes.Designer.cs @@ -279,7 +279,6 @@ this.Controls.Add(this.CMB_fmode1); this.Controls.Add(this.BUT_SaveModes); this.Name = "ConfigFlightModes"; - this.Load += new System.EventHandler(this.ConfigFlightModes_Load); ((System.ComponentModel.ISupportInitialize)(this.currentStateBindingSource)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFlightModes.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFlightModes.cs index fb8ba958ff..7f4cf09bda 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFlightModes.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFlightModes.cs @@ -12,7 +12,7 @@ using ArdupilotMega.Controls; namespace ArdupilotMega.GCSViews.ConfigurationView { - public partial class ConfigFlightModes : BackStageViewContentPanel + public partial class ConfigFlightModes : UserControl, IActivate, IDeactivate { Timer timer = new Timer(); @@ -124,18 +124,13 @@ namespace ArdupilotMega.GCSViews.ConfigurationView Simple6 = 32, } - private void ConfigFlightModes_Load(object sender, EventArgs e) + public void Deactivate() { - if (!MainV2.comPort.BaseStream.IsOpen) - { - this.Enabled = false; - return; - } - else - { - this.Enabled = true; - } + timer.Stop(); + } + public void Activate() + { if (MainV2.cs.firmware == MainV2.Firmwares.ArduPlane) // APM { CB_simple1.Visible = false; diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFriendlyParams.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFriendlyParams.Designer.cs index 444a62e31a..f3dfda34d4 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFriendlyParams.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFriendlyParams.Designer.cs @@ -79,7 +79,6 @@ this.Controls.Add(this.tableLayoutPanel1); this.Name = "ConfigFriendlyParams"; this.Size = new System.Drawing.Size(673, 177); - this.Load += new System.EventHandler(this.ConfigRawParamsV2_Load); this.ResumeLayout(false); } diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFriendlyParams.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFriendlyParams.cs index 050eebb298..aa9518f602 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFriendlyParams.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigFriendlyParams.cs @@ -14,7 +14,7 @@ using log4net; namespace ArdupilotMega.GCSViews.ConfigurationView { - public partial class ConfigFriendlyParams : BackStageViewContentPanel + public partial class ConfigFriendlyParams : UserControl, IActivate { #region Class Fields @@ -130,7 +130,7 @@ namespace ArdupilotMega.GCSViews.ConfigurationView /// /// The source of the event. /// The instance containing the event data. - protected void ConfigRawParamsV2_Load(object sender, EventArgs e) + public void Activate() { BindParamList(); } @@ -297,6 +297,8 @@ namespace ArdupilotMega.GCSViews.ConfigurationView catch (Exception ex) { log.Error(ex); } } }); + + ThemeManager.ApplyThemeTo(this); } /// diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigHardwareOptions.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigHardwareOptions.Designer.cs index fa7ac3e81e..474d57dc7d 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigHardwareOptions.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigHardwareOptions.Designer.cs @@ -191,7 +191,6 @@ this.Controls.Add(this.pictureBox3); this.Controls.Add(this.pictureBox1); this.Name = "ConfigHardwareOptions"; - this.Load += new System.EventHandler(this.ConfigHardwareOptions_Load); ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigHardwareOptions.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigHardwareOptions.cs index 4355da48d6..2afd0b7de5 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigHardwareOptions.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigHardwareOptions.cs @@ -11,7 +11,7 @@ using ArdupilotMega.Controls; namespace ArdupilotMega.GCSViews.ConfigurationView { - public partial class ConfigHardwareOptions : BackStageViewContentPanel + public partial class ConfigHardwareOptions : UserControl, IActivate { bool startup = false; @@ -233,7 +233,7 @@ namespace ArdupilotMega.GCSViews.ConfigurationView catch { CustomMessageBox.Show("Set SONAR_TYPE Failed"); } } - private void ConfigHardwareOptions_Load(object sender, EventArgs e) + public void Activate() { if (!MainV2.comPort.BaseStream.IsOpen) { diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigPlanner.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigPlanner.cs index 7f764f6ef8..642f93887b 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigPlanner.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigPlanner.cs @@ -16,10 +16,10 @@ using System.Threading; namespace ArdupilotMega.GCSViews.ConfigurationView { - public partial class ConfigPlanner : BackStageViewContentPanel + public partial class ConfigPlanner : UserControl, IActivate { private bool startup = false; - List languages = new List(); + private List _languages; public class GCSBitmapInfo { @@ -422,104 +422,12 @@ namespace ArdupilotMega.GCSViews.ConfigurationView MainV2.config["CHK_GDIPlus"] = CHK_GDIPlus.Checked.ToString(); } + // This load handler now only contains code that should execute once + // on start up. See Activate() for the remainder private void ConfigPlanner_Load(object sender, EventArgs e) { startup = true; - // setup up camera button states - if (MainV2.cam != null) - { - BUT_videostart.Enabled = false; - CHK_hudshow.Checked = GCSViews.FlightData.myhud.hudon; - } - else - { - BUT_videostart.Enabled = true; - } - - // setup speech states - if (MainV2.config["speechenable"] != null) - CHK_enablespeech.Checked = bool.Parse(MainV2.config["speechenable"].ToString()); - if (MainV2.config["speechwaypointenabled"] != null) - CHK_speechwaypoint.Checked = bool.Parse(MainV2.config["speechwaypointenabled"].ToString()); - if (MainV2.config["speechmodeenabled"] != null) - CHK_speechmode.Checked = bool.Parse(MainV2.config["speechmodeenabled"].ToString()); - if (MainV2.config["speechcustomenabled"] != null) - CHK_speechcustom.Checked = bool.Parse(MainV2.config["speechcustomenabled"].ToString()); - if (MainV2.config["speechbatteryenabled"] != null) - CHK_speechbattery.Checked = bool.Parse(MainV2.config["speechbatteryenabled"].ToString()); - if (MainV2.config["speechaltenabled"] != null) - CHK_speechaltwarning.Checked = bool.Parse(MainV2.config["speechaltenabled"].ToString()); - - // this can't fail because it set at startup - NUM_tracklength.Value = int.Parse(MainV2.config["NUM_tracklength"].ToString()); - - // get wps on connect - if (MainV2.config["loadwpsonconnect"] != null) - CHK_loadwponconnect.Checked = bool.Parse(MainV2.config["loadwpsonconnect"].ToString()); - - // setup other config state - if (MainV2.config["CHK_resetapmonconnect"] != null) - CHK_resetapmonconnect.Checked = bool.Parse(MainV2.config["CHK_resetapmonconnect"].ToString()); - - CMB_rateattitude.Text = MainV2.cs.rateattitude.ToString(); - CMB_rateposition.Text = MainV2.cs.rateposition.ToString(); - CMB_raterc.Text = MainV2.cs.raterc.ToString(); - CMB_ratestatus.Text = MainV2.cs.ratestatus.ToString(); - CMB_ratesensors.Text = MainV2.cs.ratesensors.ToString(); - - - if (MainV2.config["CHK_GDIPlus"] != null) - CHK_GDIPlus.Checked = bool.Parse(MainV2.config["CHK_GDIPlus"].ToString()); - - if (MainV2.config["CHK_maprotation"] != null) - CHK_maprotation.Checked = bool.Parse(MainV2.config["CHK_maprotation"].ToString()); - - //set hud color state - string hudcolor = (string)MainV2.config["hudcolor"]; - - CMB_osdcolor.DataSource = Enum.GetNames(typeof(KnownColor)); - if (hudcolor != null) - { - int index = CMB_osdcolor.Items.IndexOf(hudcolor); - CMB_osdcolor.SelectedIndex = index; - } - else - { - int index = CMB_osdcolor.Items.IndexOf("White"); - CMB_osdcolor.SelectedIndex = index; - } - - // set distance/speed unit states - CMB_distunits.DataSource = Enum.GetNames(typeof(Common.distances)); - CMB_speedunits.DataSource = Enum.GetNames(typeof(Common.speeds)); - - if (MainV2.config["distunits"] != null) - CMB_distunits.Text = MainV2.config["distunits"].ToString(); - if (MainV2.config["speedunits"] != null) - CMB_speedunits.Text = MainV2.config["speedunits"].ToString(); - - // setup language selection - CultureInfo ci = null; - foreach (string name in new string[] { "en-US", "zh-Hans", "zh-TW", "ru-RU", "Fr", "Pl", "it-IT", "es-ES" }) - { - ci = CultureInfoEx.GetCultureInfo(name); - if (ci != null) - languages.Add(ci); - } - - CMB_language.DisplayMember = "DisplayName"; - CMB_language.DataSource = languages; - ci = Thread.CurrentThread.CurrentUICulture; - for (int i = 0; i < languages.Count; i++) - { - if (ci.IsChildOf(languages[i])) - { - CMB_language.SelectedIndex = i; - break; - } - } - //CMB_language.SelectedIndexChanged += CMB_language_SelectedIndexChanged; startup = false; } @@ -571,5 +479,94 @@ namespace ArdupilotMega.GCSViews.ConfigurationView return; MainV2.config["CHK_maprotation"] = CHK_maprotation.Checked.ToString(); } + // Called every time that this control is made current in the backstage view + public void Activate() + { + startup = true; // flag to ignore changes while we programatically populate controls + + + CMB_osdcolor.DataSource = Enum.GetNames(typeof(KnownColor)); + + // set distance/speed unit states + CMB_distunits.DataSource = Enum.GetNames(typeof(Common.distances)); + CMB_speedunits.DataSource = Enum.GetNames(typeof(Common.speeds)); + + // setup language selection + var cultureCodes = new[] { "en-US", "zh-Hans", "zh-TW", "ru-RU", "Fr", "Pl", "it-IT", "es-ES" }; + + _languages = cultureCodes + .Select(CultureInfoEx.GetCultureInfo) + .Where(c => c != null) + .ToList(); + + CMB_language.DisplayMember = "DisplayName"; + CMB_language.DataSource = _languages; + var currentUiCulture = Thread.CurrentThread.CurrentUICulture; + + for (int i = 0; i < _languages.Count; i++) + { + if (currentUiCulture.IsChildOf(_languages[i])) + { + CMB_language.SelectedIndex = i; + break; + } + } + + // setup up camera button states + if (MainV2.cam != null) + { + BUT_videostart.Enabled = false; + CHK_hudshow.Checked = GCSViews.FlightData.myhud.hudon; + } + else + { + BUT_videostart.Enabled = true; + } + + // setup speech states + SetCheckboxFromConfig("speechenable", CHK_enablespeech); + SetCheckboxFromConfig("speechwaypointenabled", CHK_speechwaypoint); + SetCheckboxFromConfig("speechmodeenabled", CHK_speechmode); + SetCheckboxFromConfig("speechcustomenabled", CHK_speechcustom); + SetCheckboxFromConfig("speechbatteryenabled", CHK_speechbattery); + SetCheckboxFromConfig("speechaltenabled", CHK_speechaltwarning); + + // this can't fail because it set at startup + NUM_tracklength.Value = int.Parse(MainV2.config["NUM_tracklength"].ToString()); + + // get wps on connect + SetCheckboxFromConfig("loadwpsonconnect", CHK_loadwponconnect); + + // setup other config state + SetCheckboxFromConfig("CHK_resetapmonconnect", CHK_resetapmonconnect); + + CMB_rateattitude.Text = MainV2.cs.rateattitude.ToString(); + CMB_rateposition.Text = MainV2.cs.rateposition.ToString(); + CMB_raterc.Text = MainV2.cs.raterc.ToString(); + CMB_ratestatus.Text = MainV2.cs.ratestatus.ToString(); + CMB_ratesensors.Text = MainV2.cs.ratesensors.ToString(); + + SetCheckboxFromConfig("CHK_GDIPlus", CHK_GDIPlus); + SetCheckboxFromConfig("CHK_maprotation", CHK_maprotation); + + //set hud color state + string hudcolor = (string)MainV2.config["hudcolor"]; + int index = CMB_osdcolor.Items.IndexOf(hudcolor ?? "White"); + CMB_osdcolor.SelectedIndex = index; + + + if (MainV2.config["distunits"] != null) + CMB_distunits.Text = MainV2.config["distunits"].ToString(); + if (MainV2.config["speedunits"] != null) + CMB_speedunits.Text = MainV2.config["speedunits"].ToString(); + } + + + + private static void SetCheckboxFromConfig(string configKey, CheckBox chk) + { + if (MainV2.config[configKey] != null) + chk.Checked = bool.Parse(MainV2.config[configKey].ToString()); + } } } diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRadioInput.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRadioInput.Designer.cs index e3109a7abc..0cddec28b3 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRadioInput.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRadioInput.Designer.cs @@ -269,7 +269,6 @@ this.Controls.Add(this.BARyaw); this.Controls.Add(this.BARroll); this.Name = "ConfigRadioInput"; - this.Load += new System.EventHandler(this.ConfigRadioInput_Load); this.groupBoxElevons.ResumeLayout(false); this.groupBoxElevons.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.currentStateBindingSource)).EndInit(); diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRadioInput.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRadioInput.cs index dd659eaa35..e09399c222 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRadioInput.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRadioInput.cs @@ -11,7 +11,7 @@ using ArdupilotMega.Controls; namespace ArdupilotMega.GCSViews.ConfigurationView { - public partial class ConfigRadioInput : BackStageViewContentPanel + public partial class ConfigRadioInput : UserControl, IActivate, IDeactivate { bool startup = false; bool run = false; @@ -36,10 +36,11 @@ namespace ArdupilotMega.GCSViews.ConfigurationView // setup rc update timer.Tick += new EventHandler(timer_Tick); + } - timer.Enabled = true; - timer.Interval = 100; - timer.Start(); + public void Deactivate() + { + timer.Stop(); } void timer_Tick(object sender, EventArgs e) @@ -52,17 +53,11 @@ namespace ArdupilotMega.GCSViews.ConfigurationView catch { } } - private void ConfigRadioInput_Load(object sender, EventArgs e) + public void Activate() { - if (!MainV2.comPort.BaseStream.IsOpen) - { - this.Enabled = false; - return; - } - else - { - this.Enabled = true; - } + timer.Enabled = true; + timer.Interval = 100; + timer.Start(); startup = true; diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRawParams.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRawParams.Designer.cs index 6b072f30bf..21aab51f67 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRawParams.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRawParams.Designer.cs @@ -151,7 +151,6 @@ this.Controls.Add(this.BUT_load); this.Controls.Add(this.Params); this.Name = "ConfigRawParams"; - this.Load += new System.EventHandler(this.ConfigRawParams_Load); ((System.ComponentModel.ISupportInitialize)(this.Params)).EndInit(); this.ResumeLayout(false); diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRawParams.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRawParams.cs index 7c7cb95e0e..df10f0b4b6 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRawParams.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRawParams.cs @@ -11,7 +11,7 @@ using ArdupilotMega.Controls.BackstageView; namespace ArdupilotMega.GCSViews.ConfigurationView { - public partial class ConfigRawParams : BackStageViewContentPanel + public partial class ConfigRawParams : UserControl, IActivate { private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); @@ -424,7 +424,7 @@ namespace ArdupilotMega.GCSViews.ConfigurationView Params.Sort(Params.Columns[0], ListSortDirection.Ascending); } - private void ConfigRawParams_Load(object sender, EventArgs e) + public void Activate() { // read tooltips if (tooltips.Count == 0) diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigTradHeli.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigTradHeli.Designer.cs index 1b8df59419..ed9e82af79 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigTradHeli.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigTradHeli.Designer.cs @@ -685,8 +685,6 @@ this.Controls.Add(this.HS3); this.Controls.Add(this.Gservoloc); this.Name = "ConfigTradHeli"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ConfigTradHeli_FormClosing); - this.Load += new System.EventHandler(this.ConfigTradHeli_Load); this.groupBox5.ResumeLayout(false); this.groupBox5.PerformLayout(); this.groupBox3.ResumeLayout(false); diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigTradHeli.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigTradHeli.cs index 6f99332ff1..1c806247fb 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigTradHeli.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigTradHeli.cs @@ -11,7 +11,7 @@ using ArdupilotMega.Controls; namespace ArdupilotMega.GCSViews.ConfigurationView { - public partial class ConfigTradHeli : BackStageViewContentPanel + public partial class ConfigTradHeli : UserControl, IActivate, IDeactivate { bool startup = false; bool inpwmdetect = false; @@ -368,17 +368,8 @@ namespace ArdupilotMega.GCSViews.ConfigurationView MainV2.comPort.setParam(((CheckBox)sender).Name, ((CheckBox)sender).Checked == true ? 1.0f : 0.0f); } - private void ConfigTradHeli_Load(object sender, EventArgs e) + public void Activate() { - if (!MainV2.comPort.BaseStream.IsOpen) - { - this.Enabled = false; - return; - } - else - { - this.Enabled = true; - } if (MainV2.comPort.param["H_GYR_ENABLE"] == null) { @@ -487,8 +478,10 @@ namespace ArdupilotMega.GCSViews.ConfigurationView } } - private void ConfigTradHeli_FormClosing(object sender, FormClosingEventArgs e) + public void Deactivate() { + timer.Stop(); + startup = true; } } diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/Setup.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/Setup.cs index 602e7bce28..ccafe8a643 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/Setup.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/Setup.cs @@ -25,18 +25,22 @@ namespace ArdupilotMega.GCSViews.ConfigurationView if (MainV2.comPort.BaseStream.IsOpen) { AddPagesForConnectedState(); + // backstageView.AddSpacer(20); } // These pages work when not connected to an APM AddBackstageViewPage(new ArdupilotMega._3DRradio(), "3DR Radio"); AddBackstageViewPage(new ArdupilotMega.Antenna.Tracker(), "Antenna Tracker"); +//backstageView.AddSpacer(15); AddBackstageViewPage(new ConfigPlanner(), "Planner"); this.backstageView.ActivatePage(backstageView.Pages[0]); if (!MainV2.comPort.BaseStream.IsOpen) { - Common.MessageShowAgain("Config Connect", "Please connect (click Connect Button) before using setup!!"); + ThemeManager.ApplyThemeTo(this); + Common.MessageShowAgain("Config Connect", @"Please connect (click Connect Button) before using setup. +If you are just setting up 3DR radios, you may continue without connecting."); } } @@ -61,8 +65,7 @@ namespace ArdupilotMega.GCSViews.ConfigurationView AddBackstageViewPage(new ConfigTradHeli(), "Heli Setup"); - var configpanel = new Controls.ConfigPanel(); - configpanel.LoadXML("ArduCopterConfig.xml"); + var configpanel = new Controls.ConfigPanel(Application.StartupPath + System.IO.Path.DirectorySeparatorChar + "ArduCopterConfig.xml"); AddBackstageViewPage(configpanel, "ArduCopter Pids"); AddBackstageViewPage(new ConfigArducopter(), "ArduCopter Config"); @@ -74,8 +77,7 @@ namespace ArdupilotMega.GCSViews.ConfigurationView AddBackstageViewPage(new ConfigAccelerometerCalibrationQuad(), "ArduCopter Level"); - var configpanel = new Controls.ConfigPanel(); - configpanel.LoadXML("ArduCopterConfig.xml"); + var configpanel = new Controls.ConfigPanel(Application.StartupPath + System.IO.Path.DirectorySeparatorChar + "ArduCopterConfig.xml"); AddBackstageViewPage(configpanel, "ArduCopter Pids"); AddBackstageViewPage(new ConfigArducopter(), "ArduCopter Config"); @@ -99,9 +101,9 @@ namespace ArdupilotMega.GCSViews.ConfigurationView AddBackstageViewPage(new ConfigRawParams(), "Parameter List"); } - private void AddBackstageViewPage(BackStageViewContentPanel userControl, string headerText) + private void AddBackstageViewPage(UserControl userControl, string headerText) { - backstageView.AddPage(new BackstageView.BackstageViewPage(userControl, headerText)); + backstageView.AddPage(userControl, headerText); } diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/FlightData.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/FlightData.Designer.cs index f86424e8cb..25f4a81c19 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/FlightData.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/FlightData.Designer.cs @@ -1161,6 +1161,7 @@ this.Controls.Add(this.label6); this.MinimumSize = new System.Drawing.Size(1008, 461); this.Name = "FlightData"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FlightData_FormClosing); this.Load += new System.EventHandler(this.FlightData_Load); this.Resize += new System.EventHandler(this.FlightData_Resize); this.ParentChanged += new System.EventHandler(this.FlightData_ParentChanged); diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/FlightData.cs b/Tools/ArdupilotMegaPlanner/GCSViews/FlightData.cs index 0e3be7e4ae..335627742c 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/FlightData.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/FlightData.cs @@ -18,13 +18,14 @@ using ZedGraph; // Graphs using System.Drawing.Drawing2D; using ArdupilotMega.Controls; using ArdupilotMega.Utilities; +using ArdupilotMega.Controls.BackstageView; // written by michael oborne namespace ArdupilotMega.GCSViews { - partial class FlightData : MyUserControl + partial class FlightData : MyUserControl, IActivate, IDeactivate { - ArdupilotMega.IMAVLink comPort = MainV2.comPort; + ArdupilotMega.MAVLink comPort = MainV2.comPort; public static int threadrun = 0; StreamWriter swlog; int tickStart = 0; @@ -196,6 +197,22 @@ namespace ArdupilotMega.GCSViews catch { } } + public void Activate() + { + if (CB_tuning.Checked) + ZedGraphTimer.Start(); + + // SubMainLeft.Panel1.Controls.Clear(); + // SubMainLeft.Panel1.Controls.Add(hud1); + } + + public void Deactivate() + { + //SubMainLeft.Panel1.Controls.Remove(hud1); + hud1.Size = new System.Drawing.Size(0, 0); + ZedGraphTimer.Stop(); + } + void tabControl1_DrawItem(object sender, DrawItemEventArgs e) { // Draw the background of the ListBox control for each item. @@ -223,8 +240,6 @@ namespace ArdupilotMega.GCSViews private void FlightData_Load(object sender, EventArgs e) { - MainV2.bs = bindingSource1; - System.Threading.Thread t11 = new System.Threading.Thread(new System.Threading.ThreadStart(mainloop)) { IsBackground = true, @@ -255,6 +270,8 @@ namespace ArdupilotMega.GCSViews DateTime tunning = DateTime.Now.AddSeconds(0); + DateTime mapupdate = DateTime.Now.AddSeconds(0); + DateTime vidrec = DateTime.Now.AddSeconds(0); DateTime waypoints = DateTime.Now.AddSeconds(0); @@ -319,8 +336,6 @@ namespace ArdupilotMega.GCSViews updatePlayPauseButton(true); - MainV2.comPort.setAPType(); - if (comPort.BaseStream.IsOpen) { MainV2.comPort.logreadmode = false; @@ -429,45 +444,51 @@ namespace ArdupilotMega.GCSViews setMapBearing(); } + if (route == null) + { + route = new GMapRoute(trackPoints, "track"); + routes.Routes.Add(route); + } + + PointLatLng currentloc = new PointLatLng(MainV2.cs.lat, MainV2.cs.lng); + gMapControl1.HoldInvalidation = true; + int cnt = 0; + while (gMapControl1.inOnPaint == true) { System.Threading.Thread.Sleep(1); + cnt++; } - - if (trackPoints.Count > int.Parse(MainV2.config["NUM_tracklength"].ToString())) + + if (route.Points.Count > int.Parse(MainV2.config["NUM_tracklength"].ToString())) { - trackPoints.RemoveRange(0, trackPoints.Count - int.Parse(MainV2.config["NUM_tracklength"].ToString())); + // trackPoints.RemoveRange(0, trackPoints.Count - int.Parse(MainV2.config["NUM_tracklength"].ToString())); + route.Points.RemoveRange(0, route.Points.Count - int.Parse(MainV2.config["NUM_tracklength"].ToString())); } if (MainV2.cs.lat != 0) - trackPoints.Add(new PointLatLng(MainV2.cs.lat, MainV2.cs.lng)); + { + // trackPoints.Add(currentloc); + route.Points.Add(currentloc); + } // if (CB_tuning.Checked == false) // draw if in view { - if (MainV2.comPort.logreadmode && MainV2.comPort.logplaybackfile != null) - { - // this is for the pulled wp list from a mavlink logfile - FlightPlanner.pointlist.Clear(); - FlightPlanner.pointlist.AddRange(MainV2.comPort.wps); - } - - while (gMapControl1.inOnPaint == true) { System.Threading.Thread.Sleep(1); } - updateClearRoutes(); - - route = new GMapRoute(trackPoints, "track"); + //route = new GMapRoute(route.Points, "track"); //track.Stroke = Pens.Red; //route.Stroke = new Pen(Color.FromArgb(144, Color.Red)); //route.Stroke.Width = 5; //route.Tag = "track"; + routes.Routes.Clear(); routes.Routes.Add(route); if (waypoints.AddSeconds(10) < DateTime.Now) @@ -475,6 +496,12 @@ namespace ArdupilotMega.GCSViews //Console.WriteLine("Doing FD WP's"); polygons.Markers.Clear(); + if (MainV2.comPort.logreadmode && MainV2.comPort.logplaybackfile != null) + { + FlightPlanner.pointlist.Clear(); + FlightPlanner.pointlist.AddRange(MainV2.comPort.wps); + } + foreach (PointLatLngAlt plla in FlightPlanner.pointlist) { if (plla == null || plla.Lng == 0 || plla.Lat == 0) @@ -494,29 +521,35 @@ namespace ArdupilotMega.GCSViews //routes.Polygons.Add(poly); - if (trackPoints.Count > 0) + if (route.Points.Count > 0) { - PointLatLng currentloc = new PointLatLng(MainV2.cs.lat, MainV2.cs.lng); + // add primary route icon + if (routes.Markers.Count != 1) + { + routes.Markers.Clear(); + routes.Markers.Add( new GMapMarkerCross(currentloc)); + } if (MainV2.cs.firmware == MainV2.Firmwares.ArduPlane) { - routes.Markers.Add(new GMapMarkerPlane(currentloc, MainV2.cs.yaw, MainV2.cs.groundcourse, MainV2.cs.nav_bearing, MainV2.cs.target_bearing, gMapControl1)); + routes.Markers[0] = (new GMapMarkerPlane(currentloc, MainV2.cs.yaw, MainV2.cs.groundcourse, MainV2.cs.nav_bearing, MainV2.cs.target_bearing, gMapControl1)); } else if (MainV2.cs.firmware == MainV2.Firmwares.ArduRover) { - routes.Markers.Add(new GMapMarkerRover(currentloc, MainV2.cs.yaw, MainV2.cs.groundcourse, MainV2.cs.nav_bearing, MainV2.cs.target_bearing, gMapControl1)); + routes.Markers[0] = (new GMapMarkerRover(currentloc, MainV2.cs.yaw, MainV2.cs.groundcourse, MainV2.cs.nav_bearing, MainV2.cs.target_bearing, gMapControl1)); } else { - routes.Markers.Add(new GMapMarkerQuad(currentloc, MainV2.cs.yaw, MainV2.cs.groundcourse, MainV2.cs.nav_bearing)); + routes.Markers[0] = (new GMapMarkerQuad(currentloc, MainV2.cs.yaw, MainV2.cs.groundcourse, MainV2.cs.nav_bearing)); } - if (trackPoints[trackPoints.Count - 1].Lat != 0 && (DateTime.Now.Second % 4 == 0) && CHK_autopan.Checked) + if (route.Points[route.Points.Count - 1].Lat != 0 && (mapupdate.AddSeconds(3) < DateTime.Now) && CHK_autopan.Checked) { updateMapPosition(currentloc); + mapupdate = DateTime.Now; } - if (trackPoints.Count == 1 && gMapControl1.Zoom == 3) // 3 is the default load zoom + if (route.Points.Count == 1 && gMapControl1.Zoom == 3) // 3 is the default load zoom { updateMapPosition(currentloc); updateMapZoom(17); @@ -539,28 +572,19 @@ namespace ArdupilotMega.GCSViews private void setMapBearing() { - this.Invoke((System.Windows.Forms.MethodInvoker)delegate() + this.BeginInvoke((System.Windows.Forms.MethodInvoker)delegate() { gMapControl1.Bearing = (int)MainV2.cs.yaw; }); } - - // to prevent cross thread calls while in a draw and exception - private void updateClearRoutes() - { - // not async - this.Invoke((System.Windows.Forms.MethodInvoker)delegate() - { - routes.Markers.Clear(); - routes.Routes.Clear(); - }); - } - private void updatePlayPauseButton(bool playing) { if (playing) { + if (BUT_playlog.Text == "Pause") + return; + this.BeginInvoke((System.Windows.Forms.MethodInvoker)delegate() { try @@ -626,9 +650,10 @@ namespace ArdupilotMega.GCSViews { try { - tracklog.Value = (int)(MainV2.comPort.logplaybackfile.BaseStream.Position / (double)MainV2.comPort.logplaybackfile.BaseStream.Length * 100); - - lbl_logpercent.Text = (MainV2.comPort.logplaybackfile.BaseStream.Position / (double)MainV2.comPort.logplaybackfile.BaseStream.Length).ToString("0.00%"); + if (tracklog.Visible) + tracklog.Value = (int)(MainV2.comPort.logplaybackfile.BaseStream.Position / (double)MainV2.comPort.logplaybackfile.BaseStream.Length * 100); + if (lbl_logpercent.Visible) + lbl_logpercent.Text = (MainV2.comPort.logplaybackfile.BaseStream.Position / (double)MainV2.comPort.logplaybackfile.BaseStream.Length).ToString("0.00%"); } catch { } }); @@ -806,15 +831,20 @@ namespace ArdupilotMega.GCSViews { ZedGraphTimer.Stop(); threadrun = 0; - if (comPort.BaseStream.IsOpen) + try { - comPort.Close(); + if (comPort.BaseStream.IsOpen) + { + comPort.Close(); + } } + catch { } } private void BUT_clear_track_Click(object sender, EventArgs e) { - trackPoints.Clear(); + if (route !=null) + route.Points.Clear(); } private void BUT_save_log_Click(object sender, EventArgs e) @@ -1349,7 +1379,7 @@ namespace ArdupilotMega.GCSViews foreach (Control temp in tabStatus.Controls) { - temp.DataBindings.Clear(); + // temp.DataBindings.Clear(); //temp.Dispose(); } //tabStatus.Controls.Clear(); @@ -1387,10 +1417,14 @@ namespace ArdupilotMega.GCSViews } catch { } + if (add) + { + lbl1.Location = new Point(x, y); lbl1.Size = new System.Drawing.Size(75, 13); lbl1.Text = field.Name; lbl1.Name = field.Name; + lbl1.Visible = true; lbl2.AutoSize = false; lbl2.Location = new Point(lbl1.Right + 5, y); @@ -1398,10 +1432,10 @@ namespace ArdupilotMega.GCSViews //if (lbl2.Name == "") lbl2.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bindingSource1, field.Name, true, System.Windows.Forms.DataSourceUpdateMode.OnValidation, "")); lbl2.Name = field.Name + "value"; + lbl2.Visible = true; //lbl2.Text = fieldValue.ToString(); - if (add) - { + tabStatus.Controls.Add(lbl1); tabStatus.Controls.Add(lbl2); } @@ -1426,7 +1460,9 @@ namespace ArdupilotMega.GCSViews { foreach (Control temp in tabStatus.Controls) { - temp.DataBindings.Clear(); + // temp.DataBindings.Clear(); + // temp.Dispose(); + // tabStatus.Controls.Remove(temp); } } } @@ -1903,5 +1939,6 @@ print 'Roll complete' { hud1.batteryon = !hud1.batteryon; } + } } \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/FlightData.resx b/Tools/ArdupilotMegaPlanner/GCSViews/FlightData.resx index 245f70bf34..dffd414437 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/FlightData.resx +++ b/Tools/ArdupilotMegaPlanner/GCSViews/FlightData.resx @@ -226,7 +226,7 @@ hud1 - ArdupilotMega.Controls.HUD, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.HUD, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null SubMainLeft.Panel1 @@ -265,7 +265,7 @@ BUT_script - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabActions @@ -298,7 +298,7 @@ BUT_joystick - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabActions @@ -328,7 +328,7 @@ BUT_quickmanual - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabActions @@ -358,7 +358,7 @@ BUT_quickrtl - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabActions @@ -388,7 +388,7 @@ BUT_quickauto - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabActions @@ -442,7 +442,7 @@ BUT_setwp - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabActions @@ -493,7 +493,7 @@ BUT_setmode - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabActions @@ -523,7 +523,7 @@ BUT_clear_track - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabActions @@ -574,7 +574,7 @@ BUT_Homealt - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabActions @@ -604,7 +604,7 @@ BUT_RAWSensor - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabActions @@ -634,7 +634,7 @@ BUTrestartmission - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabActions @@ -664,7 +664,7 @@ BUTactiondo - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabActions @@ -718,7 +718,7 @@ Gvspeed - AGaugeApp.AGauge, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + AGaugeApp.AGauge, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabGauges @@ -748,7 +748,7 @@ Gheading - ArdupilotMega.Controls.HSI, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.HSI, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabGauges @@ -778,7 +778,7 @@ Galt - AGaugeApp.AGauge, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + AGaugeApp.AGauge, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabGauges @@ -811,7 +811,7 @@ Gspeed - AGaugeApp.AGauge, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + AGaugeApp.AGauge, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabGauges @@ -895,7 +895,7 @@ lbl_playbackspeed - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabTLogs @@ -922,7 +922,7 @@ lbl_logpercent - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabTLogs @@ -949,7 +949,7 @@ NUM_playbackspeed - ArdupilotMega.Controls.MyTrackBar, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyTrackBar, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabTLogs @@ -976,7 +976,7 @@ BUT_log2kml - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabTLogs @@ -1030,7 +1030,7 @@ BUT_playlog - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabTLogs @@ -1057,7 +1057,7 @@ BUT_loadtelem - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null tabTLogs @@ -1246,7 +1246,7 @@ lbl_hdop - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null splitContainer1.Panel2 @@ -1279,7 +1279,7 @@ lbl_sats - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null splitContainer1.Panel2 @@ -1309,7 +1309,7 @@ lbl_winddir - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null splitContainer1.Panel2 @@ -1339,7 +1339,7 @@ lbl_windvel - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null splitContainer1.Panel2 @@ -1511,7 +1511,7 @@ gMapControl1 - ArdupilotMega.Controls.myGMAP, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.myGMAP, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null splitContainer1.Panel2 @@ -1574,7 +1574,7 @@ TXT_lat - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null panel1 @@ -1631,7 +1631,7 @@ label1 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null panel1 @@ -1661,7 +1661,7 @@ TXT_long - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null panel1 @@ -1691,7 +1691,7 @@ TXT_alt - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null panel1 @@ -1892,7 +1892,7 @@ label6 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null $this @@ -1988,6 +1988,6 @@ FlightData - System.Windows.Forms.MyUserControl, ArdupilotMegaPlanner10, Version=1.1.4580.38577, Culture=neutral, PublicKeyToken=null + System.Windows.Forms.MyUserControl, ArdupilotMegaPlanner10, Version=1.1.4585.31842, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/FlightPlanner.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/FlightPlanner.Designer.cs index 6cfcf061af..9a16bdec80 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/FlightPlanner.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/FlightPlanner.Designer.cs @@ -111,13 +111,13 @@ this.jumpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.jumpstartToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.jumpwPToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.createWpCircleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.ContextMeasure = new System.Windows.Forms.ToolStripMenuItem(); this.rotateMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.polygonToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.addPolygonPointToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.clearPolygonToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.clearMissionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.geoFenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); @@ -126,6 +126,7 @@ this.setReturnLocationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.loadFromFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveToFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.clearMissionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.trackBar1 = new ArdupilotMega.Controls.MyTrackBar(); this.label11 = new System.Windows.Forms.Label(); this.panelBASE = new System.Windows.Forms.Panel(); @@ -721,12 +722,13 @@ this.deleteWPToolStripMenuItem, this.loiterToolStripMenuItem, this.jumpToolStripMenuItem, + this.createWpCircleToolStripMenuItem, this.toolStripSeparator1, this.ContextMeasure, this.rotateMapToolStripMenuItem, this.polygonToolStripMenuItem, - this.clearMissionToolStripMenuItem, - this.geoFenceToolStripMenuItem}); + this.geoFenceToolStripMenuItem, + this.clearMissionToolStripMenuItem}); this.contextMenuStrip1.Name = "contextMenuStrip1"; resources.ApplyResources(this.contextMenuStrip1, "contextMenuStrip1"); // @@ -783,6 +785,12 @@ resources.ApplyResources(this.jumpwPToolStripMenuItem, "jumpwPToolStripMenuItem"); this.jumpwPToolStripMenuItem.Click += new System.EventHandler(this.jumpwPToolStripMenuItem_Click); // + // createWpCircleToolStripMenuItem + // + this.createWpCircleToolStripMenuItem.Name = "createWpCircleToolStripMenuItem"; + resources.ApplyResources(this.createWpCircleToolStripMenuItem, "createWpCircleToolStripMenuItem"); + this.createWpCircleToolStripMenuItem.Click += new System.EventHandler(this.createWpCircleToolStripMenuItem_Click); + // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; @@ -820,12 +828,6 @@ resources.ApplyResources(this.clearPolygonToolStripMenuItem, "clearPolygonToolStripMenuItem"); this.clearPolygonToolStripMenuItem.Click += new System.EventHandler(this.clearPolygonToolStripMenuItem_Click); // - // clearMissionToolStripMenuItem - // - this.clearMissionToolStripMenuItem.Name = "clearMissionToolStripMenuItem"; - resources.ApplyResources(this.clearMissionToolStripMenuItem, "clearMissionToolStripMenuItem"); - this.clearMissionToolStripMenuItem.Click += new System.EventHandler(this.clearMissionToolStripMenuItem_Click); - // // geoFenceToolStripMenuItem // this.geoFenceToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -879,6 +881,12 @@ resources.ApplyResources(this.saveToFileToolStripMenuItem, "saveToFileToolStripMenuItem"); this.saveToFileToolStripMenuItem.Click += new System.EventHandler(this.saveToFileToolStripMenuItem_Click); // + // clearMissionToolStripMenuItem + // + this.clearMissionToolStripMenuItem.Name = "clearMissionToolStripMenuItem"; + resources.ApplyResources(this.clearMissionToolStripMenuItem, "clearMissionToolStripMenuItem"); + this.clearMissionToolStripMenuItem.Click += new System.EventHandler(this.clearMissionToolStripMenuItem_Click); + // // trackBar1 // resources.ApplyResources(this.trackBar1, "trackBar1"); @@ -911,7 +919,6 @@ // // timer1 // - this.timer1.Enabled = true; this.timer1.Interval = 1000; this.timer1.Tick += new System.EventHandler(this.timer1_Tick); // @@ -923,6 +930,7 @@ this.Controls.Add(this.panelBASE); this.MinimumSize = new System.Drawing.Size(1008, 461); this.Name = "FlightPlanner"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FlightPlanner_FormClosing); this.Load += new System.EventHandler(this.Planner_Load); this.Resize += new System.EventHandler(this.Planner_Resize); ((System.ComponentModel.ISupportInitialize)(this.Commands)).EndInit(); @@ -1037,5 +1045,6 @@ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; private System.Windows.Forms.ToolStripMenuItem GeoFenceuploadToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripMenuItem createWpCircleToolStripMenuItem; } } \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/FlightPlanner.cs b/Tools/ArdupilotMegaPlanner/GCSViews/FlightPlanner.cs index a16b011f91..b815ac0d25 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/FlightPlanner.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/FlightPlanner.cs @@ -23,11 +23,12 @@ using SharpKml.Base; using SharpKml.Dom; using ArdupilotMega.Controls; using ArdupilotMega.Utilities; +using ArdupilotMega.Controls.BackstageView; namespace ArdupilotMega.GCSViews { - partial class FlightPlanner : MyUserControl + partial class FlightPlanner : MyUserControl, IDeactivate { private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); int selectedrow = 0; @@ -697,6 +698,8 @@ namespace ArdupilotMega.GCSViews panelMap_Resize(null, null); writeKML(); + + timer1.Start(); } void parser_ElementAdded(object sender, SharpKml.Base.ElementEventArgs e) @@ -1223,7 +1226,7 @@ namespace ArdupilotMega.GCSViews try { - IMAVLink port = MainV2.comPort; + MAVLink port = MainV2.comPort; if (!port.BaseStream.IsOpen) { @@ -1256,12 +1259,13 @@ namespace ArdupilotMega.GCSViews catch (Exception ex) { error = 1; CustomMessageBox.Show("Error : " + ex.ToString()); } try { - this.BeginInvoke((MethodInvoker)delegate() + this.Invoke((MethodInvoker)delegate() { if (error == 0) { try { + log.Info("Process " + cmds.Count); processToScreen(cmds); } catch (Exception exx) { log.Info(exx.ToString()); } @@ -1332,7 +1336,7 @@ namespace ArdupilotMega.GCSViews { try { - IMAVLink port = MainV2.comPort; + MAVLink port = MainV2.comPort; if (!port.BaseStream.IsOpen) { @@ -1430,7 +1434,9 @@ namespace ArdupilotMega.GCSViews void processToScreen(List cmds) { quickadd = true; - Commands.Rows.Clear(); + + while (Commands.Rows.Count > 0) + Commands.Rows.RemoveAt(0); if (cmds.Count == 0) { @@ -1500,25 +1506,6 @@ namespace ArdupilotMega.GCSViews } try { - DataGridViewTextBoxCell cellhome; - cellhome = Commands.Rows[0].Cells[Lat.Index] as DataGridViewTextBoxCell; - if (cellhome.Value != null) - { - if (cellhome.Value.ToString() != TXT_homelat.Text && cellhome.Value.ToString() != "0") - { - DialogResult dr = CustomMessageBox.Show("Reset Home to loaded coords", "Reset Home Coords", MessageBoxButtons.YesNo); - - if (dr == DialogResult.Yes) - { - TXT_homelat.Text = (double.Parse(cellhome.Value.ToString())).ToString(); - cellhome = Commands.Rows[0].Cells[Lon.Index] as DataGridViewTextBoxCell; - TXT_homelng.Text = (double.Parse(cellhome.Value.ToString())).ToString(); - cellhome = Commands.Rows[0].Cells[Alt.Index] as DataGridViewTextBoxCell; - TXT_homealt.Text = (double.Parse(cellhome.Value.ToString()) * MainV2.cs.multiplierdist).ToString(); - } - } - } - log.Info("Setting wp params"); string hold_alt = ((int)((float)param["ALT_HOLD_RTL"] * MainV2.cs.multiplierdist)).ToString(); @@ -1551,6 +1538,26 @@ namespace ArdupilotMega.GCSViews CHK_holdalt.Checked = Convert.ToBoolean((float)param["ALT_HOLD_RTL"] > 0); log.Info("param ALT_HOLD_RTL " + CHK_holdalt.Checked.ToString()); + + + DataGridViewTextBoxCell cellhome; + cellhome = Commands.Rows[0].Cells[Lat.Index] as DataGridViewTextBoxCell; + if (cellhome.Value != null) + { + if (cellhome.Value.ToString() != TXT_homelat.Text && cellhome.Value.ToString() != "0") + { + DialogResult dr = CustomMessageBox.Show("Reset Home to loaded coords", "Reset Home Coords", MessageBoxButtons.YesNo); + + if (dr == DialogResult.Yes) + { + TXT_homelat.Text = (double.Parse(cellhome.Value.ToString())).ToString(); + cellhome = Commands.Rows[0].Cells[Lon.Index] as DataGridViewTextBoxCell; + TXT_homelng.Text = (double.Parse(cellhome.Value.ToString())).ToString(); + cellhome = Commands.Rows[0].Cells[Alt.Index] as DataGridViewTextBoxCell; + TXT_homealt.Text = (double.Parse(cellhome.Value.ToString()) * MainV2.cs.multiplierdist).ToString(); + } + } + } } catch (Exception ex) { log.Info(ex.ToString()); } // if there is no valid home @@ -2840,7 +2847,8 @@ namespace ArdupilotMega.GCSViews private void clearMissionToolStripMenuItem_Click(object sender, EventArgs e) { - Commands.Rows.Clear(); + while (Commands.Rows.Count > 0) + Commands.Rows.RemoveAt(0); selectedrow = 0; writeKML(); } @@ -3394,5 +3402,66 @@ namespace ArdupilotMega.GCSViews return (T)formatter.Deserialize(ms); } } + + private void createWpCircleToolStripMenuItem_Click(object sender, EventArgs e) + { + string RadiusIn = "50"; + Common.InputBox("Radius", "Radius", ref RadiusIn); + + string Pointsin = "20"; + Common.InputBox("Points", "Number of points to generate Circle", ref Pointsin); + + int Points = 0; + int Radius = 0; + + if (!int.TryParse(RadiusIn, out Radius)) + { + CustomMessageBox.Show("Bad Radius"); + return; + } + + if (!int.TryParse(Pointsin, out Points)) + { + CustomMessageBox.Show("Bad Point value"); + return; + } + + + + for (double a = 0; a <= 360; a += 360.0f / Points) + { + + selectedrow = Commands.Rows.Add(); + + Commands.Rows[selectedrow].Cells[Command.Index].Value = MAVLink.MAV_CMD.WAYPOINT.ToString(); + + ChangeColumnHeader(MAVLink.MAV_CMD.WAYPOINT.ToString()); + + float d = Radius; + float R = 6371000; + + var lat2 = Math.Asin(Math.Sin(end.Lat * deg2rad) * Math.Cos(d / R) + + Math.Cos(end.Lat * deg2rad) * Math.Sin(d / R) * Math.Cos(a * deg2rad)); + var lon2 = end.Lng * deg2rad + Math.Atan2(Math.Sin(a * deg2rad) * Math.Sin(d / R) * Math.Cos(end.Lat * deg2rad), + Math.Cos(d / R) - Math.Sin(end.Lat * deg2rad) * Math.Sin(lat2)); + + PointLatLng pll = new PointLatLng(lat2 * rad2deg, lon2 * rad2deg); + + setfromGE(pll.Lat, pll.Lng, (int)float.Parse(TXT_DefaultAlt.Text)); + + } + + //drawnpolygon.Points.Add(new PointLatLng(start.Lat, start.Lng)); + } + + public void Deactivate() + { + timer1.Stop(); + } + + private void FlightPlanner_FormClosing(object sender, FormClosingEventArgs e) + { + timer1.Stop(); + } } } \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/FlightPlanner.resx b/Tools/ArdupilotMegaPlanner/GCSViews/FlightPlanner.resx index 779b17c456..86587af632 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/FlightPlanner.resx +++ b/Tools/ArdupilotMegaPlanner/GCSViews/FlightPlanner.resx @@ -556,7 +556,7 @@ BUT_write - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4579.33184, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.39185, Culture=neutral, PublicKeyToken=null panel5 @@ -583,7 +583,7 @@ BUT_read - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4579.33184, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.39185, Culture=neutral, PublicKeyToken=null panel5 @@ -610,7 +610,7 @@ SaveFile - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4579.33184, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.39185, Culture=neutral, PublicKeyToken=null panel5 @@ -637,7 +637,7 @@ BUT_loadwpfile - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4579.33184, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.39185, Culture=neutral, PublicKeyToken=null panel5 @@ -1261,7 +1261,7 @@ BUT_loadkml - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4579.33184, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.39185, Culture=neutral, PublicKeyToken=null panelWaypoints @@ -1291,7 +1291,7 @@ BUT_zoomto - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4579.33184, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.39185, Culture=neutral, PublicKeyToken=null panelWaypoints @@ -1321,7 +1321,7 @@ BUT_Camera - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4579.33184, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.39185, Culture=neutral, PublicKeyToken=null panelWaypoints @@ -1351,7 +1351,7 @@ BUT_grid - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4579.33184, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.39185, Culture=neutral, PublicKeyToken=null panelWaypoints @@ -1381,7 +1381,7 @@ BUT_Prefetch - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4579.33184, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.39185, Culture=neutral, PublicKeyToken=null panelWaypoints @@ -1411,7 +1411,7 @@ button1 - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4579.33184, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.39185, Culture=neutral, PublicKeyToken=null panelWaypoints @@ -1441,7 +1441,7 @@ BUT_Add - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4579.33184, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.39185, Culture=neutral, PublicKeyToken=null panelWaypoints @@ -1647,6 +1647,12 @@ Jump + + 167, 22 + + + Create Wp Circle + 164, 6 @@ -1680,12 +1686,6 @@ Draw Polygon - - 167, 22 - - - Clear Mission - 177, 22 @@ -1731,8 +1731,14 @@ Geo-Fence + + 167, 22 + + + Clear Mission + - 168, 208 + 168, 230 contextMenuStrip1 @@ -1898,7 +1904,7 @@ MainMap - ArdupilotMega.Controls.myGMAP, ArdupilotMegaPlanner10, Version=1.1.4579.33184, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.myGMAP, ArdupilotMegaPlanner10, Version=1.1.4582.39185, Culture=neutral, PublicKeyToken=null panelMap @@ -1928,7 +1934,7 @@ trackBar1 - ArdupilotMega.Controls.MyTrackBar, ArdupilotMegaPlanner10, Version=1.1.4579.33184, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyTrackBar, ArdupilotMegaPlanner10, Version=1.1.4582.39185, Culture=neutral, PublicKeyToken=null panelMap @@ -2161,6 +2167,12 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + createWpCircleToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + toolStripSeparator1 @@ -2197,12 +2209,6 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - clearMissionToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - geoFenceToolStripMenuItem @@ -2251,6 +2257,12 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + clearMissionToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + toolTip1 @@ -2267,6 +2279,6 @@ FlightPlanner - System.Windows.Forms.MyUserControl, ArdupilotMegaPlanner10, Version=1.1.4579.33184, Culture=neutral, PublicKeyToken=null + System.Windows.Forms.MyUserControl, ArdupilotMegaPlanner10, Version=1.1.4582.39185, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/Simulation.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/Simulation.Designer.cs index 54ae0bb1a2..d4c451fab6 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/Simulation.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/Simulation.Designer.cs @@ -40,7 +40,6 @@ this.TXT_pitch = new ArdupilotMega.Controls.MyLabel(); this.TXT_heading = new ArdupilotMega.Controls.MyLabel(); this.TXT_wpdist = new ArdupilotMega.Controls.MyLabel(); - this.currentStateBindingSource = new System.Windows.Forms.BindingSource(this.components); this.TXT_bererror = new ArdupilotMega.Controls.MyLabel(); this.TXT_alterror = new ArdupilotMega.Controls.MyLabel(); this.TXT_lat = new ArdupilotMega.Controls.MyLabel(); @@ -114,7 +113,6 @@ this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); this.RAD_JSBSim = new System.Windows.Forms.RadioButton(); this.CHK_xplane10 = new System.Windows.Forms.CheckBox(); - ((System.ComponentModel.ISupportInitialize)(this.currentStateBindingSource)).BeginInit(); this.panel1.SuspendLayout(); this.panel2.SuspendLayout(); this.panel3.SuspendLayout(); @@ -200,10 +198,6 @@ this.TXT_wpdist.Name = "TXT_wpdist"; this.TXT_wpdist.resize = false; // - // currentStateBindingSource - // - this.currentStateBindingSource.DataSource = typeof(ArdupilotMega.CurrentState); - // // TXT_bererror // resources.ApplyResources(this.TXT_bererror, "TXT_bererror"); @@ -743,8 +737,8 @@ this.Controls.Add(this.CHKREV_pitch); this.Controls.Add(this.CHKREV_roll); this.Name = "Simulation"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Simulation_FormClosing); this.Load += new System.EventHandler(this.Simulation_Load); - ((System.ComponentModel.ISupportInitialize)(this.currentStateBindingSource)).EndInit(); this.panel1.ResumeLayout(false); this.panel2.ResumeLayout(false); this.panel3.ResumeLayout(false); @@ -833,7 +827,6 @@ private ArdupilotMega.Controls.MyLabel TXT_yaw; private ArdupilotMega.Controls.MyButton but_advsettings; private System.Windows.Forms.CheckBox chkSensor; - private System.Windows.Forms.BindingSource currentStateBindingSource; private System.Windows.Forms.CheckBox CHK_quad; private ArdupilotMega.Controls.MyButton BUT_startfgquad; private ArdupilotMega.Controls.MyButton BUT_startfgplane; diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/Simulation.cs b/Tools/ArdupilotMegaPlanner/GCSViews/Simulation.cs index 670b290262..e42abd1492 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/Simulation.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/Simulation.cs @@ -22,7 +22,7 @@ namespace ArdupilotMega.GCSViews public partial class Simulation : MyUserControl { private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - IMAVLink comPort = MainV2.comPort; + MAVLink comPort = MainV2.comPort; UdpClient XplanesSEND; UdpClient MavLink; Socket SimulatorRECV; @@ -263,6 +263,8 @@ namespace ArdupilotMega.GCSViews private void Simulation_Load(object sender, EventArgs e) { + timer_servo_graph.Stop(); + GPSrate.SelectedIndex = 2; xmlconfig(false); @@ -725,7 +727,7 @@ namespace ArdupilotMega.GCSViews /// Packet /// Length /// Com Port - private void RECVprocess(byte[] data, int receviedbytes, ArdupilotMega.IMAVLink comPort) + private void RECVprocess(byte[] data, int receviedbytes, ArdupilotMega.MAVLink comPort) { #if MAVLINK10 ArdupilotMega.MAVLink.mavlink_hil_state_t hilstate = new ArdupilotMega.MAVLink.mavlink_hil_state_t(); @@ -2190,5 +2192,10 @@ namespace ArdupilotMega.GCSViews CHKgraphthrottle.Visible = false; } } + + private void Simulation_FormClosing(object sender, FormClosingEventArgs e) + { + timer_servo_graph.Stop(); + } } } \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/Simulation.resx b/Tools/ArdupilotMegaPlanner/GCSViews/Simulation.resx index 0b480ae370..fff2575e47 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/Simulation.resx +++ b/Tools/ArdupilotMegaPlanner/GCSViews/Simulation.resx @@ -261,7 +261,7 @@ ConnectComPort - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel5 @@ -309,7 +309,7 @@ TXT_roll - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel2 @@ -330,7 +330,7 @@ TXT_pitch - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel2 @@ -351,7 +351,7 @@ TXT_heading - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel2 @@ -372,7 +372,7 @@ TXT_wpdist - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel4 @@ -380,9 +380,6 @@ 8 - - 104, 17 - 75, 50 @@ -396,7 +393,7 @@ TXT_bererror - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel4 @@ -417,7 +414,7 @@ TXT_alterror - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel4 @@ -438,7 +435,7 @@ TXT_lat - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel1 @@ -459,7 +456,7 @@ TXT_long - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel1 @@ -480,7 +477,7 @@ TXT_alt - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel1 @@ -504,7 +501,7 @@ SaveSettings - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null $this @@ -588,7 +585,7 @@ TXT_servoroll - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel3 @@ -609,7 +606,7 @@ TXT_servopitch - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel3 @@ -630,7 +627,7 @@ TXT_servorudder - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel3 @@ -651,7 +648,7 @@ TXT_servothrottle - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel3 @@ -675,7 +672,7 @@ label4 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel1 @@ -699,7 +696,7 @@ label3 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel1 @@ -723,7 +720,7 @@ label2 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel1 @@ -747,7 +744,7 @@ label1 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel1 @@ -792,7 +789,7 @@ label30 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel2 @@ -813,7 +810,7 @@ TXT_yaw - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel2 @@ -837,7 +834,7 @@ label11 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel2 @@ -861,7 +858,7 @@ label7 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel2 @@ -885,7 +882,7 @@ label6 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel2 @@ -909,7 +906,7 @@ label5 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel2 @@ -954,7 +951,7 @@ label8 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel4 @@ -978,7 +975,7 @@ label9 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel4 @@ -1002,7 +999,7 @@ label10 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel4 @@ -1026,7 +1023,7 @@ label16 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel3 @@ -1050,7 +1047,7 @@ label15 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel3 @@ -1074,7 +1071,7 @@ label14 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel3 @@ -1098,7 +1095,7 @@ label13 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel3 @@ -1122,7 +1119,7 @@ label12 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel3 @@ -1167,7 +1164,7 @@ label20 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel4 @@ -1191,7 +1188,7 @@ label19 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel4 @@ -1212,7 +1209,7 @@ TXT_control_mode - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel4 @@ -1233,7 +1230,7 @@ TXT_WP - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel4 @@ -1257,7 +1254,7 @@ label18 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel4 @@ -1302,7 +1299,7 @@ label17 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null $this @@ -1375,7 +1372,7 @@ label28 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel6 @@ -1399,7 +1396,7 @@ label29 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel6 @@ -1423,7 +1420,7 @@ label27 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel6 @@ -1447,7 +1444,7 @@ label25 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel6 @@ -1495,7 +1492,7 @@ label24 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel6 @@ -1519,7 +1516,7 @@ label23 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel6 @@ -1543,7 +1540,7 @@ label22 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel6 @@ -1567,7 +1564,7 @@ label21 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null panel6 @@ -1684,7 +1681,7 @@ label26 - ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyLabel, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null $this @@ -1855,7 +1852,7 @@ but_advsettings - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null $this @@ -1939,7 +1936,7 @@ BUT_startfgquad - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null $this @@ -1966,7 +1963,7 @@ BUT_startfgplane - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null $this @@ -1993,7 +1990,7 @@ BUT_startxplane - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null $this @@ -2136,12 +2133,6 @@ 722, 742 - - currentStateBindingSource - - - System.Windows.Forms.BindingSource, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - timer_servo_graph @@ -2158,6 +2149,6 @@ Simulation - System.Windows.Forms.MyUserControl, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=38326cb7e06851fc + System.Windows.Forms.MyUserControl, ArdupilotMegaPlanner10, Version=1.1.4582.35218, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/Terminal.cs b/Tools/ArdupilotMegaPlanner/GCSViews/Terminal.cs index a17f360d49..829edced05 100644 --- a/Tools/ArdupilotMegaPlanner/GCSViews/Terminal.cs +++ b/Tools/ArdupilotMegaPlanner/GCSViews/Terminal.cs @@ -147,10 +147,15 @@ namespace ArdupilotMega.GCSViews { threadrun = false; - if (comPort.IsOpen) + try { - comPort.Close(); + if (comPort.IsOpen) + { + comPort.Close(); + } } + catch { } // Exception System.IO.IOException: The specified port does not exist. + System.Threading.Thread.Sleep(400); MainV2.giveComport = false; diff --git a/Tools/ArdupilotMegaPlanner/Log.Designer.cs b/Tools/ArdupilotMegaPlanner/Log.Designer.cs index 92c4948aee..f0d3c964f5 100644 --- a/Tools/ArdupilotMegaPlanner/Log.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/Log.Designer.cs @@ -77,6 +77,7 @@ // TXT_status // resources.ApplyResources(this.TXT_status, "TXT_status"); + this.TXT_status.ForeColor = System.Drawing.Color.Red; this.TXT_status.Name = "TXT_status"; // // BUT_redokml diff --git a/Tools/ArdupilotMegaPlanner/Log.resx b/Tools/ArdupilotMegaPlanner/Log.resx index 4b99ecc7a9..f4550b92dc 100644 --- a/Tools/ArdupilotMegaPlanner/Log.resx +++ b/Tools/ArdupilotMegaPlanner/Log.resx @@ -159,7 +159,7 @@ BUT_DLall - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.1.4537.26254, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4583.40805, Culture=neutral, PublicKeyToken=null $this @@ -183,7 +183,7 @@ BUT_DLthese - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.1.4537.26254, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4583.40805, Culture=neutral, PublicKeyToken=null $this @@ -207,7 +207,7 @@ BUT_clearlogs - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.1.4537.26254, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4583.40805, Culture=neutral, PublicKeyToken=null $this @@ -276,7 +276,7 @@ BUT_redokml - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.1.4537.26254, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4583.40805, Culture=neutral, PublicKeyToken=null $this @@ -300,7 +300,7 @@ BUT_firstperson - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.1.4537.26254, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4583.40805, Culture=neutral, PublicKeyToken=null $this @@ -328,7 +328,7 @@ BUT_dumpdf - ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.1.4537.26254, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4583.40805, Culture=neutral, PublicKeyToken=null $this diff --git a/Tools/ArdupilotMegaPlanner/MainV2.cs b/Tools/ArdupilotMegaPlanner/MainV2.cs index a4a9da14b4..d32052c0da 100644 --- a/Tools/ArdupilotMegaPlanner/MainV2.cs +++ b/Tools/ArdupilotMegaPlanner/MainV2.cs @@ -44,7 +44,7 @@ namespace ArdupilotMega /// /// Main Comport interface /// - public static IMAVLink comPort = new MAVLink(); + public static MAVLink comPort = new MAVLink(); /// /// Comport name /// @@ -90,10 +90,6 @@ namespace ArdupilotMega /// bool serialThread = false; /// - /// unused at this point - potential to move all forms to this single binding source. need to evalutate performance/exception issues - /// - static internal BindingSource bs; - /// /// used for mini https server for websockets/mjpeg video stream, and network link kmls /// private TcpListener listener; @@ -977,7 +973,7 @@ namespace ArdupilotMega this.MenuConnect.BackgroundImage = global::ArdupilotMega.Properties.Resources.connect; this.MenuConnect.BackgroundImage.Tag = "Connect"; _connectionControl.IsConnected(false); - if (_connectionStats != null) + if (_connectionStats != null) { _connectionStats.StopUpdates(); } @@ -990,7 +986,7 @@ namespace ArdupilotMega { _connectionControl.IsConnected(true); }); - } + } } connectButtonUpdate = DateTime.Now; } @@ -1014,8 +1010,8 @@ namespace ArdupilotMega int minbytes = 10; - if (MONO) - minbytes = 0; + // if (MONO) + // minbytes = 0; DateTime speechcustomtime = DateTime.Now; @@ -1081,8 +1077,7 @@ namespace ArdupilotMega MainV2.cs.linkqualitygcs = (ushort)(MainV2.cs.linkqualitygcs * 0.8f); linkqualitytime = DateTime.Now; - int fixme; - //GCSViews.FlightData.myhud.Invalidate(); + GCSViews.FlightData.myhud.Invalidate(); } } @@ -1116,16 +1111,19 @@ namespace ArdupilotMega } } - //Console.WriteLine(DateTime.Now.Millisecond + " " + comPort.BaseStream.BytesToRead); + // Console.WriteLine(DateTime.Now.Millisecond + " " + comPort.BaseStream.BytesToRead); while (comPort.BaseStream.BytesToRead > minbytes && giveComport == false) { + //Console.WriteLine(DateTime.Now.Millisecond + " SR1 " + comPort.BaseStream.BytesToRead ); comPort.readPacket(); + //Console.WriteLine(DateTime.Now.Millisecond + " SR2 " + comPort.BaseStream.BytesToRead); } + // Console.WriteLine("SR left"); } catch (Exception e) { - log.Error("Serial Reader fail :" + e.Message); + log.Error("Serial Reader fail :" + e.ToString()); try { comPort.Close(); @@ -1186,7 +1184,7 @@ namespace ArdupilotMega private void MainV2_Load(object sender, EventArgs e) { - MyView.AddScreen(new MainSwitcher.Screen("FlightData",FlightData,true)); + MyView.AddScreen(new MainSwitcher.Screen("FlightData", FlightData, true)); MyView.AddScreen(new MainSwitcher.Screen("FlightPlanner", FlightPlanner, true)); MyView.AddScreen(new MainSwitcher.Screen("Config", new GCSViews.ConfigurationView.Setup(), false)); MyView.AddScreen(new MainSwitcher.Screen("Simulation", Simulation, true)); @@ -1228,7 +1226,8 @@ namespace ArdupilotMega new Thread(SerialReader) { IsBackground = true, - Name = "Main Serial reader" + Name = "Main Serial reader", + Priority = ThreadPriority.AboveNormal }.Start(); try @@ -1448,7 +1447,7 @@ namespace ArdupilotMega foreach (var point in GCSViews.FlightPlanner.pointlist) { if (point != null) - coords.Add(new SharpKml.Base.Vector(point.Lat, point.Lng, point.Alt)); + coords.Add(new SharpKml.Base.Vector(point.Lat, point.Lng, point.Alt)); } @@ -1977,7 +1976,7 @@ namespace ArdupilotMega } } catch { } - log.Debug(file + " " + bytes); + // log.Debug(file + " " + bytes); int len = dataStream.Read(buf1, 0, 1024); if (len == 0) break; @@ -2081,11 +2080,9 @@ namespace ArdupilotMega if (keyData == (Keys.Control | Keys.W)) // test ac config { - Controls.ConfigPanel cfg = new Controls.ConfigPanel(); + Controls.ConfigPanel cfg = new Controls.ConfigPanel(Application.StartupPath + System.IO.Path.DirectorySeparatorChar + "ArduCopterConfig.xml"); - cfg.LoadXML("ArduCopterConfig.xml"); - - //cfg.ShowDialog(); + //cfg.Show(); return true; } diff --git a/Tools/ArdupilotMegaPlanner/Mavlink/MAVLink.cs b/Tools/ArdupilotMegaPlanner/Mavlink/MAVLink.cs index c8022f437f..4e5581424f 100644 --- a/Tools/ArdupilotMegaPlanner/Mavlink/MAVLink.cs +++ b/Tools/ArdupilotMegaPlanner/Mavlink/MAVLink.cs @@ -19,7 +19,7 @@ using System.Windows.Forms; namespace ArdupilotMega { - public partial class MAVLink: IMAVLink + public partial class MAVLink { private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public ICommsSerial BaseStream { get; set; } @@ -703,6 +703,8 @@ namespace ArdupilotMega DateTime start = DateTime.Now; DateTime restart = DateTime.Now; + DateTime lastmessage = DateTime.MinValue; + do { @@ -763,13 +765,15 @@ namespace ArdupilotMega log.Info(DateTime.Now.Millisecond + " got param " + (par.param_index) + " of " + (par.param_count) + " name: " + paramID); + //Console.WriteLine(DateTime.Now.Millisecond + " gp " + BaseStream.BytesToRead); + modifyParamForDisplay(true, paramID, ref par.param_value); param[paramID] = (par.param_value); param_count++; got.Add(par.param_index); - // if (Progress != null) - // Progress((param.Count * 100) / param_total, "Got param " + paramID); + Console.WriteLine(DateTime.Now.Millisecond + " gp1 " + BaseStream.BytesToRead); + this.frmProgressReporter.UpdateProgressAndStatus((got.Count * 100) / param_total, "Got param " + paramID); // we have them all - lets escape eq total = 176 index = 0-175 @@ -782,6 +786,7 @@ namespace ArdupilotMega } //stopwatch.Stop(); //Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed); + Console.WriteLine(DateTime.Now.Millisecond + " gp2 " + BaseStream.BytesToRead); } } while (got.Count < param_total); @@ -801,14 +806,12 @@ namespace ArdupilotMega public static void modifyParamForDisplay(bool fromapm, string paramname, ref float value) { - if (paramname.ToUpper().EndsWith("_IMAX") || paramname.ToUpper().EndsWith("ALT_HOLD_RTL") || paramname.ToUpper().EndsWith("TRIM_ARSPD_CM") + if (paramname.ToUpper().EndsWith("_IMAX") || paramname.ToUpper().EndsWith("ALT_HOLD_RTL") || paramname.ToUpper().EndsWith("APPROACH_ALT") || paramname.ToUpper().EndsWith("TRIM_ARSPD_CM") || paramname.ToUpper().EndsWith("XTRK_ANGLE_CD") || paramname.ToUpper().EndsWith("LIM_PITCH_MAX") || paramname.ToUpper().EndsWith("LIM_PITCH_MIN") || paramname.ToUpper().EndsWith("LIM_ROLL_CD") || paramname.ToUpper().EndsWith("PITCH_MAX") || paramname.ToUpper().EndsWith("WP_SPEED_MAX")) { - if (paramname.ToUpper().EndsWith("THR_HOLD_IMAX")) - { + if (paramname.ToUpper().EndsWith("THR_RATE_IMAX") || paramname.ToUpper().EndsWith("THR_HOLD_IMAX")) return; - } if (fromapm) { @@ -2049,7 +2052,7 @@ namespace ArdupilotMega /// public byte[] readPacket() { - byte[] temp = new byte[300]; + byte[] buffer = new byte[300]; int count = 0; int length = 0; int readcount = 0; @@ -2073,6 +2076,7 @@ namespace ArdupilotMega lock (readlock) { +// Console.WriteLine(DateTime.Now.Millisecond + " SR " + BaseStream.BytesToRead); while (BaseStream.IsOpen || logreadmode) { @@ -2104,11 +2108,11 @@ namespace ArdupilotMega if (oldlogformat) { - temp = readlogPacket(); //old style log + buffer = readlogPacket(); //old style log } else { - temp = readlogPacketMavlink(); + buffer = readlogPacketMavlink(); } } else @@ -2126,51 +2130,53 @@ namespace ArdupilotMega } // System.Threading.Thread.Sleep(1); } + //Console.WriteLine(DateTime.Now.Millisecond + " SR1 " + BaseStream.BytesToRead); if (BaseStream.IsOpen) { - temp[count] = (byte)BaseStream.ReadByte(); + buffer[count] = (byte)BaseStream.ReadByte(); if (rawlogfile != null && rawlogfile.BaseStream.CanWrite) - rawlogfile.Write(temp[count]); + rawlogfile.Write(buffer[count]); } } } catch (Exception e) { log.Info("MAVLink readpacket read error: " + e.ToString()); break; } // check if looks like a mavlink packet and check for exclusions and write to console - if (temp[0] != 254 && temp[0] != 'U' || lastbad[0] == 'I' && lastbad[1] == 'M' || lastbad[1] == 'G' || lastbad[1] == 'A') // out of sync "AUTO" "GUIDED" "IMU" + if (buffer[0] != 254 && buffer[0] != 'U' || lastbad[0] == 'I' && lastbad[1] == 'M' || lastbad[1] == 'G' || lastbad[1] == 'A') // out of sync "AUTO" "GUIDED" "IMU" { - if (temp[0] >= 0x20 && temp[0] <= 127 || temp[0] == '\n' || temp[0] == '\r') + if (buffer[0] >= 0x20 && buffer[0] <= 127 || buffer[0] == '\n' || buffer[0] == '\r') { - TCPConsole.Write(temp[0]); - Console.Write((char)temp[0]); + TCPConsole.Write(buffer[0]); + Console.Write((char)buffer[0]); } _bytesReceivedSubj.OnNext(1); count = 0; lastbad[0] = lastbad[1]; - lastbad[1] = temp[0]; - temp[1] = 0; + lastbad[1] = buffer[0]; + buffer[1] = 0; continue; } // reset count on valid packet readcount = 0; + //Console.WriteLine(DateTime.Now.Millisecond + " SR2 " + BaseStream.BytesToRead); - if (temp[0] == 'U' || temp[0] == 254) + if (buffer[0] == 'U' || buffer[0] == 254) { - length = temp[1] + 6 + 2 - 2; // data + header + checksum - U - length + length = buffer[1] + 6 + 2 - 2; // data + header + checksum - U - length if (count >= 5 || logreadmode) { if (sysid != 0) { - if (sysid != temp[3] || compid != temp[4]) + if (sysid != buffer[3] || compid != buffer[4]) { - if (temp[3] == '3' && temp[4] == 'D') + if (buffer[3] == '3' && buffer[4] == 'D') { // this is a 3dr radio rssi packet } else { - log.InfoFormat("Mavlink Bad Packet (not addressed to this MAV) got {0} {1} vs {2} {3}", temp[3], temp[4], sysid, compid); + log.InfoFormat("Mavlink Bad Packet (not addressed to this MAV) got {0} {1} vs {2} {3}", buffer[3], buffer[4], sysid, compid); return new byte[0]; } } @@ -2197,12 +2203,11 @@ namespace ArdupilotMega } if (BaseStream.IsOpen) { - int read = BaseStream.Read(temp, 6, length - 4); + int read = BaseStream.Read(buffer, 6, length - 4); if (rawlogfile != null && rawlogfile.BaseStream.CanWrite) { // write only what we read, temp is the whole packet, so 6-end - rawlogfile.Write(temp, 6, read); - rawlogfile.BaseStream.Flush(); + rawlogfile.Write(buffer, 6, read); } } } @@ -2218,11 +2223,13 @@ namespace ArdupilotMega if (count == 299) break; } + + //Console.WriteLine(DateTime.Now.Millisecond + " SR3 " + BaseStream.BytesToRead); }// end readlock - Array.Resize(ref temp, count); + Array.Resize(ref buffer, count); - _bytesReceivedSubj.OnNext(temp.Length); + _bytesReceivedSubj.OnNext(buffer.Length); if (packetlosttimer.AddSeconds(5) < DateTime.Now) { @@ -2241,34 +2248,34 @@ namespace ArdupilotMega bpstime = DateTime.Now; } - bps1 += temp.Length; + bps1 += buffer.Length; bps = (bps1 + bps2) / 2; - if (temp.Length >= 5 && temp[3] == 255 && logreadmode) // gcs packet + if (buffer.Length >= 5 && buffer[3] == 255 && logreadmode) // gcs packet { - getWPsfromstream(ref temp); - return temp;// new byte[0]; + getWPsfromstream(ref buffer); + return buffer;// new byte[0]; } - ushort crc = MavlinkCRC.crc_calculate(temp, temp.Length - 2); + ushort crc = MavlinkCRC.crc_calculate(buffer, buffer.Length - 2); - if (temp.Length > 5 && temp[0] == 254) + if (buffer.Length > 5 && buffer[0] == 254) { - crc = MavlinkCRC.crc_accumulate(MAVLINK_MESSAGE_CRCS[temp[5]], crc); + crc = MavlinkCRC.crc_accumulate(MAVLINK_MESSAGE_CRCS[buffer[5]], crc); } - if (temp.Length > 5 && temp[1] != MAVLINK_MESSAGE_LENGTHS[temp[5]]) + if (buffer.Length > 5 && buffer[1] != MAVLINK_MESSAGE_LENGTHS[buffer[5]]) { - if (MAVLINK_MESSAGE_LENGTHS[temp[5]] == 0) // pass for unknown packets + if (MAVLINK_MESSAGE_LENGTHS[buffer[5]] == 0) // pass for unknown packets { } else { - log.InfoFormat("Mavlink Bad Packet (Len Fail) len {0} pkno {1}", temp.Length, temp[5]); + log.InfoFormat("Mavlink Bad Packet (Len Fail) len {0} pkno {1}", buffer.Length, buffer[5]); #if MAVLINK10 - if (temp.Length == 11 && temp[0] == 'U' && temp[5] == 0){ + if (buffer.Length == 11 && buffer[0] == 'U' && buffer[5] == 0){ string message ="Mavlink 0.9 Heartbeat, Please upgrade your AP, This planner is for Mavlink 1.0\n\n"; System.Windows.Forms.CustomMessageBox.Show(message); throw new Exception(message); @@ -2285,28 +2292,28 @@ namespace ArdupilotMega } } - if (temp.Length < 5 || temp[temp.Length - 1] != (crc >> 8) || temp[temp.Length - 2] != (crc & 0xff)) + if (buffer.Length < 5 || buffer[buffer.Length - 1] != (crc >> 8) || buffer[buffer.Length - 2] != (crc & 0xff)) { int packetno = -1; - if (temp.Length > 5) + if (buffer.Length > 5) { - packetno = temp[5]; + packetno = buffer[5]; } - log.InfoFormat("Mavlink Bad Packet (crc fail) len {0} crc {1} pkno {2}", temp.Length, crc, packetno); + log.InfoFormat("Mavlink Bad Packet (crc fail) len {0} crc {1} pkno {2}", buffer.Length, crc, packetno); return new byte[0]; } try { - if ((temp[0] == 'U' || temp[0] == 254) && temp.Length >= temp[1]) + if ((buffer[0] == 'U' || buffer[0] == 254) && buffer.Length >= buffer[1]) { - if (temp[3] == '3' && temp[4] == 'D') + if (buffer[3] == '3' && buffer[4] == 'D') { } else { - byte packetSeqNo = temp[2]; + byte packetSeqNo = buffer[2]; int expectedPacketSeqNo = ((recvpacketcount + 1) % 0x100); if (packetSeqNo != expectedPacketSeqNo) @@ -2340,26 +2347,26 @@ namespace ArdupilotMega // Console.Write(temp[5] + " " + DateTime.Now.Millisecond + " " + packetspersecond[temp[5]] + " " + (DateTime.Now - packetspersecondbuild[temp[5]]).TotalMilliseconds + " \n"); - if (double.IsInfinity(packetspersecond[temp[5]])) - packetspersecond[temp[5]] = 0; + if (double.IsInfinity(packetspersecond[buffer[5]])) + packetspersecond[buffer[5]] = 0; - packetspersecond[temp[5]] = (((1000 / ((DateTime.Now - packetspersecondbuild[temp[5]]).TotalMilliseconds) + packetspersecond[temp[5]]) / 2)); + packetspersecond[buffer[5]] = (((1000 / ((DateTime.Now - packetspersecondbuild[buffer[5]]).TotalMilliseconds) + packetspersecond[buffer[5]]) / 2)); - packetspersecondbuild[temp[5]] = DateTime.Now; + packetspersecondbuild[buffer[5]] = DateTime.Now; //Console.WriteLine("Packet {0}",temp[5]); // store packet history lock (objlock) { - packets[temp[5]] = temp; + packets[buffer[5]] = buffer; } if (debugmavlink) - DebugPacket(temp); + DebugPacket(buffer); - if (temp[5] == MAVLink.MAVLINK_MSG_ID_STATUSTEXT) // status text + if (buffer[5] == MAVLink.MAVLINK_MSG_ID_STATUSTEXT) // status text { - string logdata = Encoding.ASCII.GetString(temp, 7, temp.Length - 7); + string logdata = Encoding.ASCII.GetString(buffer, 7, buffer.Length - 7); int ind = logdata.IndexOf('\0'); if (ind != -1) logdata = logdata.Substring(0, ind); @@ -2372,7 +2379,7 @@ namespace ArdupilotMega } - getWPsfromstream(ref temp); + getWPsfromstream(ref buffer); try { @@ -2383,8 +2390,12 @@ namespace ArdupilotMega byte[] datearray = BitConverter.GetBytes((UInt64)((DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds * 1000)); //ASCIIEncoding.ASCII.GetBytes(DateTime.Now.ToBinary() + ":"); Array.Reverse(datearray); logfile.Write(datearray, 0, datearray.Length); - logfile.Write(temp, 0, temp.Length); - logfile.Flush(); + logfile.Write(buffer, 0, buffer.Length); + + if (buffer[5] == 0) {// flush on heartbeat - 1 seconds + logfile.Flush(); + rawlogfile.BaseStream.Flush(); + } } } @@ -2398,7 +2409,9 @@ namespace ArdupilotMega // Console.Write((DateTime.Now - start).TotalMilliseconds.ToString("00.000") + "\t" + temp.Length + " \r"); - return temp; + // Console.WriteLine(DateTime.Now.Millisecond + " SR4 " + BaseStream.BytesToRead); + + return buffer; } /// diff --git a/Tools/ArdupilotMegaPlanner/Presenter/ConfigCameraStabPresenter.cs b/Tools/ArdupilotMegaPlanner/Presenter/ConfigCameraStabPresenter.cs index 19a44f0993..edfa404471 100644 --- a/Tools/ArdupilotMegaPlanner/Presenter/ConfigCameraStabPresenter.cs +++ b/Tools/ArdupilotMegaPlanner/Presenter/ConfigCameraStabPresenter.cs @@ -34,10 +34,10 @@ namespace ArdupilotMega.Presenter private CameraAxisProperties _pitchAxis; private CameraAxisProperties _rollAxis; - private readonly IMAVLink _mavlink; + private readonly MAVLink _mavlink; private readonly Dictionary _errors; - public ConfigCameraStabPresenter(IMAVLink mavlink) + public ConfigCameraStabPresenter(MAVLink mavlink) { _mavlink = mavlink; _errors = new Dictionary(); diff --git a/Tools/ArdupilotMegaPlanner/Program.cs b/Tools/ArdupilotMegaPlanner/Program.cs index 27cb31cf7b..cae92447e5 100644 --- a/Tools/ArdupilotMegaPlanner/Program.cs +++ b/Tools/ArdupilotMegaPlanner/Program.cs @@ -31,10 +31,6 @@ namespace ArdupilotMega Application.Idle += Application_Idle; - int wt = 0, ct = 0; - ThreadPool.GetMaxThreads(out wt, out ct); - log.Info("Max Threads: " + wt); - //MagCalib.ProcessLog(); //MessageBox.Show("NOTE: This version may break advanced mission scripting"); @@ -67,17 +63,7 @@ namespace ArdupilotMega return; */ - char[] line = "testtesttesttesttest".ToCharArray(); - - Delta.delta_encode(ref line); - - Delta.delta_decode(ref line); - - if (System.Diagnostics.Debugger.IsAttached) - { - // testing - // Utilities.ParameterMetaDataParser.GetParameterInformation(); - } + try { @@ -94,13 +80,19 @@ namespace ArdupilotMega } } + static DateTime lastidle = DateTime.Now; + static void Application_Idle(object sender, EventArgs e) { //System.Threading.Thread.Sleep(10); //Console.Write("Idle\n"); + if (lastidle.AddMilliseconds(20) < DateTime.Now) + { + Application.DoEvents(); + lastidle = DateTime.Now; + } - System.Threading.Thread.Sleep(20); - Application.DoEvents(); + System.Threading.Thread.Sleep(1); } static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) diff --git a/Tools/ArdupilotMegaPlanner/Properties/AssemblyInfo.cs b/Tools/ArdupilotMegaPlanner/Properties/AssemblyInfo.cs index 7d56cdc5df..4502aa440b 100644 --- a/Tools/ArdupilotMegaPlanner/Properties/AssemblyInfo.cs +++ b/Tools/ArdupilotMegaPlanner/Properties/AssemblyInfo.cs @@ -34,5 +34,5 @@ using System.Resources; // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.1.*")] -[assembly: AssemblyFileVersion("1.1.98")] +[assembly: AssemblyFileVersion("1.1.99")] [assembly: NeutralResourcesLanguageAttribute("")] diff --git a/Tools/ArdupilotMegaPlanner/Properties/Resources.Designer.cs b/Tools/ArdupilotMegaPlanner/Properties/Resources.Designer.cs index 2b5dbc11a8..6a01753179 100644 --- a/Tools/ArdupilotMegaPlanner/Properties/Resources.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/Properties/Resources.Designer.cs @@ -177,6 +177,18 @@ namespace ArdupilotMega.Properties { } } + public static System.Drawing.Bitmap frames_plus { + get { + object obj = ResourceManager.GetObject("frames_plus", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + public static System.Drawing.Bitmap frames_x { + get { + object obj = ResourceManager.GetObject("frames_x", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } public static System.Drawing.Bitmap Gaugebg { get { object obj = ResourceManager.GetObject("Gaugebg", resourceCulture); diff --git a/Tools/ArdupilotMegaPlanner/Properties/Resources.resx b/Tools/ArdupilotMegaPlanner/Properties/Resources.resx index e737b3bdf3..0305d2ee19 100644 --- a/Tools/ArdupilotMegaPlanner/Properties/Resources.resx +++ b/Tools/ArdupilotMegaPlanner/Properties/Resources.resx @@ -1234,11 +1234,17 @@ ..\Resources\car.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\cameraGimalPitch1.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\cameraGimalRoll1.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\frames_plus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\frames_x.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/Radio/3DRradio.Designer.cs b/Tools/ArdupilotMegaPlanner/Radio/3DRradio.Designer.cs index 407468d0f3..85dcfa24e7 100644 --- a/Tools/ArdupilotMegaPlanner/Radio/3DRradio.Designer.cs +++ b/Tools/ArdupilotMegaPlanner/Radio/3DRradio.Designer.cs @@ -101,6 +101,8 @@ this.groupBox1 = new System.Windows.Forms.GroupBox(); this.groupBox2 = new System.Windows.Forms.GroupBox(); this.label9 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.linkLabel1 = new System.Windows.Forms.LinkLabel(); this.SPLIT_local.Panel1.SuspendLayout(); this.SPLIT_local.Panel2.SuspendLayout(); this.SPLIT_local.SuspendLayout(); @@ -835,10 +837,25 @@ resources.ApplyResources(this.label9, "label9"); this.label9.Name = "label9"; // + // label10 + // + resources.ApplyResources(this.label10, "label10"); + this.label10.Name = "label10"; + // + // linkLabel1 + // + resources.ApplyResources(this.linkLabel1, "linkLabel1"); + this.linkLabel1.Name = "linkLabel1"; + this.linkLabel1.TabStop = true; + this.toolTip1.SetToolTip(this.linkLabel1, resources.GetString("linkLabel1.ToolTip")); + this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); + // // _3DRradio // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.linkLabel1); + this.Controls.Add(this.label10); this.Controls.Add(this.groupBox2); this.Controls.Add(this.groupBox1); this.Controls.Add(this.BUT_Syncoptions); @@ -942,5 +959,7 @@ private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.LinkLabel linkLabel1; } } \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/Radio/3DRradio.cs b/Tools/ArdupilotMegaPlanner/Radio/3DRradio.cs index a9d474bb8e..2da4e1e6bf 100644 --- a/Tools/ArdupilotMegaPlanner/Radio/3DRradio.cs +++ b/Tools/ArdupilotMegaPlanner/Radio/3DRradio.cs @@ -17,7 +17,7 @@ using System.Text.RegularExpressions; namespace ArdupilotMega { - public partial class _3DRradio : BackStageViewContentPanel + public partial class _3DRradio : UserControl { public delegate void LogEventHandler(string message, int level = 0); @@ -719,5 +719,14 @@ namespace ArdupilotMega SPLIT_local.Panel2Collapsed = !CHK_advanced.Checked; SPLIT_remote.Panel2Collapsed = !CHK_advanced.Checked; } + + private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + CustomMessageBox.Show(@"The 3DR Radios have 2 status LEDs, one red and one green. +green LED blinking - searching for another radio +green LED solid - link is established with another radio +red LED flashing - transmitting data +red LED solid - in firmware update mode"); + } } } \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/Radio/3DRradio.resx b/Tools/ArdupilotMegaPlanner/Radio/3DRradio.resx index 6817cb57c5..df00f160bf 100644 --- a/Tools/ArdupilotMegaPlanner/Radio/3DRradio.resx +++ b/Tools/ArdupilotMegaPlanner/Radio/3DRradio.resx @@ -138,8 +138,11 @@ $this - 7 + 9 + + 17, 17 + 115 @@ -176,9 +179,6 @@ 4 - - 17, 17 - Serial baud rate in rounded kbps. So 57 means 57600. @@ -733,6 +733,9 @@ 14 + + 17, 17 + 83, 191 @@ -1799,13 +1802,13 @@ which result in a valid packet CRC BUT_savesettings - ArdupilotMega.Controls.MyButton, 3DRRadio, Version=0.6.4521.12642, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.14832, Culture=neutral, PublicKeyToken=null $this - 4 + 6 269, 3 @@ -1823,13 +1826,13 @@ which result in a valid packet CRC BUT_getcurrent - ArdupilotMega.Controls.MyButton, 3DRRadio, Version=0.6.4521.12642, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.14832, Culture=neutral, PublicKeyToken=null $this - 5 + 7 12, 361 @@ -1850,7 +1853,7 @@ which result in a valid packet CRC $this - 6 + 8 419, 3 @@ -1868,13 +1871,13 @@ which result in a valid packet CRC BUT_upload - ArdupilotMega.Controls.MyButton, 3DRRadio, Version=0.6.4521.12642, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.14832, Culture=neutral, PublicKeyToken=null $this - 8 + 10 True @@ -2550,7 +2553,7 @@ which result in a valid packet CRC $this - 3 + 5 False @@ -2574,13 +2577,13 @@ which result in a valid packet CRC BUT_Syncoptions - ArdupilotMega.Controls.MyButton, 3DRRadio, Version=0.6.4521.12642, Culture=neutral, PublicKeyToken=null + ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner10, Version=1.1.4585.14832, Culture=neutral, PublicKeyToken=null $this - 2 + 4 210, 12 @@ -2625,25 +2628,7 @@ which result in a valid packet CRC $this - 1 - - - True - - - NoControl - - - 12, 15 - - - 42, 13 - - - 37 - - - Version + 3 label9 @@ -2679,6 +2664,97 @@ which result in a valid packet CRC $this + 2 + + + True + + + NoControl + + + 12, 15 + + + 42, 13 + + + 37 + + + Version + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + True + + + NoControl + + + 9, 11 + + + 0, 13 + + + 82 + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 689, 11 + + + 63, 13 + + + 83 + + + Status Leds + + + The 3DR Radios have 2 status LEDs, one red and one green. +green LED blinking - searching for another radio +green LED solid - link is established with another radio +red LED flashing - transmitting data +red LED solid - in firmware update mode + + + linkLabel1 + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + 0 @@ -2700,6 +2776,6 @@ which result in a valid packet CRC _3DRradio - ArdupilotMega.Controls.BackstageView.BackStageViewContentPanel, 3DRRadio, Version=0.6.4521.12642, Culture=neutral, PublicKeyToken=null + System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 \ No newline at end of file diff --git a/Tools/ArdupilotMegaPlanner/Resources/new frames-05X.png b/Tools/ArdupilotMegaPlanner/Resources/new frames-05X.png new file mode 100644 index 0000000000000000000000000000000000000000..0cb3b8b81a0801e81cd7c6c3288aa0a6873398b5 GIT binary patch literal 133811 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�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 Ny+TWWQ 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 path.Value.Split(new []{ ParameterMetaDataConstants.PathDelimeter }, StringSplitOptions.None) .ForEach(separatedPath => { + log.Info("Process "+ node.Key + " : " + separatedPath); // Match based on the regex defined at the top of this class Match pathMatch = _parentDirectoryRegex.Match(separatedPath); if (pathMatch.Success && pathMatch.Groups["Path"] != null && !String.IsNullOrEmpty(pathMatch.Groups["Path"].Value)) diff --git a/Tools/ArdupilotMegaPlanner/Utilities/ParameterMetaDataRepository.cs b/Tools/ArdupilotMegaPlanner/Utilities/ParameterMetaDataRepository.cs index d91cbf2b9a..a6380ac1e7 100644 --- a/Tools/ArdupilotMegaPlanner/Utilities/ParameterMetaDataRepository.cs +++ b/Tools/ArdupilotMegaPlanner/Utilities/ParameterMetaDataRepository.cs @@ -21,7 +21,7 @@ namespace ArdupilotMega.Utilities public void Reload() { - string paramMetaDataXMLFileName = String.Format("{0}\\{1}", Application.StartupPath, ConfigurationManager.AppSettings["ParameterMetaDataXMLFileName"]); + string paramMetaDataXMLFileName = String.Format("{0}{1}{2}", Application.StartupPath, Path.DirectorySeparatorChar, ConfigurationManager.AppSettings["ParameterMetaDataXMLFileName"]); try { if (File.Exists(paramMetaDataXMLFileName)) diff --git a/Tools/ArdupilotMegaPlanner/Utilities/ThemeManager.cs b/Tools/ArdupilotMegaPlanner/Utilities/ThemeManager.cs index 739a59ad92..49312b2664 100644 --- a/Tools/ArdupilotMegaPlanner/Utilities/ThemeManager.cs +++ b/Tools/ArdupilotMegaPlanner/Utilities/ThemeManager.cs @@ -105,7 +105,7 @@ namespace ArdupilotMega.Utilities DomainUpDown txt = (DomainUpDown)ctl; txt.BorderStyle = BorderStyle.None; } - else if (ctl.GetType() == typeof(GroupBox)) + else if (ctl.GetType() == typeof(GroupBox) || ctl.GetType() == typeof(UserControl)) { ctl.BackColor = BGColor; ctl.ForeColor = TextColor;// Color.FromArgb(0xe6, 0xe8, 0xea); diff --git a/Tools/ArdupilotMegaPlanner/georefimage.cs b/Tools/ArdupilotMegaPlanner/georefimage.cs index 363fd7679f..e24fe4b5f8 100644 --- a/Tools/ArdupilotMegaPlanner/georefimage.cs +++ b/Tools/ArdupilotMegaPlanner/georefimage.cs @@ -215,13 +215,20 @@ namespace ArdupilotMega imagetotime = new Hashtable(); //logFile = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM\2011-10-01 11-48 1.log"; + TXT_outputlog.AppendText("Read Log\n"); List list = readLog(logFile); + TXT_outputlog.AppendText("Log Read\n"); + //dirWithImages = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM"; + TXT_outputlog.AppendText("Read images\n"); + string[] files = Directory.GetFiles(dirWithImages); + TXT_outputlog.AppendText("images read\n"); + Document kml = new Document(); StreamWriter sw4 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "loglocation.csv"); @@ -242,6 +249,8 @@ namespace ArdupilotMega int lastmatchindex = 0; + TXT_outputlog.AppendText("start Processing\n"); + foreach (string filename in files) { if (filename.ToLower().EndsWith(".jpg") && !filename.ToLower().Contains("_geotag")) @@ -277,7 +286,9 @@ namespace ArdupilotMega if (lastmatchindex > (a)) continue; - //Application.DoEvents(); + + if (a % 1000 == 0) + Application.DoEvents(); DateTime logdt = startTime.AddMilliseconds(int.Parse(arr[1])).AddSeconds(offsetseconds); @@ -293,6 +304,13 @@ namespace ArdupilotMega first++; } + // time has past, logs are in time order + if (photodt < logdt.AddSeconds(-1)) + { + lastmatchindex = a; + break; + } + //Console.Write("ph " + dt + " log " + crap + " \r"); diff --git a/Tools/ArdupilotMegaPlanner/srtm.cs b/Tools/ArdupilotMegaPlanner/srtm.cs index a17ca82748..6efa01b991 100644 --- a/Tools/ArdupilotMegaPlanner/srtm.cs +++ b/Tools/ArdupilotMegaPlanner/srtm.cs @@ -277,7 +277,7 @@ namespace ArdupilotMega } } catch { } - Thread.Sleep(500); + Thread.Sleep(1000); } } diff --git a/Tools/ArdupilotMegaPlanner/temp.cs b/Tools/ArdupilotMegaPlanner/temp.cs index f8170db65b..f77fc00b7c 100644 --- a/Tools/ArdupilotMegaPlanner/temp.cs +++ b/Tools/ArdupilotMegaPlanner/temp.cs @@ -31,11 +31,11 @@ namespace ArdupilotMega if (System.Diagnostics.Debugger.IsAttached) { - ArdupilotMega.Controls.OpenGLtest ogl = new Controls.OpenGLtest(); + // ArdupilotMega.Controls.OpenGLtest ogl = new Controls.OpenGLtest(); - this.Controls.Add(ogl); + // this.Controls.Add(ogl); - ogl.Dock = DockStyle.Fill; + // ogl.Dock = DockStyle.Fill; } }