diff --git a/Tools/ArdupilotMegaPlanner/ArdupilotMega.csproj b/Tools/ArdupilotMegaPlanner/ArdupilotMega.csproj
index 1413297211..660aa3d655 100644
--- a/Tools/ArdupilotMegaPlanner/ArdupilotMega.csproj
+++ b/Tools/ArdupilotMegaPlanner/ArdupilotMega.csproj
@@ -152,7 +152,7 @@
False
- False
+ True
diff --git a/Tools/ArdupilotMegaPlanner/Controls/HUD.cs b/Tools/ArdupilotMegaPlanner/Controls/HUD.cs
index 57df0acbd4..fe38edf6d5 100644
--- a/Tools/ArdupilotMegaPlanner/Controls/HUD.cs
+++ b/Tools/ArdupilotMegaPlanner/Controls/HUD.cs
@@ -810,8 +810,8 @@ namespace ArdupilotMega.Controls
//draw pitch
- int lengthshort = this.Width / 12;
- int lengthlong = this.Width / 8;
+ int lengthshort = this.Width / 14;
+ int lengthlong = this.Width / 10;
for (int a = -90; a <= 90; a += 5)
{
@@ -996,11 +996,11 @@ namespace ArdupilotMega.Controls
if (Math.Abs(_heading - _targetheading) < 4)
{
- drawstring(graphicsObject, (heading % 360).ToString("0").PadLeft(3), font, fontsize, Brushes.Green, headbg.Width / 2 - (fontsize * 1f), headbg.Bottom - 24 - (int)(fontoffset * 1.7));
+ drawstring(graphicsObject, (heading % 360).ToString("0").PadLeft(3), font, fontsize, whiteBrush, headbg.Width / 2 - (fontsize * 1f), headbg.Bottom - 24 - (int)(fontoffset * 1.7));
}
else
{
- drawstring(graphicsObject, (heading % 360).ToString("0").PadLeft(3), font, fontsize, Brushes.Red, headbg.Width / 2 - (fontsize * 1f), headbg.Bottom - 24 - (int)(fontoffset * 1.7));
+ drawstring(graphicsObject, (heading % 360).ToString("0").PadLeft(3), font, fontsize, whiteBrush, headbg.Width / 2 - (fontsize * 1f), headbg.Bottom - 24 - (int)(fontoffset * 1.7));
}
// Console.WriteLine("HUD 0 " + (DateTime.Now - starttime).TotalMilliseconds + " " + DateTime.Now.Millisecond);
diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigPlanner.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigPlanner.cs
index f1e8803610..9626727278 100644
--- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigPlanner.cs
+++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigPlanner.cs
@@ -1,551 +1,550 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Globalization;
-using System.Linq;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Windows.Forms;
-using DirectShowLib;
-using ArdupilotMega.Controls.BackstageView;
-using ArdupilotMega.Controls;
-using ArdupilotMega.Utilities;
-using System.Threading;
-
-namespace ArdupilotMega.GCSViews.ConfigurationView
-{
- public partial class ConfigPlanner : BackStageViewContentPanel
- {
- private bool startup = false;
- List languages = new List();
-
- public ConfigPlanner()
- {
- InitializeComponent();
- }
-
-
- private void BUT_videostart_Click(object sender, EventArgs e)
- {
- // stop first
- BUT_videostop_Click(sender, e);
-
- var bmp = (GCSViews.Configuration.GCSBitmapInfo)CMB_videoresolutions.SelectedItem;
-
- try
- {
- MainV2.cam = new WebCamService.Capture(CMB_videosources.SelectedIndex, bmp.Media);
-
- MainV2.cam.showhud = CHK_hudshow.Checked;
-
- MainV2.cam.Start();
-
- MainV2.config["video_options"] = CMB_videoresolutions.SelectedIndex;
-
- BUT_videostart.Enabled = false;
- }
- catch (Exception ex) { CustomMessageBox.Show("Camera Fail: " + ex.Message); }
-
- }
-
- private void BUT_videostop_Click(object sender, EventArgs e)
- {
- BUT_videostart.Enabled = true;
- if (MainV2.cam != null)
- {
- MainV2.cam.Dispose();
- MainV2.cam = null;
- }
- }
-
- private void CMB_videosources_MouseClick(object sender, MouseEventArgs e)
- {
- // the reason why i dont populate this list is because on linux/mac this call will fail.
- WebCamService.Capture capt = new WebCamService.Capture();
-
- List devices = WebCamService.Capture.getDevices();
-
- CMB_videosources.DataSource = devices;
-
- capt.Dispose();
- }
-
- private void CMB_videosources_SelectedIndexChanged(object sender, EventArgs e)
- {
- int hr;
- int count;
- int size;
- object o;
- IBaseFilter capFilter = null;
- ICaptureGraphBuilder2 capGraph = null;
- AMMediaType media = null;
- VideoInfoHeader v;
- VideoStreamConfigCaps c;
- List modes = new List();
-
- // Get the ICaptureGraphBuilder2
- capGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
- IFilterGraph2 m_FilterGraph = (IFilterGraph2)new FilterGraph();
-
- DsDevice[] capDevices;
- capDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
-
- // Add the video device
- hr = m_FilterGraph.AddSourceFilterForMoniker(capDevices[CMB_videosources.SelectedIndex].Mon, null, "Video input", out capFilter);
- try
- {
- DsError.ThrowExceptionForHR(hr);
- }
- catch (Exception ex)
- {
- CustomMessageBox.Show("Can not add video source\n" + ex.ToString());
- return;
- }
-
- // Find the stream config interface
- hr = capGraph.FindInterface(PinCategory.Capture, MediaType.Video, capFilter, typeof(IAMStreamConfig).GUID, out o);
- DsError.ThrowExceptionForHR(hr);
-
- IAMStreamConfig videoStreamConfig = o as IAMStreamConfig;
- if (videoStreamConfig == null)
- {
- throw new Exception("Failed to get IAMStreamConfig");
- }
-
- hr = videoStreamConfig.GetNumberOfCapabilities(out count, out size);
- DsError.ThrowExceptionForHR(hr);
- IntPtr TaskMemPointer = Marshal.AllocCoTaskMem(size);
- for (int i = 0; i < count; i++)
- {
- IntPtr ptr = IntPtr.Zero;
-
- hr = videoStreamConfig.GetStreamCaps(i, out media, TaskMemPointer);
- v = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader));
- c = (VideoStreamConfigCaps)Marshal.PtrToStructure(TaskMemPointer, typeof(VideoStreamConfigCaps));
- modes.Add(new GCSViews.Configuration.GCSBitmapInfo(v.BmiHeader.Width, v.BmiHeader.Height, c.MaxFrameInterval, c.VideoStandard.ToString(), media));
- }
- Marshal.FreeCoTaskMem(TaskMemPointer);
- DsUtils.FreeAMMediaType(media);
-
- CMB_videoresolutions.DataSource = modes;
-
- if (MainV2.getConfig("video_options") != "" && CMB_videosources.Text != "")
- {
- CMB_videoresolutions.SelectedIndex = int.Parse(MainV2.getConfig("video_options"));
- }
- }
-
- private void CHK_hudshow_CheckedChanged(object sender, EventArgs e)
- {
- GCSViews.FlightData.myhud.hudon = CHK_hudshow.Checked;
- }
-
- private void CHK_enablespeech_CheckedChanged(object sender, EventArgs e)
- {
- MainV2.speechEnable = CHK_enablespeech.Checked;
- MainV2.config["speechenable"] = CHK_enablespeech.Checked;
- if (MainV2.speechEngine != null)
- MainV2.speechEngine.SpeakAsyncCancelAll();
- }
-
- private void CMB_language_SelectedIndexChanged(object sender, EventArgs e)
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Globalization;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Windows.Forms;
+using DirectShowLib;
+using ArdupilotMega.Controls.BackstageView;
+using ArdupilotMega.Controls;
+using ArdupilotMega.Utilities;
+using System.Threading;
+
+namespace ArdupilotMega.GCSViews.ConfigurationView
+{
+ public partial class ConfigPlanner : BackStageViewContentPanel
+ {
+ private bool startup = false;
+ List languages = new List();
+
+ public ConfigPlanner()
+ {
+ InitializeComponent();
+ }
+
+
+ private void BUT_videostart_Click(object sender, EventArgs e)
+ {
+ // stop first
+ BUT_videostop_Click(sender, e);
+
+ var bmp = (GCSViews.Configuration.GCSBitmapInfo)CMB_videoresolutions.SelectedItem;
+
+ try
+ {
+ MainV2.cam = new WebCamService.Capture(CMB_videosources.SelectedIndex, bmp.Media);
+
+ MainV2.cam.showhud = CHK_hudshow.Checked;
+
+ MainV2.cam.Start();
+
+ MainV2.config["video_options"] = CMB_videoresolutions.SelectedIndex;
+
+ BUT_videostart.Enabled = false;
+ }
+ catch (Exception ex) { CustomMessageBox.Show("Camera Fail: " + ex.Message); }
+
+ }
+
+ private void BUT_videostop_Click(object sender, EventArgs e)
+ {
+ BUT_videostart.Enabled = true;
+ if (MainV2.cam != null)
+ {
+ MainV2.cam.Dispose();
+ MainV2.cam = null;
+ }
+ }
+
+ private void CMB_videosources_MouseClick(object sender, MouseEventArgs e)
+ {
+ // the reason why i dont populate this list is because on linux/mac this call will fail.
+ WebCamService.Capture capt = new WebCamService.Capture();
+
+ List devices = WebCamService.Capture.getDevices();
+
+ CMB_videosources.DataSource = devices;
+
+ capt.Dispose();
+ }
+
+ private void CMB_videosources_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ int hr;
+ int count;
+ int size;
+ object o;
+ IBaseFilter capFilter = null;
+ ICaptureGraphBuilder2 capGraph = null;
+ AMMediaType media = null;
+ VideoInfoHeader v;
+ VideoStreamConfigCaps c;
+ List modes = new List();
+
+ // Get the ICaptureGraphBuilder2
+ capGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
+ IFilterGraph2 m_FilterGraph = (IFilterGraph2)new FilterGraph();
+
+ DsDevice[] capDevices;
+ capDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
+
+ // Add the video device
+ hr = m_FilterGraph.AddSourceFilterForMoniker(capDevices[CMB_videosources.SelectedIndex].Mon, null, "Video input", out capFilter);
+ try
+ {
+ DsError.ThrowExceptionForHR(hr);
+ }
+ catch (Exception ex)
+ {
+ CustomMessageBox.Show("Can not add video source\n" + ex.ToString());
+ return;
+ }
+
+ // Find the stream config interface
+ hr = capGraph.FindInterface(PinCategory.Capture, MediaType.Video, capFilter, typeof(IAMStreamConfig).GUID, out o);
+ DsError.ThrowExceptionForHR(hr);
+
+ IAMStreamConfig videoStreamConfig = o as IAMStreamConfig;
+ if (videoStreamConfig == null)
+ {
+ throw new Exception("Failed to get IAMStreamConfig");
+ }
+
+ hr = videoStreamConfig.GetNumberOfCapabilities(out count, out size);
+ DsError.ThrowExceptionForHR(hr);
+ IntPtr TaskMemPointer = Marshal.AllocCoTaskMem(size);
+ for (int i = 0; i < count; i++)
+ {
+ IntPtr ptr = IntPtr.Zero;
+
+ hr = videoStreamConfig.GetStreamCaps(i, out media, TaskMemPointer);
+ v = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader));
+ c = (VideoStreamConfigCaps)Marshal.PtrToStructure(TaskMemPointer, typeof(VideoStreamConfigCaps));
+ modes.Add(new GCSViews.Configuration.GCSBitmapInfo(v.BmiHeader.Width, v.BmiHeader.Height, c.MaxFrameInterval, c.VideoStandard.ToString(), media));
+ }
+ Marshal.FreeCoTaskMem(TaskMemPointer);
+ DsUtils.FreeAMMediaType(media);
+
+ CMB_videoresolutions.DataSource = modes;
+
+ if (MainV2.getConfig("video_options") != "" && CMB_videosources.Text != "")
+ {
+ CMB_videoresolutions.SelectedIndex = int.Parse(MainV2.getConfig("video_options"));
+ }
+ }
+
+ private void CHK_hudshow_CheckedChanged(object sender, EventArgs e)
+ {
+ GCSViews.FlightData.myhud.hudon = CHK_hudshow.Checked;
+ }
+
+ private void CHK_enablespeech_CheckedChanged(object sender, EventArgs e)
+ {
+ MainV2.speechEnable = CHK_enablespeech.Checked;
+ MainV2.config["speechenable"] = CHK_enablespeech.Checked;
+ if (MainV2.speechEngine != null)
+ MainV2.speechEngine.SpeakAsyncCancelAll();
+ }
+
+ private void CMB_language_SelectedIndexChanged(object sender, EventArgs e)
{
if (startup)
- return;
-
- MainV2.instance.changelanguage((CultureInfo)CMB_language.SelectedItem);
-
-#if !DEBUG
- MessageBox.Show("Please Restart the Planner");
-
- Application.Exit();
-#endif
- }
-
- private void CMB_osdcolor_SelectedIndexChanged(object sender, EventArgs e)
- {
- if (startup)
- return;
- if (CMB_osdcolor.Text != "")
- {
- MainV2.config["hudcolor"] = CMB_osdcolor.Text;
- GCSViews.FlightData.myhud.hudcolor = Color.FromKnownColor((KnownColor)Enum.Parse(typeof(KnownColor), CMB_osdcolor.Text));
- }
- }
-
- private void CHK_speechwaypoint_CheckedChanged(object sender, EventArgs e)
- {
- if (startup)
- return;
- MainV2.config["speechwaypointenabled"] = ((CheckBox)sender).Checked.ToString();
-
- if (((CheckBox)sender).Checked)
- {
- string speechstring = "Heading to Waypoint {wpn}";
- if (MainV2.config["speechwaypoint"] != null)
- speechstring = MainV2.config["speechwaypoint"].ToString();
- Common.InputBox("Notification", "What do you want it to say?", ref speechstring);
- MainV2.config["speechwaypoint"] = speechstring;
- }
- }
-
- private void CHK_speechmode_CheckedChanged(object sender, EventArgs e)
- {
- if (startup)
- return;
- MainV2.config["speechmodeenabled"] = ((CheckBox)sender).Checked.ToString();
-
- if (((CheckBox)sender).Checked)
- {
- string speechstring = "Mode changed to {mode}";
- if (MainV2.config["speechmode"] != null)
- speechstring = MainV2.config["speechmode"].ToString();
- Common.InputBox("Notification", "What do you want it to say?", ref speechstring);
- MainV2.config["speechmode"] = speechstring;
- }
- }
-
- private void CHK_speechcustom_CheckedChanged(object sender, EventArgs e)
- {
- if (startup)
- return;
- MainV2.config["speechcustomenabled"] = ((CheckBox)sender).Checked.ToString();
-
- if (((CheckBox)sender).Checked)
- {
- string speechstring = "Heading to Waypoint {wpn}, altitude is {alt}, Ground speed is {gsp} ";
- if (MainV2.config["speechcustom"] != null)
- speechstring = MainV2.config["speechcustom"].ToString();
- Common.InputBox("Notification", "What do you want it to say?", ref speechstring);
- MainV2.config["speechcustom"] = speechstring;
- }
- }
-
- private void BUT_rerequestparams_Click(object sender, EventArgs e)
- {
- if (!MainV2.comPort.BaseStream.IsOpen)
- return;
- ((MyButton)sender).Enabled = false;
- try
- {
-
- MainV2.comPort.getParamList();
-
-
-
-
- }
- catch { CustomMessageBox.Show("Error: getting param list"); }
-
-
- ((MyButton)sender).Enabled = true;
- startup = true;
-
-
-
- startup = false;
- }
-
- private void CHK_speechbattery_CheckedChanged(object sender, EventArgs e)
- {
- if (startup)
- return;
- MainV2.config["speechbatteryenabled"] = ((CheckBox)sender).Checked.ToString();
-
- if (((CheckBox)sender).Checked)
- {
- string speechstring = "WARNING, Battery at {batv} Volt";
- if (MainV2.config["speechbattery"] != null)
- speechstring = MainV2.config["speechbattery"].ToString();
- Common.InputBox("Notification", "What do you want it to say?", ref speechstring);
- MainV2.config["speechbattery"] = speechstring;
-
- speechstring = "9.6";
- if (MainV2.config["speechbatteryvolt"] != null)
- speechstring = MainV2.config["speechbatteryvolt"].ToString();
- Common.InputBox("Battery Level", "What Voltage do you want to warn at?", ref speechstring);
- MainV2.config["speechbatteryvolt"] = speechstring;
-
- }
- }
-
- private void BUT_Joystick_Click(object sender, EventArgs e)
- {
- Form joy = new JoystickSetup();
- ThemeManager.ApplyThemeTo(joy);
- joy.Show();
- }
-
- private void CMB_distunits_SelectedIndexChanged(object sender, EventArgs e)
- {
- if (startup)
- return;
- MainV2.config["distunits"] = CMB_distunits.Text;
- MainV2.instance.ChangeUnits();
- }
-
- private void CMB_speedunits_SelectedIndexChanged(object sender, EventArgs e)
- {
- if (startup)
- return;
- MainV2.config["speedunits"] = CMB_speedunits.Text;
- MainV2.instance.ChangeUnits();
- }
-
- private void CMB_rateattitude_SelectedIndexChanged(object sender, EventArgs e)
- {
- if (startup)
- return;
- MainV2.config[((ComboBox)sender).Name] = ((ComboBox)sender).Text;
- MainV2.cs.rateattitude = byte.Parse(((ComboBox)sender).Text);
-
- MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.EXTRA1, MainV2.cs.rateattitude); // request attitude
- MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.EXTRA2, MainV2.cs.rateattitude); // request vfr
- }
-
- private void CMB_rateposition_SelectedIndexChanged(object sender, EventArgs e)
- {
- if (startup)
- return;
- MainV2.config[((ComboBox)sender).Name] = ((ComboBox)sender).Text;
- MainV2.cs.rateposition = byte.Parse(((ComboBox)sender).Text);
-
- MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.POSITION, MainV2.cs.rateposition); // request gps
- }
-
- private void CMB_ratestatus_SelectedIndexChanged(object sender, EventArgs e)
- {
- if (startup)
- return;
- MainV2.config[((ComboBox)sender).Name] = ((ComboBox)sender).Text;
- MainV2.cs.ratestatus = byte.Parse(((ComboBox)sender).Text);
-
- MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.EXTENDED_STATUS, MainV2.cs.ratestatus); // mode
- }
-
- private void CMB_raterc_SelectedIndexChanged(object sender, EventArgs e)
- {
- if (startup)
- return;
- MainV2.config[((ComboBox)sender).Name] = ((ComboBox)sender).Text;
- MainV2.cs.raterc = byte.Parse(((ComboBox)sender).Text);
-
- MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.RC_CHANNELS, MainV2.cs.raterc); // request rc info
- }
-
- private void CMB_ratesensors_SelectedIndexChanged(object sender, EventArgs e)
- {
- if (startup)
- return;
- MainV2.config[((ComboBox)sender).Name] = ((ComboBox)sender).Text;
- MainV2.cs.ratesensors = byte.Parse(((ComboBox)sender).Text);
-
- MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.EXTRA3, MainV2.cs.ratesensors); // request extra stuff - tridge
- MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.RAW_SENSORS, MainV2.cs.ratesensors); // request raw sensor
- }
-
- private void CHK_mavdebug_CheckedChanged(object sender, EventArgs e)
- {
- MainV2.comPort.debugmavlink = CHK_mavdebug.Checked;
- }
-
- private void CHK_resetapmonconnect_CheckedChanged(object sender, EventArgs e)
- {
- MainV2.config[((CheckBox)sender).Name] = ((CheckBox)sender).Checked.ToString();
- }
-
- private void CHK_speechaltwarning_CheckedChanged(object sender, EventArgs e)
- {
- if (startup)
- return;
- MainV2.config["speechaltenabled"] = ((CheckBox)sender).Checked.ToString();
-
- if (((CheckBox)sender).Checked)
- {
- string speechstring = "WARNING, low altitude {alt}";
- if (MainV2.config["speechalt"] != null)
- speechstring = MainV2.config["speechalt"].ToString();
- Common.InputBox("Notification", "What do you want it to say?", ref speechstring);
- MainV2.config["speechalt"] = speechstring;
-
- speechstring = "2";
- if (MainV2.config["speechaltheight"] != null)
- speechstring = MainV2.config["speechaltheight"].ToString();
- Common.InputBox("Min Alt", "What altitude do you want to warn at? (relative to home)", ref speechstring);
- MainV2.config["speechaltheight"] = (double.Parse(speechstring) / MainV2.cs.multiplierdist).ToString(); // save as m
-
- }
- }
-
- private void NUM_tracklength_ValueChanged(object sender, EventArgs e)
- {
- MainV2.config["NUM_tracklength"] = NUM_tracklength.Value.ToString();
-
- }
-
- private void CHK_loadwponconnect_CheckedChanged(object sender, EventArgs e)
- {
- MainV2.config["loadwpsonconnect"] = CHK_loadwponconnect.Checked.ToString();
- }
-
- private void CHK_GDIPlus_CheckedChanged(object sender, EventArgs e)
- {
- if (startup)
- return;
- CustomMessageBox.Show("You need to restart the planner for this to take effect");
- MainV2.config["CHK_GDIPlus"] = CHK_GDIPlus.Checked.ToString();
- }
-
- 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;
- }
-
- private void CMB_osdcolor_DrawItem(object sender, DrawItemEventArgs e)
- {
- if (e.Index < 0)
- return;
-
- Graphics g = e.Graphics;
- Rectangle rect = e.Bounds;
- Brush brush = null;
-
- if ((e.State & DrawItemState.Selected) == 0)
- brush = new SolidBrush(CMB_osdcolor.BackColor);
- else
- brush = SystemBrushes.Highlight;
-
- g.FillRectangle(brush, rect);
-
- brush = new SolidBrush(Color.FromName((string)CMB_osdcolor.Items[e.Index]));
-
- g.FillRectangle(brush, rect.X + 2, rect.Y + 2, 30, rect.Height - 4);
- g.DrawRectangle(Pens.Black, rect.X + 2, rect.Y + 2, 30, rect.Height - 4);
-
- if ((e.State & DrawItemState.Selected) == 0)
- brush = new SolidBrush(CMB_osdcolor.ForeColor);
- else
- brush = SystemBrushes.HighlightText;
- g.DrawString(CMB_osdcolor.Items[e.Index].ToString(),
- CMB_osdcolor.Font, brush, rect.X + 35, rect.Top + rect.Height - CMB_osdcolor.Font.Height);
- }
-
- private void CMB_videosources_Click(object sender, EventArgs e)
- {
- // the reason why i dont populate this list is because on linux/mac this call will fail.
- WebCamService.Capture capt = new WebCamService.Capture();
-
- List devices = WebCamService.Capture.getDevices();
-
- CMB_videosources.DataSource = devices;
-
- capt.Dispose();
- }
-
- private void CHK_maprotation_CheckedChanged(object sender, EventArgs e)
- {
- if (startup)
- return;
- MainV2.config["CHK_maprotation"] = CHK_maprotation.Checked.ToString();
- }
- }
-}
+ return;
+ MainV2.instance.changelanguage((CultureInfo)CMB_language.SelectedItem);
+
+#if !DEBUG
+ MessageBox.Show("Please Restart the Planner");
+
+ Application.Exit();
+#endif
+ }
+
+ private void CMB_osdcolor_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (startup)
+ return;
+ if (CMB_osdcolor.Text != "")
+ {
+ MainV2.config["hudcolor"] = CMB_osdcolor.Text;
+ GCSViews.FlightData.myhud.hudcolor = Color.FromKnownColor((KnownColor)Enum.Parse(typeof(KnownColor), CMB_osdcolor.Text));
+ }
+ }
+
+ private void CHK_speechwaypoint_CheckedChanged(object sender, EventArgs e)
+ {
+ if (startup)
+ return;
+ MainV2.config["speechwaypointenabled"] = ((CheckBox)sender).Checked.ToString();
+
+ if (((CheckBox)sender).Checked)
+ {
+ string speechstring = "Heading to Waypoint {wpn}";
+ if (MainV2.config["speechwaypoint"] != null)
+ speechstring = MainV2.config["speechwaypoint"].ToString();
+ Common.InputBox("Notification", "What do you want it to say?", ref speechstring);
+ MainV2.config["speechwaypoint"] = speechstring;
+ }
+ }
+
+ private void CHK_speechmode_CheckedChanged(object sender, EventArgs e)
+ {
+ if (startup)
+ return;
+ MainV2.config["speechmodeenabled"] = ((CheckBox)sender).Checked.ToString();
+
+ if (((CheckBox)sender).Checked)
+ {
+ string speechstring = "Mode changed to {mode}";
+ if (MainV2.config["speechmode"] != null)
+ speechstring = MainV2.config["speechmode"].ToString();
+ Common.InputBox("Notification", "What do you want it to say?", ref speechstring);
+ MainV2.config["speechmode"] = speechstring;
+ }
+ }
+
+ private void CHK_speechcustom_CheckedChanged(object sender, EventArgs e)
+ {
+ if (startup)
+ return;
+ MainV2.config["speechcustomenabled"] = ((CheckBox)sender).Checked.ToString();
+
+ if (((CheckBox)sender).Checked)
+ {
+ string speechstring = "Heading to Waypoint {wpn}, altitude is {alt}, Ground speed is {gsp} ";
+ if (MainV2.config["speechcustom"] != null)
+ speechstring = MainV2.config["speechcustom"].ToString();
+ Common.InputBox("Notification", "What do you want it to say?", ref speechstring);
+ MainV2.config["speechcustom"] = speechstring;
+ }
+ }
+
+ private void BUT_rerequestparams_Click(object sender, EventArgs e)
+ {
+ if (!MainV2.comPort.BaseStream.IsOpen)
+ return;
+ ((MyButton)sender).Enabled = false;
+ try
+ {
+
+ MainV2.comPort.getParamList();
+
+
+
+
+ }
+ catch { CustomMessageBox.Show("Error: getting param list"); }
+
+
+ ((MyButton)sender).Enabled = true;
+ startup = true;
+
+
+
+ startup = false;
+ }
+
+ private void CHK_speechbattery_CheckedChanged(object sender, EventArgs e)
+ {
+ if (startup)
+ return;
+ MainV2.config["speechbatteryenabled"] = ((CheckBox)sender).Checked.ToString();
+
+ if (((CheckBox)sender).Checked)
+ {
+ string speechstring = "WARNING, Battery at {batv} Volt";
+ if (MainV2.config["speechbattery"] != null)
+ speechstring = MainV2.config["speechbattery"].ToString();
+ Common.InputBox("Notification", "What do you want it to say?", ref speechstring);
+ MainV2.config["speechbattery"] = speechstring;
+
+ speechstring = "9.6";
+ if (MainV2.config["speechbatteryvolt"] != null)
+ speechstring = MainV2.config["speechbatteryvolt"].ToString();
+ Common.InputBox("Battery Level", "What Voltage do you want to warn at?", ref speechstring);
+ MainV2.config["speechbatteryvolt"] = speechstring;
+
+ }
+ }
+
+ private void BUT_Joystick_Click(object sender, EventArgs e)
+ {
+ Form joy = new JoystickSetup();
+ ThemeManager.ApplyThemeTo(joy);
+ joy.Show();
+ }
+
+ private void CMB_distunits_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (startup)
+ return;
+ MainV2.config["distunits"] = CMB_distunits.Text;
+ MainV2.instance.ChangeUnits();
+ }
+
+ private void CMB_speedunits_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (startup)
+ return;
+ MainV2.config["speedunits"] = CMB_speedunits.Text;
+ MainV2.instance.ChangeUnits();
+ }
+
+ private void CMB_rateattitude_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (startup)
+ return;
+ MainV2.config[((ComboBox)sender).Name] = ((ComboBox)sender).Text;
+ MainV2.cs.rateattitude = byte.Parse(((ComboBox)sender).Text);
+
+ MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.EXTRA1, MainV2.cs.rateattitude); // request attitude
+ MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.EXTRA2, MainV2.cs.rateattitude); // request vfr
+ }
+
+ private void CMB_rateposition_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (startup)
+ return;
+ MainV2.config[((ComboBox)sender).Name] = ((ComboBox)sender).Text;
+ MainV2.cs.rateposition = byte.Parse(((ComboBox)sender).Text);
+
+ MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.POSITION, MainV2.cs.rateposition); // request gps
+ }
+
+ private void CMB_ratestatus_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (startup)
+ return;
+ MainV2.config[((ComboBox)sender).Name] = ((ComboBox)sender).Text;
+ MainV2.cs.ratestatus = byte.Parse(((ComboBox)sender).Text);
+
+ MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.EXTENDED_STATUS, MainV2.cs.ratestatus); // mode
+ }
+
+ private void CMB_raterc_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (startup)
+ return;
+ MainV2.config[((ComboBox)sender).Name] = ((ComboBox)sender).Text;
+ MainV2.cs.raterc = byte.Parse(((ComboBox)sender).Text);
+
+ MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.RC_CHANNELS, MainV2.cs.raterc); // request rc info
+ }
+
+ private void CMB_ratesensors_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (startup)
+ return;
+ MainV2.config[((ComboBox)sender).Name] = ((ComboBox)sender).Text;
+ MainV2.cs.ratesensors = byte.Parse(((ComboBox)sender).Text);
+
+ MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.EXTRA3, MainV2.cs.ratesensors); // request extra stuff - tridge
+ MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.RAW_SENSORS, MainV2.cs.ratesensors); // request raw sensor
+ }
+
+ private void CHK_mavdebug_CheckedChanged(object sender, EventArgs e)
+ {
+ MainV2.comPort.debugmavlink = CHK_mavdebug.Checked;
+ }
+
+ private void CHK_resetapmonconnect_CheckedChanged(object sender, EventArgs e)
+ {
+ MainV2.config[((CheckBox)sender).Name] = ((CheckBox)sender).Checked.ToString();
+ }
+
+ private void CHK_speechaltwarning_CheckedChanged(object sender, EventArgs e)
+ {
+ if (startup)
+ return;
+ MainV2.config["speechaltenabled"] = ((CheckBox)sender).Checked.ToString();
+
+ if (((CheckBox)sender).Checked)
+ {
+ string speechstring = "WARNING, low altitude {alt}";
+ if (MainV2.config["speechalt"] != null)
+ speechstring = MainV2.config["speechalt"].ToString();
+ Common.InputBox("Notification", "What do you want it to say?", ref speechstring);
+ MainV2.config["speechalt"] = speechstring;
+
+ speechstring = "2";
+ if (MainV2.config["speechaltheight"] != null)
+ speechstring = MainV2.config["speechaltheight"].ToString();
+ Common.InputBox("Min Alt", "What altitude do you want to warn at? (relative to home)", ref speechstring);
+ MainV2.config["speechaltheight"] = (double.Parse(speechstring) / MainV2.cs.multiplierdist).ToString(); // save as m
+
+ }
+ }
+
+ private void NUM_tracklength_ValueChanged(object sender, EventArgs e)
+ {
+ MainV2.config["NUM_tracklength"] = NUM_tracklength.Value.ToString();
+
+ }
+
+ private void CHK_loadwponconnect_CheckedChanged(object sender, EventArgs e)
+ {
+ MainV2.config["loadwpsonconnect"] = CHK_loadwponconnect.Checked.ToString();
+ }
+
+ private void CHK_GDIPlus_CheckedChanged(object sender, EventArgs e)
+ {
+ if (startup)
+ return;
+ CustomMessageBox.Show("You need to restart the planner for this to take effect");
+ MainV2.config["CHK_GDIPlus"] = CHK_GDIPlus.Checked.ToString();
+ }
+
+ 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;
+ }
+
+ private void CMB_osdcolor_DrawItem(object sender, DrawItemEventArgs e)
+ {
+ if (e.Index < 0)
+ return;
+
+ Graphics g = e.Graphics;
+ Rectangle rect = e.Bounds;
+ Brush brush = null;
+
+ if ((e.State & DrawItemState.Selected) == 0)
+ brush = new SolidBrush(CMB_osdcolor.BackColor);
+ else
+ brush = SystemBrushes.Highlight;
+
+ g.FillRectangle(brush, rect);
+
+ brush = new SolidBrush(Color.FromName((string)CMB_osdcolor.Items[e.Index]));
+
+ g.FillRectangle(brush, rect.X + 2, rect.Y + 2, 30, rect.Height - 4);
+ g.DrawRectangle(Pens.Black, rect.X + 2, rect.Y + 2, 30, rect.Height - 4);
+
+ if ((e.State & DrawItemState.Selected) == 0)
+ brush = new SolidBrush(CMB_osdcolor.ForeColor);
+ else
+ brush = SystemBrushes.HighlightText;
+ g.DrawString(CMB_osdcolor.Items[e.Index].ToString(),
+ CMB_osdcolor.Font, brush, rect.X + 35, rect.Top + rect.Height - CMB_osdcolor.Font.Height);
+ }
+
+ private void CMB_videosources_Click(object sender, EventArgs e)
+ {
+ // the reason why i dont populate this list is because on linux/mac this call will fail.
+ WebCamService.Capture capt = new WebCamService.Capture();
+
+ List devices = WebCamService.Capture.getDevices();
+
+ CMB_videosources.DataSource = devices;
+
+ capt.Dispose();
+ }
+
+ private void CHK_maprotation_CheckedChanged(object sender, EventArgs e)
+ {
+ if (startup)
+ return;
+ MainV2.config["CHK_maprotation"] = CHK_maprotation.Checked.ToString();
+ }
+ }
+}
diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigPlanner.resx b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigPlanner.resx
index eb2fb01213..7836529e84 100644
--- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigPlanner.resx
+++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigPlanner.resx
@@ -1268,7 +1268,7 @@
BUT_Joystick
- ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.1.4507.18015, Culture=neutral, PublicKeyToken=null
+ ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.1.4498.31567, Culture=neutral, PublicKeyToken=null
$this
@@ -1295,7 +1295,7 @@
BUT_videostop
- ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.1.4507.18015, Culture=neutral, PublicKeyToken=null
+ ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.1.4498.31567, Culture=neutral, PublicKeyToken=null
$this
@@ -1322,7 +1322,7 @@
BUT_videostart
- ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.1.4507.18015, Culture=neutral, PublicKeyToken=null
+ ArdupilotMega.Controls.MyButton, ArdupilotMegaPlanner, Version=1.1.4498.31567, Culture=neutral, PublicKeyToken=null
$this
@@ -1397,6 +1397,6 @@
ConfigPlanner
- ArdupilotMega.Controls.BackstageView.BackStageViewContentPanel, ArdupilotMegaPlanner, Version=1.1.4507.18015, Culture=neutral, PublicKeyToken=null
+ ArdupilotMega.Controls.BackstageView.BackStageViewContentPanel, ArdupilotMegaPlanner, Version=1.1.4498.31567, Culture=neutral, PublicKeyToken=null
\ No newline at end of file
diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/Setup.Designer.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/Setup.Designer.cs
index d37d804e86..329224c512 100644
--- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/Setup.Designer.cs
+++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/Setup.Designer.cs
@@ -37,15 +37,15 @@
this.backstageView.Dock = System.Windows.Forms.DockStyle.Fill;
this.backstageView.Location = new System.Drawing.Point(0, 0);
this.backstageView.Name = "backstageView";
- this.backstageView.Size = new System.Drawing.Size(947, 506);
+ this.backstageView.Size = new System.Drawing.Size(1008, 506);
this.backstageView.TabIndex = 0;
//
// Setup
//
this.Controls.Add(this.backstageView);
- this.MinimumSize = new System.Drawing.Size(947, 506);
+ this.MinimumSize = new System.Drawing.Size(1000, 450);
this.Name = "Setup";
- this.Size = new System.Drawing.Size(947, 506);
+ this.Size = new System.Drawing.Size(1008, 506);
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Setup_FormClosing);
this.Load += new System.EventHandler(this.Setup_Load);
this.ResumeLayout(false);
diff --git a/Tools/ArdupilotMegaPlanner/Msi/googlecode_upload.py b/Tools/ArdupilotMegaPlanner/Msi/googlecode_upload.py
new file mode 100644
index 0000000000..16912361ee
--- /dev/null
+++ b/Tools/ArdupilotMegaPlanner/Msi/googlecode_upload.py
@@ -0,0 +1,256 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, 2007 Google Inc. All Rights Reserved.
+# Author: danderson@google.com (David Anderson)
+#
+# Script for uploading files to a Google Code project.
+#
+# This is intended to be both a useful script for people who want to
+# streamline project uploads and a reference implementation for
+# uploading files to Google Code projects.
+#
+# To upload a file to Google Code, you need to provide a path to the
+# file on your local machine, a small summary of what the file is, a
+# project name, and a valid account that is a member or owner of that
+# project. You can optionally provide a list of labels that apply to
+# the file. The file will be uploaded under the same name that it has
+# in your local filesystem (that is, the "basename" or last path
+# component). Run the script with '--help' to get the exact syntax
+# and available options.
+#
+# Note that the upload script requests that you enter your
+# googlecode.com password. This is NOT your Gmail account password!
+# This is the password you use on googlecode.com for committing to
+# Subversion and uploading files. You can find your password by going
+# to http://code.google.com/hosting/settings when logged in with your
+# Gmail account. If you have already committed to your project's
+# Subversion repository, the script will automatically retrieve your
+# credentials from there (unless disabled, see the output of '--help'
+# for details).
+#
+# If you are looking at this script as a reference for implementing
+# your own Google Code file uploader, then you should take a look at
+# the upload() function, which is the meat of the uploader. You
+# basically need to build a multipart/form-data POST request with the
+# right fields and send it to https://PROJECT.googlecode.com/files .
+# Authenticate the request using HTTP Basic authentication, as is
+# shown below.
+#
+# Licensed under the terms of the Apache Software License 2.0:
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Questions, comments, feature requests and patches are most welcome.
+# Please direct all of these to the Google Code users group:
+# http://groups.google.com/group/google-code-hosting
+
+"""Google Code file uploader script.
+"""
+
+__author__ = 'danderson@google.com (David Anderson)'
+
+import httplib
+import os.path
+import optparse
+import getpass
+import base64
+import sys
+
+
+def upload(file, project_name, user_name, password, summary, labels=None):
+ """Upload a file to a Google Code project's file server.
+
+ Args:
+ file: The local path to the file.
+ project_name: The name of your project on Google Code.
+ user_name: Your Google account name.
+ password: The googlecode.com password for your account.
+ Note that this is NOT your global Google Account password!
+ summary: A small description for the file.
+ labels: an optional list of label strings with which to tag the file.
+
+ Returns: a tuple:
+ http_status: 201 if the upload succeeded, something else if an
+ error occured.
+ http_reason: The human-readable string associated with http_status
+ file_url: If the upload succeeded, the URL of the file on Google
+ Code, None otherwise.
+ """
+ # The login is the user part of user@gmail.com. If the login provided
+ # is in the full user@domain form, strip it down.
+ if user_name.endswith('@gmail.com'):
+ user_name = user_name[:user_name.index('@gmail.com')]
+
+ form_fields = [('summary', summary)]
+ if labels is not None:
+ form_fields.extend([('label', l.strip()) for l in labels])
+
+ content_type, body = encode_upload_request(form_fields, file)
+
+ upload_host = '%s.googlecode.com' % project_name
+ upload_uri = '/files'
+ auth_token = base64.b64encode('%s:%s'% (user_name, password))
+ headers = {
+ 'Authorization': 'Basic %s' % auth_token,
+ 'User-Agent': 'Googlecode.com uploader v0.9.4',
+ 'Content-Type': content_type,
+ }
+
+ server = httplib.HTTPSConnection(upload_host)
+ server.request('POST', upload_uri, body, headers)
+ resp = server.getresponse()
+ server.close()
+
+ if resp.status == 201:
+ location = resp.getheader('Location', None)
+ else:
+ location = None
+ return resp.status, resp.reason, location
+
+
+def encode_upload_request(fields, file_path):
+ """Encode the given fields and file into a multipart form body.
+
+ fields is a sequence of (name, value) pairs. file is the path of
+ the file to upload. The file will be uploaded to Google Code with
+ the same file name.
+
+ Returns: (content_type, body) ready for httplib.HTTP instance
+ """
+ BOUNDARY = '----------Googlecode_boundary_reindeer_flotilla'
+ CRLF = '\r\n'
+
+ body = []
+
+ # Add the metadata about the upload first
+ for key, value in fields:
+ body.extend(
+ ['--' + BOUNDARY,
+ 'Content-Disposition: form-data; name="%s"' % key,
+ '',
+ value,
+ ])
+
+ # Now add the file itself
+ file_name = os.path.basename(file_path)
+ f = open(file_path, 'rb')
+ file_content = f.read()
+ f.close()
+
+ body.extend(
+ ['--' + BOUNDARY,
+ 'Content-Disposition: form-data; name="filename"; filename="%s"'
+ % file_name,
+ # The upload server determines the mime-type, no need to set it.
+ 'Content-Type: application/octet-stream',
+ '',
+ file_content,
+ ])
+
+ # Finalize the form body
+ body.extend(['--' + BOUNDARY + '--', ''])
+
+ return 'multipart/form-data; boundary=%s' % BOUNDARY, CRLF.join(body)
+
+
+def upload_find_auth(file_path, project_name, summary, labels=None,
+ user_name=None, password=None, tries=3):
+ """Find credentials and upload a file to a Google Code project's file server.
+
+ file_path, project_name, summary, and labels are passed as-is to upload.
+
+ Args:
+ file_path: The local path to the file.
+ project_name: The name of your project on Google Code.
+ summary: A small description for the file.
+ labels: an optional list of label strings with which to tag the file.
+ config_dir: Path to Subversion configuration directory, 'none', or None.
+ user_name: Your Google account name.
+ tries: How many attempts to make.
+ """
+ if user_name is None or password is None:
+ from netrc import netrc
+ authenticators = netrc().authenticators("code.google.com")
+ if authenticators:
+ if user_name is None:
+ user_name = authenticators[0]
+ if password is None:
+ password = authenticators[2]
+
+ while tries > 0:
+ if user_name is None:
+ # Read username if not specified or loaded from svn config, or on
+ # subsequent tries.
+ sys.stdout.write('Please enter your googlecode.com username: ')
+ sys.stdout.flush()
+ user_name = sys.stdin.readline().rstrip()
+ if password is None:
+ # Read password if not loaded from svn config, or on subsequent tries.
+ print 'Please enter your googlecode.com password.'
+ print '** Note that this is NOT your Gmail account password! **'
+ print 'It is the password you use to access Subversion repositories,'
+ print 'and can be found here: http://code.google.com/hosting/settings'
+ password = getpass.getpass()
+
+ status, reason, url = upload(file_path, project_name, user_name, password,
+ summary, labels)
+ # Returns 403 Forbidden instead of 401 Unauthorized for bad
+ # credentials as of 2007-07-17.
+ if status in [httplib.FORBIDDEN, httplib.UNAUTHORIZED]:
+ # Rest for another try.
+ user_name = password = None
+ tries = tries - 1
+ else:
+ # We're done.
+ break
+
+ return status, reason, url
+
+
+def main():
+ parser = optparse.OptionParser(usage='googlecode-upload.py -s SUMMARY '
+ '-p PROJECT [options] FILE')
+ parser.add_option('-s', '--summary', dest='summary',
+ help='Short description of the file')
+ parser.add_option('-p', '--project', dest='project',
+ help='Google Code project name')
+ parser.add_option('-u', '--user', dest='user',
+ help='Your Google Code username')
+ parser.add_option('-w', '--password', dest='password',
+ help='Your Google Code password')
+ parser.add_option('-l', '--labels', dest='labels',
+ help='An optional list of comma-separated labels to attach '
+ 'to the file')
+
+ options, args = parser.parse_args()
+
+ if not options.summary:
+ parser.error('File summary is missing.')
+ elif not options.project:
+ parser.error('Project name is missing.')
+ elif len(args) < 1:
+ parser.error('File to upload not provided.')
+ elif len(args) > 1:
+ parser.error('Only one file may be specified.')
+
+ file_path = args[0]
+
+ if options.labels:
+ labels = options.labels.split(',')
+ else:
+ labels = None
+
+ status, reason, url = upload_find_auth(file_path, options.project,
+ options.summary, labels,
+ options.user, options.password)
+ if url:
+ print 'The file was uploaded successfully.'
+ print 'URL: %s' % url
+ return 0
+ else:
+ print 'An error occurred. Your file was not uploaded.'
+ print 'Google Code upload server said: %s (%s)' % (reason, status)
+ return 1
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/Tools/ArdupilotMegaPlanner/Msi/installer.bat b/Tools/ArdupilotMegaPlanner/Msi/installer.bat
index dcececb614..7256e4d97a 100644
--- a/Tools/ArdupilotMegaPlanner/Msi/installer.bat
+++ b/Tools/ArdupilotMegaPlanner/Msi/installer.bat
@@ -2,6 +2,8 @@
wix.exe ..\bin\release\
+pause
+
del installer.wixobj
"%wix%\bin\candle" installer.wxs -ext WiXNetFxExtension -ext WixDifxAppExtension -ext WixUIExtension.dll -ext WixUtilExtension
@@ -12,5 +14,11 @@ del installer.wixobj
"%wix%\bin\light" installer.wixobj "%wix%\bin\difxapp_x64.wixlib" -o MissionPlanner64.msi -ext WiXNetFxExtension -ext WixDifxAppExtension -ext WixUIExtension.dll -ext WixUtilExtension
+"C:\Program Files\7-Zip\7z.exe" a -tzip "Mission Planner.zip" ..\bin\release\*
+
pause
+
+
+rem googlecode_upload.py -s "Mission Planner installer (32-bit)" -p ardupilot-mega -u meee146 MissionPlanner32.msi
+rem googlecode_upload.py -s "Mission Planner installer (64-bit)" -p ardupilot-mega -u meee146 MissionPlanner64.msi
\ No newline at end of file
diff --git a/Tools/ArdupilotMegaPlanner/Msi/installer.wxs b/Tools/ArdupilotMegaPlanner/Msi/installer.wxs
index 2263472dd6..ef32e135d0 100644
--- a/Tools/ArdupilotMegaPlanner/Msi/installer.wxs
+++ b/Tools/ArdupilotMegaPlanner/Msi/installer.wxs
@@ -2,14 +2,14 @@
-
+
-
-
+
+
@@ -31,226 +31,231 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
@@ -292,27 +297,27 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
+
+
-
-
+
+
-
-
+
+
+
-
-
+
+
+
@@ -333,7 +338,7 @@
-
+
");
+
if (filepath.EndsWith("ArdupilotMegaPlanner.exe")) {
mainexeid = "_" + no;
+
+ sw.WriteLine(" ");
+
+ } else {
+ sw.WriteLine("");
}
}