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(""); } }