mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-05 15:38:29 -04:00
39640e8d94
prep for ac2 2.0.43 - simple mode modify some scaling in Config add hud speed warning. add link quality and time to HUD fix ac2 logs, relative alt. prep for mavlink 1.0 add time to tlog > plain text conversion
1661 lines
66 KiB
C#
1661 lines
66 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using System.IO.Ports;
|
|
using System.IO;
|
|
using System.Xml;
|
|
using System.Collections;
|
|
using System.Net;
|
|
using System.Text.RegularExpressions;
|
|
using System.Web;
|
|
using System.Diagnostics;
|
|
using System.Runtime.InteropServices;
|
|
using System.Speech.Synthesis;
|
|
using System.Globalization;
|
|
using System.Threading;
|
|
using System.Net.Sockets;
|
|
|
|
namespace ArdupilotMega
|
|
{
|
|
public partial class MainV2 : Form
|
|
{
|
|
[DllImport("user32.dll")]
|
|
public static extern int FindWindow(string szClass, string szTitle);
|
|
[DllImport("user32.dll")]
|
|
public static extern int ShowWindow(int Handle, int showState);
|
|
|
|
const int SW_SHOWNORMAL = 1;
|
|
const int SW_HIDE = 0;
|
|
|
|
public static MAVLink comPort = new MAVLink();
|
|
public static string comportname = "";
|
|
public static Hashtable config = new Hashtable();
|
|
public static bool givecomport = false;
|
|
public static Firmwares APMFirmware = Firmwares.ArduPlane;
|
|
public static bool MAC = false;
|
|
|
|
public static bool speechenable = false;
|
|
public static SpeechSynthesizer talk = new SpeechSynthesizer();
|
|
|
|
public static Joystick joystick = null;
|
|
DateTime lastjoystick = DateTime.Now;
|
|
|
|
public static WebCamService.Capture cam = null;
|
|
|
|
public static CurrentState cs = new CurrentState();
|
|
|
|
bool serialthread = false;
|
|
|
|
TcpListener listener;
|
|
|
|
DateTime heatbeatsend = DateTime.Now;
|
|
|
|
public static List<System.Threading.Thread> threads = new List<System.Threading.Thread>();
|
|
public static MainV2 instance = null;
|
|
|
|
public enum Firmwares
|
|
{
|
|
ArduPlane,
|
|
ArduCopter2,
|
|
}
|
|
|
|
GCSViews.FlightData FlightData;
|
|
GCSViews.FlightPlanner FlightPlanner;
|
|
//GCSViews.Configuration Configuration;
|
|
GCSViews.Simulation Simulation;
|
|
GCSViews.Firmware Firmware;
|
|
//GCSViews.Terminal Terminal;
|
|
|
|
public MainV2()
|
|
{
|
|
//System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
|
|
//System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
|
|
|
|
srtm.datadirectory = Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + "srtm";
|
|
|
|
georefimage temp = new georefimage();
|
|
|
|
//temp.dowork(141);
|
|
|
|
//return;
|
|
|
|
var t = Type.GetType("Mono.Runtime");
|
|
MAC = (t != null);
|
|
|
|
Form splash = new Splash();
|
|
splash.Show();
|
|
|
|
string strVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
|
strVersion = "";
|
|
splash.Text = "APM Planner " + Application.ProductVersion + " Build " + strVersion + " By Michael Oborne";
|
|
|
|
splash.Refresh();
|
|
|
|
Application.DoEvents();
|
|
|
|
//talk.SpeakAsync("Welcome to APM Planner");
|
|
|
|
InitializeComponent();
|
|
|
|
MyRenderer.currentpressed = MenuFlightData;
|
|
|
|
MainMenu.Renderer = new MyRenderer();
|
|
|
|
List<object> list = new List<object>();
|
|
foreach (object obj in Enum.GetValues(typeof(Firmwares)))
|
|
{
|
|
TOOL_APMFirmware.Items.Add(obj);
|
|
}
|
|
|
|
if (TOOL_APMFirmware.Items.Count > 0)
|
|
TOOL_APMFirmware.SelectedIndex = 0;
|
|
|
|
this.Text = splash.Text;
|
|
|
|
comPort.BaseStream.BaudRate = 115200;
|
|
|
|
CMB_serialport.Items.AddRange(SerialPort.GetPortNames());
|
|
CMB_serialport.Items.Add("UDP");
|
|
if (CMB_serialport.Items.Count > 0)
|
|
{
|
|
CMB_serialport.SelectedIndex = 0;
|
|
CMB_baudrate.SelectedIndex = 7;
|
|
}
|
|
|
|
splash.Refresh();
|
|
Application.DoEvents();
|
|
|
|
// set this before we reset it
|
|
MainV2.config["NUM_tracklength"] = "200";
|
|
|
|
xmlconfig(false);
|
|
|
|
if (config.ContainsKey("language") && !string.IsNullOrEmpty((string)config["language"]))
|
|
changelanguage(getcultureinfo((string)config["language"]));
|
|
|
|
if (!MAC) // windows only
|
|
{
|
|
if (MainV2.config["showconsole"] != null && MainV2.config["showconsole"].ToString() == "True")
|
|
{
|
|
}
|
|
else
|
|
{
|
|
int win = FindWindow("ConsoleWindowClass", null);
|
|
ShowWindow(win, SW_HIDE); // hide window
|
|
}
|
|
}
|
|
|
|
try
|
|
{
|
|
FlightData = new GCSViews.FlightData();
|
|
FlightPlanner = new GCSViews.FlightPlanner();
|
|
//Configuration = new GCSViews.Configuration();
|
|
Simulation = new GCSViews.Simulation();
|
|
Firmware = new GCSViews.Firmware();
|
|
//Terminal = new GCSViews.Terminal();
|
|
}
|
|
catch (Exception e) { MessageBox.Show("A Major error has occured : " + e.ToString()); this.Close(); }
|
|
|
|
GCSViews.FlightData.myhud.Refresh();
|
|
GCSViews.FlightData.myhud.Refresh();
|
|
GCSViews.FlightData.myhud.Refresh();
|
|
|
|
if (GCSViews.FlightData.myhud.huddrawtime > 1000)
|
|
{
|
|
MessageBox.Show("The HUD draw time is above 1 seconds. Please update your graphics card driver.");
|
|
}
|
|
|
|
changeunits();
|
|
|
|
try
|
|
{
|
|
if (config["MainHeight"] != null)
|
|
this.Height = int.Parse(config["MainHeight"].ToString());
|
|
if (config["MainWidth"] != null)
|
|
this.Width = int.Parse(config["MainWidth"].ToString());
|
|
if (config["MainMaximised"] != null)
|
|
this.WindowState = (FormWindowState)Enum.Parse(typeof(FormWindowState), config["MainMaximised"].ToString());
|
|
|
|
|
|
if (config["CMB_rateattitude"] != null)
|
|
MainV2.cs.rateattitude = byte.Parse(config["CMB_rateattitude"].ToString());
|
|
if (config["CMB_rateattitude"] != null)
|
|
MainV2.cs.rateposition = byte.Parse(config["CMB_rateposition"].ToString());
|
|
if (config["CMB_rateattitude"] != null)
|
|
MainV2.cs.ratestatus = byte.Parse(config["CMB_ratestatus"].ToString());
|
|
if (config["CMB_rateattitude"] != null)
|
|
MainV2.cs.raterc = byte.Parse(config["CMB_raterc"].ToString());
|
|
|
|
if (config["speechenable"] != null)
|
|
MainV2.speechenable = bool.Parse(config["speechenable"].ToString());
|
|
|
|
}
|
|
catch { }
|
|
|
|
if (cs.rateattitude == 0) // initilised to 10, configured above from save
|
|
{
|
|
MessageBox.Show("NOTE: your attitude rate is 0, the hud will not work\nChange in Configuration > Planner > Telemetry Rates");
|
|
}
|
|
|
|
|
|
//System.Threading.Thread.Sleep(2000);
|
|
|
|
// make sure new enough .net framework is installed
|
|
if (!MAC)
|
|
{
|
|
Microsoft.Win32.RegistryKey installed_versions = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP");
|
|
string[] version_names = installed_versions.GetSubKeyNames();
|
|
//version names start with 'v', eg, 'v3.5' which needs to be trimmed off before conversion
|
|
double Framework = Convert.ToDouble(version_names[version_names.Length - 1].Remove(0, 1), CultureInfo.InvariantCulture);
|
|
int SP = Convert.ToInt32(installed_versions.OpenSubKey(version_names[version_names.Length - 1]).GetValue("SP", 0));
|
|
|
|
if (Framework < 3.5)
|
|
{
|
|
MessageBox.Show("This program requires .NET Framework 3.5 +. You currently have " + Framework);
|
|
}
|
|
}
|
|
|
|
Application.DoEvents();
|
|
|
|
instance = this;
|
|
splash.Close();
|
|
}
|
|
|
|
private void CMB_serialport_Click(object sender, EventArgs e)
|
|
{
|
|
CMB_serialport.Items.Clear();
|
|
CMB_serialport.Items.AddRange(SerialPort.GetPortNames());
|
|
CMB_serialport.Items.Add("UDP");
|
|
}
|
|
|
|
public static void fixtheme(Control temp)
|
|
{
|
|
fixtheme(temp, 0);
|
|
}
|
|
|
|
public static void fixtheme(Control temp, int level)
|
|
{
|
|
if (level == 0)
|
|
{
|
|
temp.BackColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
temp.ForeColor = Color.White;// Color.FromArgb(0xe6, 0xe8, 0xea);
|
|
}
|
|
//Console.WriteLine(temp.GetType());
|
|
|
|
//temp.Font = new Font("Lucida Console", 8.25f);
|
|
|
|
foreach (Control ctl in temp.Controls)
|
|
{
|
|
if (((Type)ctl.GetType()) == typeof(System.Windows.Forms.Button))
|
|
{
|
|
ctl.ForeColor = Color.Black;
|
|
System.Windows.Forms.Button but = (System.Windows.Forms.Button)ctl;
|
|
}
|
|
else if (((Type)ctl.GetType()) == typeof(TextBox))
|
|
{
|
|
ctl.BackColor = Color.FromArgb(0x43, 0x44, 0x45);
|
|
ctl.ForeColor = Color.White;// Color.FromArgb(0xe6, 0xe8, 0xea);
|
|
TextBox txt = (TextBox)ctl;
|
|
txt.BorderStyle = BorderStyle.None;
|
|
}
|
|
else if (((Type)ctl.GetType()) == typeof(DomainUpDown))
|
|
{
|
|
ctl.BackColor = Color.FromArgb(0x43, 0x44, 0x45);
|
|
ctl.ForeColor = Color.White;// Color.FromArgb(0xe6, 0xe8, 0xea);
|
|
DomainUpDown txt = (DomainUpDown)ctl;
|
|
txt.BorderStyle = BorderStyle.None;
|
|
}
|
|
else if (((Type)ctl.GetType()) == typeof(GroupBox))
|
|
{
|
|
ctl.BackColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
ctl.ForeColor = Color.White;// Color.FromArgb(0xe6, 0xe8, 0xea);
|
|
}
|
|
else if (((Type)ctl.GetType()) == typeof(ZedGraph.ZedGraphControl))
|
|
{
|
|
ZedGraph.ZedGraphControl zg1 = (ZedGraph.ZedGraphControl)ctl;
|
|
zg1.GraphPane.Chart.Fill = new ZedGraph.Fill(Color.FromArgb(0x1f, 0x1f, 0x20));
|
|
zg1.GraphPane.Fill = new ZedGraph.Fill(Color.FromArgb(0x37, 0x37, 0x38));
|
|
|
|
foreach (ZedGraph.LineItem li in zg1.GraphPane.CurveList)
|
|
{
|
|
li.Line.Width = 4;
|
|
}
|
|
|
|
zg1.GraphPane.Title.FontSpec.FontColor = Color.White;
|
|
|
|
zg1.GraphPane.XAxis.MajorTic.Color = Color.White;
|
|
zg1.GraphPane.XAxis.MinorTic.Color = Color.White;
|
|
zg1.GraphPane.YAxis.MajorTic.Color = Color.White;
|
|
zg1.GraphPane.YAxis.MinorTic.Color = Color.White;
|
|
|
|
zg1.GraphPane.XAxis.MajorGrid.Color = Color.White;
|
|
zg1.GraphPane.YAxis.MajorGrid.Color = Color.White;
|
|
|
|
zg1.GraphPane.YAxis.Scale.FontSpec.FontColor = Color.White;
|
|
zg1.GraphPane.YAxis.Title.FontSpec.FontColor = Color.White;
|
|
|
|
zg1.GraphPane.XAxis.Scale.FontSpec.FontColor = Color.White;
|
|
zg1.GraphPane.XAxis.Title.FontSpec.FontColor = Color.White;
|
|
|
|
zg1.GraphPane.Legend.Fill = new ZedGraph.Fill(Color.FromArgb(0x85, 0x84, 0x83));
|
|
zg1.GraphPane.Legend.FontSpec.FontColor = Color.White;
|
|
}
|
|
else if (((Type)ctl.GetType()) == typeof(BSE.Windows.Forms.Panel) || ((Type)ctl.GetType()) == typeof(System.Windows.Forms.SplitterPanel))
|
|
{
|
|
ctl.BackColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
ctl.ForeColor = Color.White;// Color.FromArgb(0xe6, 0xe8, 0xea);
|
|
}
|
|
else if (((Type)ctl.GetType()) == typeof(Form))
|
|
{
|
|
ctl.BackColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
ctl.ForeColor = Color.White;// Color.FromArgb(0xe6, 0xe8, 0xea);
|
|
}
|
|
else if (((Type)ctl.GetType()) == typeof(RichTextBox))
|
|
{
|
|
ctl.BackColor = Color.FromArgb(0x43, 0x44, 0x45);
|
|
ctl.ForeColor = Color.White;
|
|
RichTextBox txtr = (RichTextBox)ctl;
|
|
txtr.BorderStyle = BorderStyle.None;
|
|
}
|
|
else if (((Type)ctl.GetType()) == typeof(TabPage))
|
|
{
|
|
ctl.BackColor = Color.FromArgb(0x26, 0x27, 0x28); //Color.FromArgb(0x43, 0x44, 0x45);
|
|
ctl.ForeColor = Color.White;
|
|
TabPage txtr = (TabPage)ctl;
|
|
txtr.BorderStyle = BorderStyle.None;
|
|
}
|
|
else if (((Type)ctl.GetType()) == typeof(TabControl))
|
|
{
|
|
ctl.BackColor = Color.FromArgb(0x26, 0x27, 0x28); //Color.FromArgb(0x43, 0x44, 0x45);
|
|
ctl.ForeColor = Color.White;
|
|
TabControl txtr = (TabControl)ctl;
|
|
|
|
}
|
|
else if (((Type)ctl.GetType()) == typeof(DataGridView))
|
|
{
|
|
ctl.ForeColor = Color.White;
|
|
DataGridView dgv = (DataGridView)ctl;
|
|
dgv.EnableHeadersVisualStyles = false;
|
|
dgv.BorderStyle = BorderStyle.None;
|
|
dgv.BackgroundColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
DataGridViewCellStyle rs = new DataGridViewCellStyle();
|
|
rs.BackColor = Color.FromArgb(0x43, 0x44, 0x45);
|
|
rs.ForeColor = Color.White;
|
|
dgv.RowsDefaultCellStyle = rs;
|
|
|
|
DataGridViewCellStyle hs = new DataGridViewCellStyle(dgv.ColumnHeadersDefaultCellStyle);
|
|
hs.BackColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
hs.ForeColor = Color.White;
|
|
|
|
dgv.ColumnHeadersDefaultCellStyle = hs;
|
|
|
|
dgv.RowHeadersDefaultCellStyle = hs;
|
|
}
|
|
else if (((Type)ctl.GetType()) == typeof(ComboBox))
|
|
{
|
|
ctl.BackColor = Color.FromArgb(0x43, 0x44, 0x45);
|
|
ctl.ForeColor = Color.White;
|
|
ComboBox CMB = (ComboBox)ctl;
|
|
CMB.FlatStyle = FlatStyle.Flat;
|
|
}
|
|
else if (((Type)ctl.GetType()) == typeof(NumericUpDown))
|
|
{
|
|
ctl.BackColor = Color.FromArgb(0x43, 0x44, 0x45);
|
|
ctl.ForeColor = Color.White;
|
|
}
|
|
else if (((Type)ctl.GetType()) == typeof(TrackBar))
|
|
{
|
|
ctl.BackColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
ctl.ForeColor = Color.White;
|
|
}
|
|
else if (((Type)ctl.GetType()) == typeof(LinkLabel))
|
|
{
|
|
ctl.BackColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
ctl.ForeColor = Color.White;
|
|
LinkLabel LNK = (LinkLabel)ctl;
|
|
LNK.ActiveLinkColor = Color.White;
|
|
LNK.LinkColor = Color.White;
|
|
LNK.VisitedLinkColor = Color.White;
|
|
|
|
}
|
|
else if (((Type)ctl.GetType()) == typeof(HorizontalProgressBar2) ||
|
|
((Type)ctl.GetType()) == typeof(VerticalProgressBar2))
|
|
{
|
|
((HorizontalProgressBar2)ctl).BackgroundColor = Color.FromArgb(0x43, 0x44, 0x45);
|
|
((HorizontalProgressBar2)ctl).ValueColor = Color.FromArgb(148, 193, 31);
|
|
}
|
|
|
|
if (ctl.Controls.Count > 0)
|
|
fixtheme(ctl, 1);
|
|
}
|
|
}
|
|
|
|
private void MenuFlightData_Click(object sender, EventArgs e)
|
|
{
|
|
MyView.Controls.Clear();
|
|
|
|
GCSViews.Terminal.threadrun = false;
|
|
|
|
UserControl temp = FlightData;
|
|
|
|
fixtheme(temp);
|
|
|
|
temp.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
|
|
|
|
temp.Location = new Point(0, MainMenu.Height);
|
|
|
|
temp.Dock = DockStyle.Fill;
|
|
|
|
//temp.ForeColor = Color.White;
|
|
|
|
//temp.BackColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
|
|
MyView.Controls.Add(temp);
|
|
|
|
if (MainV2.config["FlightSplitter"] != null)
|
|
((GCSViews.FlightData)temp).MainHcopy.SplitterDistance = int.Parse(MainV2.config["FlightSplitter"].ToString());
|
|
}
|
|
|
|
private void MenuFlightPlanner_Click(object sender, EventArgs e)
|
|
{
|
|
MyView.Controls.Clear();
|
|
|
|
GCSViews.Terminal.threadrun = false;
|
|
|
|
UserControl temp = FlightPlanner;
|
|
|
|
fixtheme(temp);
|
|
|
|
temp.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
|
|
|
|
temp.Location = new Point(0, MainMenu.Height);
|
|
|
|
temp.Dock = DockStyle.Fill;
|
|
|
|
temp.ForeColor = Color.White;
|
|
|
|
temp.BackColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
|
|
MyView.Controls.Add(temp);
|
|
}
|
|
|
|
private void MenuConfiguration_Click(object sender, EventArgs e)
|
|
{
|
|
MyView.Controls.Clear();
|
|
|
|
GCSViews.Terminal.threadrun = false;
|
|
|
|
UserControl temp = new GCSViews.Configuration();
|
|
|
|
fixtheme(temp);
|
|
|
|
temp.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
|
|
|
|
temp.Location = new Point(0, MainMenu.Height);
|
|
|
|
temp.Dock = DockStyle.Fill;
|
|
|
|
temp.ForeColor = Color.White;
|
|
|
|
temp.BackColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
|
|
MyView.Controls.Add(temp);
|
|
}
|
|
|
|
private void MenuSimulation_Click(object sender, EventArgs e)
|
|
{
|
|
MyView.Controls.Clear();
|
|
|
|
GCSViews.Terminal.threadrun = false;
|
|
|
|
UserControl temp = Simulation;
|
|
|
|
fixtheme(temp);
|
|
|
|
temp.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
|
|
|
|
temp.Location = new Point(0, MainMenu.Height);
|
|
|
|
temp.Dock = DockStyle.Fill;
|
|
|
|
temp.ForeColor = Color.White;
|
|
|
|
temp.BackColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
|
|
MyView.Controls.Add(temp);
|
|
}
|
|
|
|
private void MenuFirmware_Click(object sender, EventArgs e)
|
|
{
|
|
MyView.Controls.Clear();
|
|
|
|
GCSViews.Terminal.threadrun = false;
|
|
|
|
UserControl temp = Firmware;
|
|
|
|
fixtheme(temp);
|
|
|
|
temp.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
|
|
|
|
temp.Dock = DockStyle.Fill;
|
|
|
|
MyView.Controls.Add(temp);
|
|
|
|
temp.ForeColor = Color.White;
|
|
|
|
temp.BackColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
}
|
|
|
|
private void MenuTerminal_Click(object sender, EventArgs e)
|
|
{
|
|
if (comPort.BaseStream.IsOpen)
|
|
{
|
|
MenuConnect_Click(sender, e);
|
|
}
|
|
|
|
givecomport = true;
|
|
|
|
MyView.Controls.Clear();
|
|
|
|
this.MenuConnect.BackgroundImage = global::ArdupilotMega.Properties.Resources.disconnect;
|
|
|
|
UserControl temp = new GCSViews.Terminal();
|
|
|
|
fixtheme(temp);
|
|
|
|
temp.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
|
|
|
|
temp.Dock = DockStyle.Fill;
|
|
|
|
MyView.Controls.Add(temp);
|
|
|
|
temp.ForeColor = Color.White;
|
|
|
|
temp.BackColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
|
|
}
|
|
|
|
private void MenuConnect_Click(object sender, EventArgs e)
|
|
{
|
|
givecomport = false;
|
|
|
|
if (comPort.BaseStream.IsOpen)
|
|
{
|
|
try
|
|
{
|
|
if (talk != null) // cancel all pending speech
|
|
talk.SpeakAsyncCancelAll();
|
|
|
|
if (comPort.logfile != null)
|
|
comPort.logfile.Close();
|
|
|
|
comPort.BaseStream.DtrEnable = false;
|
|
comPort.Close();
|
|
}
|
|
catch { }
|
|
|
|
this.MenuConnect.BackgroundImage = global::ArdupilotMega.Properties.Resources.connect;
|
|
}
|
|
else
|
|
{
|
|
if (CMB_serialport.Text == "UDP")
|
|
{
|
|
comPort.BaseStream = new UdpSerial();
|
|
}
|
|
else
|
|
{
|
|
comPort.BaseStream = new SerialPort();
|
|
}
|
|
try
|
|
{
|
|
comPort.BaseStream.BaudRate = int.Parse(CMB_baudrate.Text);
|
|
}
|
|
catch { }
|
|
comPort.BaseStream.DataBits = 8;
|
|
comPort.BaseStream.StopBits = (StopBits)Enum.Parse(typeof(StopBits), "1");
|
|
comPort.BaseStream.Parity = (Parity)Enum.Parse(typeof(Parity), "None");
|
|
|
|
comPort.BaseStream.DtrEnable = false;
|
|
|
|
if (config["CHK_resetapmonconnect"] == null || bool.Parse(config["CHK_resetapmonconnect"].ToString()) == true)
|
|
comPort.BaseStream.DtrEnable = true;
|
|
|
|
if (DialogResult.OK != Common.MessageShowAgain("Mavlink Connect", "Make sure your APM slider switch is in Flight Mode (away from RC pins)"))
|
|
{
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
if (comPort.logfile != null)
|
|
comPort.logfile.Close();
|
|
try
|
|
{
|
|
Directory.CreateDirectory(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"logs");
|
|
comPort.logfile = new BinaryWriter(File.Open(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"logs" + Path.DirectorySeparatorChar + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + ".tlog", FileMode.CreateNew));
|
|
}
|
|
catch { MessageBox.Show("Failed to create log - wont log this session"); } // soft fail
|
|
|
|
comPort.BaseStream.PortName = CMB_serialport.Text;
|
|
comPort.Open(true);
|
|
|
|
if (comPort.param["SYSID_SW_TYPE"] != null)
|
|
{
|
|
if (float.Parse(comPort.param["SYSID_SW_TYPE"].ToString()) == 10)
|
|
{
|
|
TOOL_APMFirmware.SelectedIndex = TOOL_APMFirmware.Items.IndexOf(Firmwares.ArduCopter2);
|
|
}
|
|
else if (float.Parse(comPort.param["SYSID_SW_TYPE"].ToString()) == 0)
|
|
{
|
|
TOOL_APMFirmware.SelectedIndex = TOOL_APMFirmware.Items.IndexOf(Firmwares.ArduPlane);
|
|
}
|
|
}
|
|
|
|
cs.firmware = APMFirmware;
|
|
|
|
if (config["loadwpsonconnect"] != null && bool.Parse(config["loadwpsonconnect"].ToString()) == true)
|
|
{
|
|
MenuFlightPlanner_Click(null, null);
|
|
FlightPlanner.BUT_read_Click(null, null);
|
|
}
|
|
|
|
this.MenuConnect.BackgroundImage = global::ArdupilotMega.Properties.Resources.disconnect;
|
|
}
|
|
catch (Exception ex) {
|
|
try {
|
|
comPort.Close();
|
|
} catch { }
|
|
try
|
|
{
|
|
string version = ArduinoDetect.DetectVersion(comPort.BaseStream.PortName);
|
|
ArduinoComms port = new ArduinoSTK();
|
|
if (version == "1280")
|
|
{
|
|
port = new ArduinoSTK();
|
|
port.BaudRate = 57600;
|
|
}
|
|
else if (version == "2560")
|
|
{
|
|
port = new ArduinoSTKv2();
|
|
port.BaudRate = 115200;
|
|
}
|
|
else { throw new Exception("Can not determine APM board type"); }
|
|
port.PortName = comPort.BaseStream.PortName;
|
|
port.DtrEnable = true;
|
|
port.Open();
|
|
if (port.connectAP())
|
|
{
|
|
byte[] buffer = port.download(20);
|
|
port.Close();
|
|
|
|
if (buffer[0] != 'A' || buffer[1] != 'P') // this is the apvar header
|
|
{
|
|
MessageBox.Show("You dont appear to have uploaded a firmware yet,\n\nPlease goto the firmware page and upload one.");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine("Valid eeprom contents");
|
|
}
|
|
}
|
|
}
|
|
catch { }
|
|
MessageBox.Show("Is your CLI switch in Flight position?\n(this is required for MAVlink comms)\n\n" + ex.ToString());
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void CMB_serialport_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
comportname = CMB_serialport.Text;
|
|
try
|
|
{
|
|
comPort.BaseStream.PortName = CMB_serialport.Text;
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
private void toolStripMenuItem2_Click(object sender, EventArgs e)
|
|
{
|
|
//Form temp = new Main();
|
|
//temp.Show();
|
|
}
|
|
|
|
private void MainV2_FormClosed(object sender, FormClosedEventArgs e)
|
|
{
|
|
GCSViews.FlightData.threadrun = 0;
|
|
GCSViews.Simulation.threadrun = 0;
|
|
|
|
serialthread = false;
|
|
|
|
try
|
|
{
|
|
if (comPort.BaseStream.IsOpen)
|
|
comPort.Close();
|
|
}
|
|
catch { } // i get alot of these errors, the port is still open, but not valid - user has unpluged usb
|
|
try
|
|
{
|
|
FlightData.Dispose();
|
|
}
|
|
catch { }
|
|
try
|
|
{
|
|
FlightPlanner.Dispose();
|
|
}
|
|
catch { }
|
|
try
|
|
{
|
|
Simulation.Dispose();
|
|
}
|
|
catch { }
|
|
|
|
xmlconfig(true);
|
|
}
|
|
|
|
|
|
private void xmlconfig(bool write)
|
|
{
|
|
if (write || !File.Exists(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"config.xml"))
|
|
{
|
|
try
|
|
{
|
|
XmlTextWriter xmlwriter = new XmlTextWriter(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"config.xml", Encoding.ASCII);
|
|
xmlwriter.Formatting = Formatting.Indented;
|
|
|
|
xmlwriter.WriteStartDocument();
|
|
|
|
xmlwriter.WriteStartElement("Config");
|
|
|
|
//xmlwriter.WriteElementString("APMlocation", defineslocation);
|
|
|
|
xmlwriter.WriteElementString("comport", comportname);
|
|
|
|
xmlwriter.WriteElementString("baudrate", CMB_baudrate.Text);
|
|
|
|
xmlwriter.WriteElementString("APMFirmware", APMFirmware.ToString());
|
|
|
|
foreach (string key in config.Keys)
|
|
{
|
|
try
|
|
{
|
|
if (key == "")
|
|
continue;
|
|
xmlwriter.WriteElementString(key, config[key].ToString());
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
xmlwriter.WriteEndElement();
|
|
|
|
xmlwriter.WriteEndDocument();
|
|
xmlwriter.Close();
|
|
}
|
|
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
|
|
}
|
|
else
|
|
{
|
|
try
|
|
{
|
|
using (XmlTextReader xmlreader = new XmlTextReader(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"config.xml"))
|
|
{
|
|
while (xmlreader.Read())
|
|
{
|
|
xmlreader.MoveToElement();
|
|
try
|
|
{
|
|
switch (xmlreader.Name)
|
|
{
|
|
case "comport":
|
|
string temp = xmlreader.ReadString();
|
|
|
|
CMB_serialport.SelectedIndex = CMB_serialport.FindString(temp);
|
|
if (CMB_serialport.SelectedIndex == -1)
|
|
{
|
|
CMB_serialport.Text = temp; // allows ports that dont exist - yet
|
|
}
|
|
comPort.BaseStream.PortName = temp;
|
|
comportname = temp;
|
|
break;
|
|
case "baudrate":
|
|
string temp2 = xmlreader.ReadString();
|
|
|
|
CMB_baudrate.SelectedIndex = CMB_baudrate.FindString(temp2);
|
|
if (CMB_baudrate.SelectedIndex == -1)
|
|
{
|
|
CMB_baudrate.Text = temp2;
|
|
//CMB_baudrate.SelectedIndex = CMB_baudrate.FindString("57600"); ; // must exist
|
|
}
|
|
//bau = int.Parse(CMB_baudrate.Text);
|
|
break;
|
|
case "APMFirmware":
|
|
string temp3 = xmlreader.ReadString();
|
|
TOOL_APMFirmware.SelectedIndex = TOOL_APMFirmware.FindStringExact(temp3);
|
|
if (TOOL_APMFirmware.SelectedIndex == -1)
|
|
TOOL_APMFirmware.SelectedIndex = 0;
|
|
APMFirmware = (MainV2.Firmwares)Enum.Parse(typeof(MainV2.Firmwares), TOOL_APMFirmware.Text);
|
|
break;
|
|
case "Config":
|
|
break;
|
|
case "xml":
|
|
break;
|
|
default:
|
|
if (xmlreader.Name == "") // line feeds
|
|
break;
|
|
config[xmlreader.Name] = xmlreader.ReadString();
|
|
break;
|
|
}
|
|
}
|
|
catch (Exception ee) { Console.WriteLine(ee.Message); } // silent fail on bad entry
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex) { Console.WriteLine("Bad Config File: " + ex.ToString()); } // bad config file
|
|
}
|
|
}
|
|
|
|
private void CMB_baudrate_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
comPort.BaseStream.BaudRate = int.Parse(CMB_baudrate.Text);
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
private void joysticksend()
|
|
{
|
|
while (true)
|
|
{
|
|
try
|
|
{
|
|
if (!MAC)
|
|
{
|
|
//joystick stuff
|
|
|
|
if (joystick != null && joystick.enabled)
|
|
{
|
|
MAVLink.__mavlink_rc_channels_override_t rc = new MAVLink.__mavlink_rc_channels_override_t();
|
|
|
|
rc.target_component = comPort.compid;
|
|
rc.target_system = comPort.sysid;
|
|
|
|
rc.chan1_raw = cs.rcoverridech1;//(ushort)(((int)state.Rz / 65.535) + 1000);
|
|
rc.chan2_raw = cs.rcoverridech2;//(ushort)(((int)state.Y / 65.535) + 1000);
|
|
rc.chan3_raw = cs.rcoverridech3;//(ushort)(1000 - ((int)slider[0] / 65.535 ) + 1000);
|
|
rc.chan4_raw = cs.rcoverridech4;//(ushort)(((int)state.X / 65.535) + 1000);
|
|
|
|
if (lastjoystick.AddMilliseconds(50) < DateTime.Now)
|
|
{
|
|
// Console.WriteLine(DateTime.Now.Millisecond + " {0} {1} {2} {3} ", rc.chan1_raw, rc.chan2_raw, rc.chan3_raw, rc.chan4_raw);
|
|
comPort.generatePacket(MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_OVERRIDE, rc);
|
|
lastjoystick = DateTime.Now;
|
|
}
|
|
|
|
}
|
|
}
|
|
System.Threading.Thread.Sleep(50);
|
|
}
|
|
catch { } // cant fall out
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
private void SerialReader()
|
|
{
|
|
if (serialthread == true)
|
|
return;
|
|
serialthread = true;
|
|
|
|
int minbytes = 10;
|
|
|
|
if (MAC)
|
|
minbytes = 0;
|
|
|
|
DateTime menuupdate = DateTime.Now;
|
|
|
|
DateTime speechcustomtime = DateTime.Now;
|
|
|
|
while (serialthread)
|
|
{
|
|
try
|
|
{
|
|
System.Threading.Thread.Sleep(5);
|
|
if ((DateTime.Now - menuupdate).Milliseconds > 500)
|
|
{
|
|
// Console.WriteLine(DateTime.Now.Millisecond);
|
|
if (comPort.BaseStream.IsOpen)
|
|
{
|
|
if ((string)this.MenuConnect.BackgroundImage.Tag != "Disconnect")
|
|
{
|
|
this.Invoke((MethodInvoker)delegate
|
|
{
|
|
this.MenuConnect.BackgroundImage = global::ArdupilotMega.Properties.Resources.disconnect;
|
|
this.MenuConnect.BackgroundImage.Tag = "Disconnect";
|
|
});
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ((string)this.MenuConnect.BackgroundImage.Tag != "Connect")
|
|
{
|
|
this.Invoke((MethodInvoker)delegate
|
|
{
|
|
this.MenuConnect.BackgroundImage = global::ArdupilotMega.Properties.Resources.connect;
|
|
this.MenuConnect.BackgroundImage.Tag = "Connect";
|
|
});
|
|
}
|
|
}
|
|
menuupdate = DateTime.Now;
|
|
}
|
|
|
|
if (speechenable && talk != null && (DateTime.Now - speechcustomtime).TotalSeconds > 30 && MainV2.cs.lat != 0 && (MainV2.comPort.logreadmode || comPort.BaseStream.IsOpen))
|
|
{
|
|
//speechbatteryvolt
|
|
float warnvolt = 0;
|
|
float.TryParse(MainV2.getConfig("speechbatteryvolt"), out warnvolt);
|
|
|
|
if (MainV2.getConfig("speechbatteryenabled") == "True" && MainV2.cs.battery_voltage <= warnvolt)
|
|
{
|
|
MainV2.talk.SpeakAsync(Common.speechConversion(MainV2.getConfig("speechbattery")));
|
|
}
|
|
|
|
if (MainV2.getConfig("speechcustomenabled") == "True")
|
|
{
|
|
MainV2.talk.SpeakAsync(Common.speechConversion(MainV2.getConfig("speechcustom")));
|
|
}
|
|
|
|
speechcustomtime = DateTime.Now;
|
|
}
|
|
|
|
if (speechenable && talk != null && (MainV2.comPort.logreadmode || comPort.BaseStream.IsOpen))
|
|
{
|
|
float warnalt = float.MaxValue;
|
|
float.TryParse(MainV2.getConfig("speechaltheight"), out warnalt);
|
|
try
|
|
{
|
|
if (MainV2.getConfig("speechaltenabled") == "True" && (MainV2.cs.alt - (int)double.Parse(MainV2.getConfig("TXT_homealt"))) <= warnalt)
|
|
{
|
|
if (MainV2.talk.State == SynthesizerState.Ready)
|
|
MainV2.talk.SpeakAsync(Common.speechConversion(MainV2.getConfig("speechalt")));
|
|
}
|
|
}
|
|
catch { } // silent fail
|
|
}
|
|
|
|
if (!comPort.BaseStream.IsOpen || givecomport == true)
|
|
continue;
|
|
|
|
if (heatbeatsend.Second != DateTime.Now.Second)
|
|
{
|
|
Console.WriteLine("remote lost {0}", cs.packetdropremote);
|
|
|
|
MAVLink.__mavlink_heartbeat_t htb = new MAVLink.__mavlink_heartbeat_t();
|
|
|
|
htb.type = (byte)MAVLink.MAV_TYPE.MAV_GENERIC;
|
|
htb.autopilot = (byte)MAVLink.MAV_AUTOPILOT_TYPE.MAV_AUTOPILOT_ARDUPILOTMEGA;
|
|
htb.mavlink_version = 2;
|
|
|
|
comPort.generatePacket((byte)MAVLink.MAVLINK_MSG_ID_HEARTBEAT, htb);
|
|
heatbeatsend = DateTime.Now;
|
|
}
|
|
|
|
// data loss warning
|
|
if ((DateTime.Now - comPort.lastvalidpacket).TotalSeconds > 10)
|
|
{
|
|
if (speechenable && talk != null) {
|
|
if (MainV2.talk.State == SynthesizerState.Ready)
|
|
MainV2.talk.SpeakAsync("WARNING No Data for " + (int)(DateTime.Now - comPort.lastvalidpacket).TotalSeconds + " Seconds");
|
|
}
|
|
MainV2.cs.linkqualitygcs = 0;
|
|
}
|
|
|
|
//Console.WriteLine(comPort.BaseStream.BytesToRead);
|
|
|
|
while (comPort.BaseStream.BytesToRead > minbytes && givecomport == false)
|
|
comPort.readPacket();
|
|
}
|
|
catch (Exception e) {
|
|
Console.WriteLine("Serial Reader fail :" + e.Message);
|
|
try
|
|
{
|
|
comPort.Close();
|
|
}
|
|
catch { }
|
|
}
|
|
}
|
|
}
|
|
|
|
private class MyRenderer : ToolStripProfessionalRenderer
|
|
{
|
|
public static ToolStripItem currentpressed;
|
|
protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e)
|
|
{
|
|
//BackgroundImage
|
|
if (e.Item.BackgroundImage == null) base.OnRenderButtonBackground(e);
|
|
else
|
|
{
|
|
Rectangle bounds = new Rectangle(Point.Empty, e.Item.Size);
|
|
e.Graphics.DrawImage(e.Item.BackgroundImage, bounds);
|
|
if (e.Item.Pressed || e.Item == currentpressed)
|
|
{
|
|
SolidBrush brush = new SolidBrush(Color.FromArgb(73, 0x2b, 0x3a, 0x03));
|
|
e.Graphics.FillRectangle(brush, bounds);
|
|
if (e.Item.Name != "MenuConnect")
|
|
{
|
|
//Console.WriteLine("new " + e.Item.Name + " old " + currentpressed.Name );
|
|
//e.Item.GetCurrentParent().Invalidate();
|
|
if (currentpressed != e.Item)
|
|
currentpressed.Invalidate();
|
|
currentpressed = e.Item;
|
|
}
|
|
|
|
// Something...
|
|
}
|
|
else if (e.Item.Selected) // mouse over
|
|
{
|
|
SolidBrush brush = new SolidBrush(Color.FromArgb(73, 0x2b, 0x3a, 0x03));
|
|
e.Graphics.FillRectangle(brush, bounds);
|
|
// Something...
|
|
}
|
|
using (Pen pen = new Pen(Color.Black))
|
|
{
|
|
//e.Graphics.DrawRectangle(pen, bounds.X, bounds.Y, bounds.Width - 1, bounds.Height - 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void OnRenderItemImage(ToolStripItemImageRenderEventArgs e)
|
|
{
|
|
//base.OnRenderItemImage(e);
|
|
}
|
|
}
|
|
|
|
private void MainV2_Load(object sender, EventArgs e)
|
|
{
|
|
// generate requestall for jani and sandro
|
|
comPort.sysid = 7;
|
|
comPort.compid = 1;
|
|
//comPort.requestDatastream((byte)MAVLink.MAV_DATA_STREAM.MAV_DATA_STREAM_ALL,3);
|
|
//
|
|
|
|
|
|
MenuFlightData_Click(sender, e);
|
|
|
|
try
|
|
{
|
|
listener = new TcpListener(IPAddress.Any, 56781);
|
|
System.Threading.Thread t13 = new System.Threading.Thread(new System.Threading.ThreadStart(listernforclients))
|
|
{
|
|
Name = "motion jpg stream",
|
|
IsBackground = true
|
|
};
|
|
// wait for tcp connections
|
|
t13.Start();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.ToString());
|
|
}
|
|
|
|
System.Threading.Thread t12 = new System.Threading.Thread(new ThreadStart(joysticksend))
|
|
{
|
|
IsBackground = true,
|
|
Priority = ThreadPriority.AboveNormal,
|
|
Name = "Main joystick sender"
|
|
};
|
|
t12.Start();
|
|
|
|
System.Threading.Thread t11 = new System.Threading.Thread(new ThreadStart(SerialReader))
|
|
{
|
|
IsBackground = true,
|
|
Name = "Main Serial reader"
|
|
};
|
|
t11.Start();
|
|
}
|
|
|
|
/// <summary>
|
|
/// little web server for sending network link kml's
|
|
/// </summary>
|
|
|
|
void listernforclients()
|
|
{
|
|
try
|
|
{
|
|
listener.Start();
|
|
}
|
|
catch { Console.WriteLine("do you have the planner open already");return; } // in use
|
|
// Enter the listening loop.
|
|
while (true)
|
|
{
|
|
// Perform a blocking call to accept requests.
|
|
// You could also user server.AcceptSocket() here.
|
|
try
|
|
{
|
|
Console.WriteLine("Listening for client - 1 client at a time");
|
|
TcpClient client = listener.AcceptTcpClient();
|
|
// Get a stream object for reading and writing
|
|
Console.WriteLine("Accepted Client " + client.Client.RemoteEndPoint.ToString());
|
|
//client.SendBufferSize = 100 * 1024; // 100kb
|
|
//client.LingerState.Enabled = true;
|
|
//client.NoDelay = true;
|
|
|
|
// makesure we have valid image
|
|
GCSViews.FlightData.mymap.streamjpgenable = true;
|
|
GCSViews.FlightData.myhud.streamjpgenable = true;
|
|
GCSViews.FlightData.mymap.Refresh();
|
|
|
|
NetworkStream stream = client.GetStream();
|
|
|
|
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
|
|
|
|
byte[] request = new byte[1024];
|
|
|
|
int len = stream.Read(request, 0, request.Length);
|
|
string head = System.Text.ASCIIEncoding.ASCII.GetString(request, 0, len);
|
|
Console.WriteLine(head);
|
|
|
|
int index = head.IndexOf('\n');
|
|
|
|
string url = head.Substring(0, index - 1);
|
|
//url = url.Replace("\r", "");
|
|
//url = url.Replace("GET ","");
|
|
//url = url.Replace(" HTTP/1.0", "");
|
|
//url = url.Replace(" HTTP/1.1", "");
|
|
|
|
string header = "HTTP/1.1 200 OK\r\nContent-Type: multipart/x-mixed-replace;boundary=APMPLANNER\n\n--APMPLANNER\r\n";
|
|
byte[] temp = encoding.GetBytes(header);
|
|
stream.Write(temp, 0, temp.Length);
|
|
|
|
while (client.Connected)
|
|
{
|
|
System.Threading.Thread.Sleep(200); // 5hz
|
|
byte[] data = null;
|
|
|
|
if (url.ToLower().Contains("hud"))
|
|
{
|
|
GCSViews.FlightData.myhud.streamjpgenable = true;
|
|
data = GCSViews.FlightData.myhud.streamjpg.ToArray();
|
|
}
|
|
else if (url.ToLower().Contains("map"))
|
|
{
|
|
GCSViews.FlightData.mymap.streamjpgenable = true;
|
|
data = GCSViews.FlightData.mymap.streamjpg.ToArray();
|
|
}
|
|
else
|
|
{
|
|
GCSViews.FlightData.mymap.streamjpgenable = true;
|
|
GCSViews.FlightData.myhud.streamjpgenable = true;
|
|
Image img1 = Image.FromStream(GCSViews.FlightData.myhud.streamjpg);
|
|
Image img2 = Image.FromStream(GCSViews.FlightData.mymap.streamjpg);
|
|
int bigger = img1.Height > img2.Height ? img1.Height : img2.Height;
|
|
Image imgout = new Bitmap(img1.Width + img2.Width, bigger);
|
|
|
|
Graphics grap = Graphics.FromImage(imgout);
|
|
|
|
grap.DrawImageUnscaled(img1, 0, 0);
|
|
grap.DrawImageUnscaled(img2, img1.Width, 0);
|
|
|
|
MemoryStream streamjpg = new MemoryStream();
|
|
imgout.Save(streamjpg, System.Drawing.Imaging.ImageFormat.Jpeg);
|
|
data = streamjpg.ToArray();
|
|
|
|
}
|
|
|
|
header = "Content-Type: image/jpeg\r\nContent-Length: " + data.Length + "\r\n\r\n";
|
|
temp = encoding.GetBytes(header);
|
|
stream.Write(temp, 0, temp.Length);
|
|
|
|
stream.Write(data, 0, data.Length);
|
|
|
|
header = "\r\n--APMPLANNER\r\n";
|
|
temp = encoding.GetBytes(header);
|
|
stream.Write(temp, 0, temp.Length);
|
|
|
|
}
|
|
GCSViews.FlightData.mymap.streamjpgenable = false;
|
|
GCSViews.FlightData.myhud.streamjpgenable = false;
|
|
/*
|
|
while (client.Connected)
|
|
{
|
|
|
|
byte[] data = GCSViews.FlightData.myhud.streamjpg.ToArray();
|
|
|
|
byte[] request = new byte[1024];
|
|
|
|
int len = stream.Read(request, 0, request.Length);
|
|
Console.WriteLine(System.Text.ASCIIEncoding.ASCII.GetString(request, 0, len));
|
|
|
|
string header = "HTTP/1.1 200 OK\nContent-Length: " + data.Length + "\nContent-Type: image/jpeg\n\n";
|
|
byte[] temp = encoding.GetBytes(header);
|
|
stream.Write(temp, 0, temp.Length);
|
|
|
|
stream.Write(data, 0, data.Length);
|
|
|
|
}
|
|
*/
|
|
stream.Close();
|
|
|
|
}
|
|
catch (Exception ee) { Console.WriteLine("Failed mjpg " + ee.Message); }
|
|
}
|
|
}
|
|
|
|
private void TOOL_APMFirmware_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
APMFirmware = (MainV2.Firmwares)Enum.Parse(typeof(MainV2.Firmwares), TOOL_APMFirmware.Text);
|
|
MainV2.cs.firmware = APMFirmware;
|
|
}
|
|
|
|
private void MainV2_Resize(object sender, EventArgs e)
|
|
{
|
|
Console.WriteLine("myview width " + MyView.Width + " height " + MyView.Height);
|
|
Console.WriteLine("this width " + this.Width + " height " + this.Height);
|
|
}
|
|
|
|
private void MenuHelp_Click(object sender, EventArgs e)
|
|
{
|
|
MyView.Controls.Clear();
|
|
|
|
UserControl temp = new GCSViews.Help();
|
|
|
|
fixtheme(temp);
|
|
|
|
temp.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
|
|
|
|
temp.Dock = DockStyle.Fill;
|
|
|
|
MyView.Controls.Add(temp);
|
|
|
|
temp.ForeColor = Color.White;
|
|
|
|
temp.BackColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
}
|
|
|
|
public static void updatecheck(Label loadinglabel)
|
|
{
|
|
try
|
|
{
|
|
string baseurl = "http://ardupilot-mega.googlecode.com/git/Tools/ArdupilotMegaPlanner/bin/Release/";
|
|
bool update = updatecheck(loadinglabel, baseurl, "");
|
|
System.Diagnostics.Process P = new System.Diagnostics.Process();
|
|
if (MAC)
|
|
{
|
|
P.StartInfo.FileName = "mono";
|
|
P.StartInfo.Arguments = " \"" + Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + "Updater.exe\"";
|
|
}
|
|
else
|
|
{
|
|
P.StartInfo.FileName = Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + "Updater.exe";
|
|
P.StartInfo.Arguments = "";
|
|
try
|
|
{
|
|
foreach (string newupdater in Directory.GetFiles(Path.GetDirectoryName(Application.ExecutablePath), "Updater.exe*.new"))
|
|
{
|
|
File.Copy(newupdater, newupdater.Remove(newupdater.Length - 4), true);
|
|
File.Delete(newupdater);
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
}
|
|
}
|
|
if (loadinglabel != null)
|
|
loadinglabel.Text = "Starting Updater";
|
|
Console.WriteLine("Start " + P.StartInfo.FileName + " with " + P.StartInfo.Arguments);
|
|
P.Start();
|
|
try
|
|
{
|
|
Application.Exit();
|
|
}
|
|
catch { }
|
|
}
|
|
catch (Exception ex) { MessageBox.Show("Update Failed " + ex.Message); }
|
|
}
|
|
private static bool updatecheck(Label loadinglabel, string baseurl, string subdir)
|
|
{
|
|
bool update = false;
|
|
List<string> files = new List<string>();
|
|
|
|
// Create a request using a URL that can receive a post.
|
|
Console.WriteLine(baseurl);
|
|
WebRequest request = WebRequest.Create(baseurl);
|
|
request.Timeout = 10000;
|
|
// Set the Method property of the request to POST.
|
|
request.Method = "GET";
|
|
// Get the request stream.
|
|
Stream dataStream; //= request.GetRequestStream();
|
|
// Get the response.
|
|
WebResponse response = request.GetResponse();
|
|
// Display the status.
|
|
Console.WriteLine(((HttpWebResponse)response).StatusDescription);
|
|
// Get the stream containing content returned by the server.
|
|
dataStream = response.GetResponseStream();
|
|
// Open the stream using a StreamReader for easy access.
|
|
StreamReader reader = new StreamReader(dataStream);
|
|
// Read the content.
|
|
string responseFromServer = reader.ReadToEnd();
|
|
// Display the content.
|
|
Regex regex = new Regex("href=\"([^\"]+)\"", RegexOptions.IgnoreCase);
|
|
if (regex.IsMatch(responseFromServer))
|
|
{
|
|
MatchCollection matchs = regex.Matches(responseFromServer);
|
|
for (int i = 0; i < matchs.Count; i++)
|
|
{
|
|
if (matchs[i].Groups[1].Value.ToString().Contains(".."))
|
|
continue;
|
|
if (matchs[i].Groups[1].Value.ToString().Contains("http"))
|
|
continue;
|
|
files.Add(System.Web.HttpUtility.UrlDecode(matchs[i].Groups[1].Value.ToString()));
|
|
}
|
|
}
|
|
|
|
//Console.WriteLine(responseFromServer);
|
|
// Clean up the streams.
|
|
reader.Close();
|
|
dataStream.Close();
|
|
response.Close();
|
|
|
|
string dir = Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + subdir;
|
|
if (!Directory.Exists(dir))
|
|
Directory.CreateDirectory(dir);
|
|
foreach (string file in files)
|
|
{
|
|
if (file.Equals("/"))
|
|
{
|
|
continue;
|
|
}
|
|
if (file.EndsWith("/"))
|
|
{
|
|
update = updatecheck(loadinglabel, baseurl + file, file) && update;
|
|
continue;
|
|
}
|
|
if (loadinglabel != null)
|
|
loadinglabel.Text = "Checking " + file;
|
|
// Create a request using a URL that can receive a post.
|
|
request = WebRequest.Create(baseurl + file);
|
|
Console.Write(baseurl + file + " ");
|
|
// Set the Method property of the request to POST.
|
|
request.Method = "HEAD";
|
|
// Get the response.
|
|
response = request.GetResponse();
|
|
// Display the status.
|
|
Console.WriteLine(((HttpWebResponse)response).StatusDescription);
|
|
// Get the stream containing content returned by the server.
|
|
dataStream = response.GetResponseStream();
|
|
// Open the stream using a StreamReader for easy access.
|
|
|
|
string path = Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + subdir + file;
|
|
|
|
bool getfile = false;
|
|
|
|
if (File.Exists(path))
|
|
{
|
|
FileInfo fi = new FileInfo(path);
|
|
|
|
if (fi.Length != response.ContentLength)
|
|
{
|
|
getfile = true;
|
|
Console.WriteLine("NEW FILE " + file);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
getfile = true;
|
|
Console.WriteLine("NEW FILE " + file);
|
|
// get it
|
|
}
|
|
|
|
reader.Close();
|
|
dataStream.Close();
|
|
response.Close();
|
|
|
|
if (getfile)
|
|
{
|
|
if (!update)
|
|
{
|
|
//DialogResult dr = MessageBox.Show("Update Found\n\nDo you wish to update now?", "Update Now", MessageBoxButtons.YesNo);
|
|
//if (dr == DialogResult.Yes)
|
|
{
|
|
update = true;
|
|
}
|
|
//else
|
|
{
|
|
// return;
|
|
}
|
|
}
|
|
if (loadinglabel != null)
|
|
loadinglabel.Text = "Getting " + file;
|
|
|
|
// Create a request using a URL that can receive a post.
|
|
request = WebRequest.Create(baseurl + file);
|
|
// Set the Method property of the request to POST.
|
|
request.Method = "GET";
|
|
// Get the response.
|
|
response = request.GetResponse();
|
|
// Display the status.
|
|
Console.WriteLine(((HttpWebResponse)response).StatusDescription);
|
|
// Get the stream containing content returned by the server.
|
|
dataStream = response.GetResponseStream();
|
|
|
|
long bytes = response.ContentLength;
|
|
long contlen = bytes;
|
|
|
|
byte[] buf1 = new byte[1024];
|
|
|
|
FileStream fs = new FileStream(path + ".new", FileMode.Create); //
|
|
|
|
DateTime dt = DateTime.Now;
|
|
|
|
dataStream.ReadTimeout = 30000;
|
|
|
|
while (dataStream.CanRead)
|
|
{
|
|
Application.DoEvents();
|
|
try
|
|
{
|
|
if (dt.Second != DateTime.Now.Second)
|
|
{
|
|
if (loadinglabel != null)
|
|
loadinglabel.Text = "Getting " + file + ": " + Math.Abs(bytes) + " bytes";//(((double)(contlen - bytes) / (double)contlen) * 100).ToString("0.0") + "%";
|
|
dt = DateTime.Now;
|
|
}
|
|
}
|
|
catch { }
|
|
Console.WriteLine(file + " " + bytes);
|
|
int len = dataStream.Read(buf1, 0, 1024);
|
|
if (len == 0)
|
|
break;
|
|
bytes -= len;
|
|
fs.Write(buf1, 0, len);
|
|
}
|
|
|
|
fs.Close();
|
|
dataStream.Close();
|
|
response.Close();
|
|
}
|
|
|
|
|
|
}
|
|
|
|
//P.StartInfo.CreateNoWindow = true;
|
|
//P.StartInfo.RedirectStandardOutput = true;
|
|
return update;
|
|
|
|
|
|
}
|
|
|
|
private void toolStripMenuItem3_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
|
|
{
|
|
if (keyData == (Keys.Control | Keys.F))
|
|
{
|
|
Form frm = new temp();
|
|
fixtheme(frm);
|
|
frm.Show();
|
|
return true;
|
|
}
|
|
if (keyData == (Keys.Control | Keys.G)) // test
|
|
{
|
|
Form frm = new SerialOutput();
|
|
fixtheme(frm);
|
|
frm.Show();
|
|
return true;
|
|
}
|
|
if (keyData == (Keys.Control | Keys.T)) // for ryan beall
|
|
{
|
|
MainV2.comPort.Open(false);
|
|
return true;
|
|
}
|
|
if (keyData == (Keys.Control | Keys.J)) // for jani
|
|
{
|
|
string data = "!!";
|
|
Common.InputBox("inject", "enter data to be written", ref data);
|
|
MainV2.comPort.Write(data + "\r");
|
|
return true;
|
|
}
|
|
return base.ProcessCmdKey(ref msg, keyData);
|
|
}
|
|
|
|
private void starttest()
|
|
{
|
|
MyView.Controls.Clear();
|
|
|
|
UserControl temp = new GCSViews.test();
|
|
|
|
fixtheme(temp);
|
|
|
|
temp.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
|
|
|
|
temp.Dock = DockStyle.Fill;
|
|
|
|
MyView.Controls.Add(temp);
|
|
|
|
temp.ForeColor = Color.White;
|
|
|
|
temp.BackColor = Color.FromArgb(0x26, 0x27, 0x28);
|
|
}
|
|
public void changelanguage(CultureInfo ci)
|
|
{
|
|
if (ci != null && !Thread.CurrentThread.CurrentUICulture.Equals(ci))
|
|
{
|
|
Thread.CurrentThread.CurrentUICulture = ci;
|
|
config["language"] = ci.Name;
|
|
//System.Threading.Thread.CurrentThread.CurrentCulture = ci;
|
|
|
|
HashSet<Control> views = new HashSet<Control> { FlightData, FlightPlanner, Simulation, Firmware };
|
|
|
|
foreach (Control view in MyView.Controls)
|
|
views.Add(view);
|
|
|
|
foreach (Control view in views)
|
|
{
|
|
if (view != null)
|
|
{
|
|
ComponentResourceManager rm = new ComponentResourceManager(view.GetType());
|
|
foreach (Control ctrl in view.Controls)
|
|
applyresource(rm, ctrl);
|
|
rm.ApplyResources(view, "$this");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void applyresource(ComponentResourceManager rm, Control ctrl)
|
|
{
|
|
rm.ApplyResources(ctrl, ctrl.Name);
|
|
foreach (Control subctrl in ctrl.Controls)
|
|
applyresource(rm, subctrl);
|
|
|
|
if (ctrl.ContextMenu != null)
|
|
applyresource(rm, ctrl.ContextMenu);
|
|
|
|
|
|
if (ctrl is DataGridView)
|
|
{
|
|
foreach (DataGridViewColumn col in (ctrl as DataGridView).Columns)
|
|
rm.ApplyResources(col, col.Name);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
private void applyresource(ComponentResourceManager rm, Menu menu)
|
|
{
|
|
rm.ApplyResources(menu, menu.Name);
|
|
foreach (MenuItem submenu in menu.MenuItems)
|
|
applyresource(rm, submenu);
|
|
}
|
|
|
|
public static CultureInfo getcultureinfo(string name)
|
|
{
|
|
try
|
|
{
|
|
return new CultureInfo(name);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private void MainV2_FormClosing(object sender, FormClosingEventArgs e)
|
|
{
|
|
config["MainHeight"] = this.Height;
|
|
config["MainWidth"] = this.Width;
|
|
config["MainMaximised"] = this.WindowState.ToString();
|
|
|
|
try
|
|
{
|
|
comPort.logreadmode = false;
|
|
if (comPort.logfile != null)
|
|
comPort.logfile.Close();
|
|
}
|
|
catch { }
|
|
|
|
}
|
|
|
|
public static string getConfig(string paramname)
|
|
{
|
|
if (config[paramname] != null)
|
|
return config[paramname].ToString();
|
|
return "";
|
|
}
|
|
|
|
public void changeunits()
|
|
{
|
|
try
|
|
{
|
|
// dist
|
|
if (MainV2.config["distunits"] != null)
|
|
{
|
|
switch ((Common.distances)Enum.Parse(typeof(Common.distances), MainV2.config["distunits"].ToString()))
|
|
{
|
|
case Common.distances.Meters:
|
|
MainV2.cs.multiplierdist = 1;
|
|
break;
|
|
case Common.distances.Feet:
|
|
MainV2.cs.multiplierdist = 3.2808399f;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// speed
|
|
if (MainV2.config["speedunits"] != null)
|
|
{
|
|
switch ((Common.speeds)Enum.Parse(typeof(Common.speeds), MainV2.config["speedunits"].ToString()))
|
|
{
|
|
case Common.speeds.ms:
|
|
MainV2.cs.multiplierspeed = 1;
|
|
break;
|
|
case Common.speeds.fps:
|
|
MainV2.cs.multiplierdist = 3.2808399f;
|
|
break;
|
|
case Common.speeds.kph:
|
|
MainV2.cs.multiplierspeed = 3.6f;
|
|
break;
|
|
case Common.speeds.mph:
|
|
MainV2.cs.multiplierspeed = 2.23693629f;
|
|
break;
|
|
case Common.speeds.knots:
|
|
MainV2.cs.multiplierspeed = 1.94384449f;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
catch { }
|
|
|
|
}
|
|
private void CMB_baudrate_TextChanged(object sender, EventArgs e)
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
int baud = 0;
|
|
for (int i = 0; i < CMB_baudrate.Text.Length; i++)
|
|
if (char.IsDigit(CMB_baudrate.Text[i]))
|
|
{
|
|
sb.Append(CMB_baudrate.Text[i]);
|
|
baud = baud * 10 + CMB_baudrate.Text[i] - '0';
|
|
}
|
|
if (CMB_baudrate.Text != sb.ToString())
|
|
CMB_baudrate.Text = sb.ToString();
|
|
try
|
|
{
|
|
if (baud > 0 && comPort.BaseStream.BaudRate != baud)
|
|
comPort.BaseStream.BaudRate = baud;
|
|
}
|
|
catch (Exception) { }
|
|
}
|
|
}
|
|
} |