ardupilot/Tools/ArdupilotMegaPlanner/GCSViews/FlightData.cs
Michael Oborne 25bcfdd1e7 Mission Planner 1.2.12
add arduino chip detect
fix apm2,2.5 dialog test
add write timeout. this will stop planner hangs on bad serial devices.
change quickview decimal places to 0.00
fix map clicking issue.
fix wind direction wrapping
add airspeed use
modify firmware screen from Marooned
major flightdata tab change.
add save/load polygon from file
add some error handling dialogs
2012-09-20 07:37:36 +08:00

2618 lines
94 KiB
C#

using System;
using System.Collections.Generic; // Lists
using System.Text; // stringbuilder
using System.Drawing; // pens etc
using System.IO; // file io
using System.IO.Ports; // serial
using System.Windows.Forms; // Forms
using System.Collections; // hashs
using System.Text.RegularExpressions; // regex
using System.Xml; // GE xml alt reader
using System.Net; // dns, ip address
using System.Net.Sockets; // tcplistner
using GMap.NET;
using GMap.NET.WindowsForms;
using System.Globalization; // language
using GMap.NET.WindowsForms.Markers;
using ZedGraph; // Graphs
using System.Drawing.Drawing2D;
using ArdupilotMega.Controls;
using ArdupilotMega.Utilities;
using ArdupilotMega.Controls.BackstageView;
using Crom.Controls.Docking;
using System.Reflection;
// written by michael oborne
namespace ArdupilotMega.GCSViews
{
partial class FlightData : MyUserControl, IActivate, IDeactivate
{
ArdupilotMega.MAVLink comPort = MainV2.comPort;
public static int threadrun = 0;
StreamWriter swlog;
int tickStart = 0;
RollingPointPairList list1 = new RollingPointPairList(1200);
RollingPointPairList list2 = new RollingPointPairList(1200);
RollingPointPairList list3 = new RollingPointPairList(1200);
RollingPointPairList list4 = new RollingPointPairList(1200);
RollingPointPairList list5 = new RollingPointPairList(1200);
RollingPointPairList list6 = new RollingPointPairList(1200);
RollingPointPairList list7 = new RollingPointPairList(1200);
RollingPointPairList list8 = new RollingPointPairList(1200);
RollingPointPairList list9 = new RollingPointPairList(1200);
RollingPointPairList list10 = new RollingPointPairList(1200);
System.Reflection.PropertyInfo list1item = null;
System.Reflection.PropertyInfo list2item = null;
System.Reflection.PropertyInfo list3item = null;
System.Reflection.PropertyInfo list4item = null;
System.Reflection.PropertyInfo list5item = null;
System.Reflection.PropertyInfo list6item = null;
System.Reflection.PropertyInfo list7item = null;
System.Reflection.PropertyInfo list8item = null;
System.Reflection.PropertyInfo list9item = null;
System.Reflection.PropertyInfo list10item = null;
CurveItem list1curve;
CurveItem list2curve;
CurveItem list3curve;
CurveItem list4curve;
CurveItem list5curve;
CurveItem list6curve;
CurveItem list7curve;
CurveItem list8curve;
CurveItem list9curve;
CurveItem list10curve;
internal static GMapOverlay kmlpolygons;
internal static GMapOverlay geofence;
Dictionary<Guid, Form> formguids = new Dictionary<Guid,Form>();
bool huddropout = false;
bool huddropoutresize = false;
private DockStateSerializer _serializer = null;
DockableFormInfo dockhud;
List<PointLatLng> trackPoints = new List<PointLatLng>();
const float rad2deg = (float)(180 / Math.PI);
const float deg2rad = (float)(1.0 / rad2deg);
public static ArdupilotMega.Controls.HUD myhud = null;
public static GMapControl mymap = null;
bool playingLog = false;
double LogPlayBackSpeed = 1.0;
AviWriter aviwriter;
public SplitContainer MainHcopy = null;
public static FlightData instance;
protected override void Dispose(bool disposing)
{
threadrun = 0;
MainV2.comPort.logreadmode = false;
MainV2.config["FlightSplitter"] = hud1.Width;
_serializer.Save();
SaveWindowLayout();
System.Threading.Thread.Sleep(100);
base.Dispose(disposing);
}
public FlightData()
{
InitializeComponent();
instance = this;
_serializer = new DockStateSerializer(dockContainer1);
_serializer.SavePath = Application.StartupPath + Path.DirectorySeparatorChar + "FDscreen.xml";
dockContainer1.PreviewRenderer = new PreviewRenderer();
mymap = gMapControl1;
myhud = hud1;
MainHcopy = MainH;
// setup default tuning graph
if (MainV2.config["Tuning_Graph_Selected"] != null)
{
string line = MainV2.config["Tuning_Graph_Selected"].ToString();
string[] lines = line.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string option in lines)
{
chk_box_CheckedChanged((object)(new CheckBox() { Name = option, Checked = true }), new EventArgs());
}
}
else
{
chk_box_CheckedChanged((object)(new CheckBox() { Name = "roll", Checked = true }), new EventArgs());
chk_box_CheckedChanged((object)(new CheckBox() { Name = "pitch", Checked = true }), new EventArgs());
chk_box_CheckedChanged((object)(new CheckBox() { Name = "nav_roll", Checked = true }), new EventArgs());
chk_box_CheckedChanged((object)(new CheckBox() { Name = "nav_pitch", Checked = true }), new EventArgs());
}
for (int f = 1; f < 10; f++)
{
// load settings
if (MainV2.config["quickView" + f] != null)
{
Control[] ctls = this.Controls.Find("quickView" + f, true);
if (ctls.Length > 0)
{
// set description
((QuickView)ctls[0]).desc = MainV2.config["quickView" + f].ToString();
// set databinding for value
((QuickView)ctls[0]).DataBindings.Clear();
((QuickView)ctls[0]).DataBindings.Add(new System.Windows.Forms.Binding("number", this.bindingSource1, MainV2.config["quickView" + f].ToString(), true));
}
}
}
foreach (string item in MainV2.config.Keys)
{
if (item.StartsWith("hud1_useritem_"))
{
string selection = item.Replace("hud1_useritem_", "");
CheckBox chk = new CheckBox();
chk.Name = selection;
chk.Checked = true;
HUD.Custom cust = new HUD.Custom();
cust.Header = MainV2.config[item].ToString();
addHudUserItem(ref cust, chk);
}
}
List<string> list = new List<string>();
{
list.Add("LOITER_UNLIM");
list.Add("RETURN_TO_LAUNCH");
list.Add("PREFLIGHT_CALIBRATION");
list.Add("MISSION_START");
list.Add("PREFLIGHT_REBOOT_SHUTDOWN");
//DO_SET_SERVO
//DO_REPEAT_SERVO
}
CMB_action.DataSource = list;
CMB_modes.DataSource = Common.getModesList();
CMB_modes.ValueMember = "Key";
CMB_modes.DisplayMember = "Value";
CMB_setwp.SelectedIndex = 0;
zg1.Visible = true;
CreateChart(zg1);
// config map
gMapControl1.MapType = MapType.GoogleSatellite;
gMapControl1.MinZoom = 1;
gMapControl1.CacheLocation = Path.GetDirectoryName(Application.ExecutablePath) + "/gmapcache/";
gMapControl1.OnMapZoomChanged += new MapZoomChanged(gMapControl1_OnMapZoomChanged);
gMapControl1.Zoom = 3;
gMapControl1.RoutesEnabled = true;
gMapControl1.PolygonsEnabled = true;
kmlpolygons = new GMapOverlay(gMapControl1, "kmlpolygons");
gMapControl1.Overlays.Add(kmlpolygons);
geofence = new GMapOverlay(gMapControl1, "geofence");
gMapControl1.Overlays.Add(geofence);
polygons = new GMapOverlay(gMapControl1, "polygons");
gMapControl1.Overlays.Add(polygons);
routes = new GMapOverlay(gMapControl1, "routes");
gMapControl1.Overlays.Add(routes);
try
{
if (MainV2.getConfig("GspeedMAX") != "")
{
Gspeed.MaxValue = float.Parse(MainV2.getConfig("GspeedMAX"));
}
}
catch { }
SetupDocking();
if (File.Exists(_serializer.SavePath) == true)
{
try
{
_serializer.Load(true, GetFormFromGuid);
}
catch { }
}
cleanupDocks();
}
void SetupDocking()
{
this.SuspendLayout();
dockhud = CreateFormAndGuid(dockContainer1, hud1, "fd_hud_guid");
DockableFormInfo dockmap = CreateFormAndGuid(dockContainer1, tableMap, "fd_map_guid");
DockableFormInfo dockquick = CreateFormAndGuid(dockContainer1, tabQuick, "fd_quick_guid");
DockableFormInfo dockactions = CreateFormAndGuid(dockContainer1, tabActions, "fd_actions_guid");
DockableFormInfo dockguages = CreateFormAndGuid(dockContainer1, tabGauges, "fd_guages_guid");
DockableFormInfo dockstatus = CreateFormAndGuid(dockContainer1, tabStatus, "fd_status_guid");
DockableFormInfo docktlogs = CreateFormAndGuid(dockContainer1, tabTLogs, "fd_tlogs_guid");
dockContainer1.DockForm(dockmap, DockStyle.Fill, zDockMode.Outer);
dockContainer1.DockForm(dockquick, DockStyle.Right, zDockMode.Outer);
dockContainer1.DockForm(dockhud, DockStyle.Left, zDockMode.Outer);
dockContainer1.DockForm(dockactions, dockhud, DockStyle.Bottom, zDockMode.Outer);
dockContainer1.DockForm(dockguages, dockactions, DockStyle.Fill, zDockMode.Inner);
dockContainer1.DockForm(dockstatus, dockactions, DockStyle.Fill, zDockMode.Inner);
dockContainer1.DockForm(docktlogs, dockactions, DockStyle.Fill, zDockMode.Inner);
dockactions.IsSelected = true;
if (MainV2.config["FlightSplitter"] != null)
{
dockContainer1.SetWidth(dockhud, int.Parse(MainV2.config["FlightSplitter"].ToString()));
}
dockContainer1.SetHeight(dockhud, hud1.Height);
this.ResumeLayout();
}
void cleanupDocks()
{
// cleanup from load
for (int a = 0; a < dockContainer1.Count; a++)
{
DockableFormInfo info = dockContainer1.GetFormInfoAt(a);
info.ShowCloseButton = false;
info.ShowContextMenuButton = false;
}
dockContainer1.Invalidate();
}
void SaveWindowLayout()
{
XmlTextWriter xmlwriter = new XmlTextWriter(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"FDLayout.xml", Encoding.ASCII);
xmlwriter.Formatting = Formatting.Indented;
xmlwriter.WriteStartDocument();
xmlwriter.WriteStartElement("ScreenLayout");
//xmlwriter.WriteElementString("comport", comPortName);
for (int a = 0; a < dockContainer1.Count; a++)
{
DockableFormInfo info = dockContainer1.GetFormInfoAt(a);
xmlwriter.WriteStartElement("Form");
object thisBoxed = info;
Type test = thisBoxed.GetType();
foreach (var field in test.GetProperties())
{
// field.Name has the field's name.
object fieldValue;
try
{
fieldValue = field.GetValue(thisBoxed,null); // Get value
}
catch { continue; }
// Get the TypeCode enumeration. Multiple types get mapped to a common typecode.
TypeCode typeCode = Type.GetTypeCode(fieldValue.GetType());
xmlwriter.WriteElementString(field.Name, fieldValue.ToString());
}
// DockableContainer dockcont = info as DockableContainer;
// dockContainer1.
xmlwriter.WriteEndElement();
}
xmlwriter.WriteEndElement();
xmlwriter.WriteEndDocument();
xmlwriter.Close();
}
DockableFormInfo CreateFormAndGuid(DockContainer dock, Control ctl, string configguidref)
{
Guid gu = GetOrCreateGuid(configguidref);
Form frm;
if (formguids.ContainsKey(gu))
{
frm = formguids[gu];
}
else
{
frm = CreateFormFromControl(ctl);
frm.AutoScroll = true;
formguids[gu] = frm;
}
return dock.Add(frm, Crom.Controls.Docking.zAllowedDock.All, gu);
}
Guid GetOrCreateGuid(string configname)
{
if (!MainV2.config.ContainsKey(configname))
{
MainV2.config[configname] = Guid.NewGuid().ToString();
}
return new Guid(MainV2.config[configname].ToString());
}
Form GetFormFromGuid(Guid id)
{
return formguids[id];
}
Form CreateFormFromControl(Control ctl)
{
ctl.Dock = DockStyle.Fill;
Form newform = new Form();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainV2));
newform.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
try
{
if (ctl is TabPage)
{
TabPage tp = ctl as TabPage;
newform.Text = ctl.Text;
while (tp.Controls.Count > 0)
{
newform.Controls.Add(tp.Controls[0]);
}
if (tp == tabQuick)
{
newform.Resize += tabQuick_Resize;
}
if (tp == tabStatus)
{
newform.Resize += tabStatus_Resize;
newform.Load += tabStatus_Resize;
//newform.Resize += tab1
}
if (tp == tabGauges)
{
newform.Resize += tabPage1_Resize;
}
}
else if (ctl is Form)
{
return (Form)ctl;
}
else
{
newform.Text = ctl.Text;
newform.Controls.Add(ctl);
if (ctl is HUD)
{
newform.Text = "Hud";
}
if (ctl is myGMAP)
{
newform.Text = "Map";
}
}
}
catch { }
return newform;
}
void tabStatus_Resize(object sender, EventArgs e)
{
// localise it
Control tabStatus = sender as Control;
// tabStatus.SuspendLayout();
//foreach (Control temp in tabStatus.Controls)
{
// temp.DataBindings.Clear();
//temp.Dispose();
}
//tabStatus.Controls.Clear();
int x = 10;
int y = 10;
object thisBoxed = MainV2.cs;
Type test = thisBoxed.GetType();
foreach (var field in test.GetProperties())
{
// field.Name has the field's name.
object fieldValue;
try
{
fieldValue = field.GetValue(thisBoxed, null); // Get value
}
catch { continue; }
// Get the TypeCode enumeration. Multiple types get mapped to a common typecode.
TypeCode typeCode = Type.GetTypeCode(fieldValue.GetType());
bool add = true;
MyLabel lbl1 = new MyLabel();
MyLabel lbl2 = new MyLabel();
try
{
lbl1 = (MyLabel)tabStatus.Controls.Find(field.Name, false)[0];
lbl2 = (MyLabel)tabStatus.Controls.Find(field.Name + "value", false)[0];
add = false;
}
catch { }
if (add)
{
lbl1.Location = new Point(x, y);
lbl1.Size = new System.Drawing.Size(75, 13);
lbl1.Text = field.Name;
lbl1.Name = field.Name;
lbl1.Visible = true;
lbl2.AutoSize = false;
lbl2.Location = new Point(lbl1.Right + 5, y);
lbl2.Size = new System.Drawing.Size(50, 13);
//if (lbl2.Name == "")
lbl2.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bindingSource1, field.Name, false, System.Windows.Forms.DataSourceUpdateMode.OnValidation, "0"));
lbl2.Name = field.Name + "value";
lbl2.Visible = true;
//lbl2.Text = fieldValue.ToString();
tabStatus.Controls.Add(lbl1);
tabStatus.Controls.Add(lbl2);
}
else
{
lbl1.Location = new Point(x, y);
lbl2.Location = new Point(lbl1.Right + 5, y);
}
//Application.DoEvents();
x += 0;
y += 15;
if (y > tabStatus.Height - 30)
{
x += 140;
y = 10;
}
}
tabStatus.Width = x;
// tabStatus.ResumeLayout();
}
public void Activate()
{
if (CB_tuning.Checked)
ZedGraphTimer.Start();
if (MainV2.MONO)
{
if (!hud1.Visible)
hud1.Visible = true;
if (!hud1.Enabled)
hud1.Enabled = true;
hud1.Dock = DockStyle.Fill;
}
foreach (Control ctl in splitContainer1.Panel2.Controls)
{
ctl.Visible = true;
}
}
public void Deactivate()
{
if (MainV2.MONO)
{
hud1.Dock = DockStyle.None;
hud1.Size = new System.Drawing.Size(5, 5);
hud1.Enabled = false;
hud1.Visible = false;
}
// hud1.Location = new Point(-1000,-1000);
ZedGraphTimer.Stop();
}
void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
// Draw the background of the ListBox control for each item.
//e.DrawBackground();
// Define the default color of the brush as black.
Brush myBrush = Brushes.Black;
LinearGradientBrush linear = new LinearGradientBrush(e.Bounds, Color.FromArgb(0x94, 0xc1, 0x1f), Color.FromArgb(0xcd, 0xe2, 0x96), LinearGradientMode.Vertical);
e.Graphics.FillRectangle(linear, e.Bounds);
// Draw the current item text based on the current Font
// and the custom brush settings.
e.Graphics.DrawString(((TabControl)sender).TabPages[e.Index].Text.ToString(),
e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);
// If the ListBox has focus, draw a focus rectangle around the selected item.
e.DrawFocusRectangle();
}
void gMapControl1_OnMapZoomChanged()
{
Zoomlevel.Value = Convert.ToDecimal(gMapControl1.Zoom);
}
private void FlightData_Load(object sender, EventArgs e)
{
System.Threading.Thread t11 = new System.Threading.Thread(new System.Threading.ThreadStart(mainloop))
{
IsBackground = true,
Name = "FlightData updater"
};
t11.Start();
//MainH.threads.Add(t11);
Zoomlevel.Minimum = gMapControl1.MinZoom;
Zoomlevel.Maximum = gMapControl1.MaxZoom + 1;
Zoomlevel.Value = Convert.ToDecimal(gMapControl1.Zoom);
if (MainV2.config["CHK_autopan"] != null)
CHK_autopan.Checked = bool.Parse(MainV2.config["CHK_autopan"].ToString());
}
private void mainloop()
{
//System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
//System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
threadrun = 1;
EndPoint Remote = (EndPoint)(new IPEndPoint(IPAddress.Any, 0));
DateTime lastdata = DateTime.MinValue;
DateTime tracklast = DateTime.Now.AddSeconds(0);
DateTime tunning = DateTime.Now.AddSeconds(0);
DateTime mapupdate = DateTime.Now.AddSeconds(0);
DateTime vidrec = DateTime.Now.AddSeconds(0);
DateTime waypoints = DateTime.Now.AddSeconds(0);
DateTime updatescreen = DateTime.Now;
DateTime tsreal = DateTime.Now;
double taketime = 0;
double timeerror = 0;
//comPort.stopall(true);
while (threadrun == 1)
{
if (threadrun == 0) { return; }
if (MainV2.giveComport == true)
{
System.Threading.Thread.Sleep(50);
continue;
}
if (!comPort.BaseStream.IsOpen)
lastdata = DateTime.Now;
// re-request servo data
if (!(lastdata.AddSeconds(8) > DateTime.Now) && comPort.BaseStream.IsOpen)
{
//Console.WriteLine("REQ streams - flightdata");
try
{
//System.Threading.Thread.Sleep(1000);
//comPort.requestDatastream((byte)ArdupilotMega.MAVLink09.MAV_DATA_STREAM.RAW_CONTROLLER, 0); // request servoout
comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.EXTENDED_STATUS, MainV2.cs.ratestatus); // mode
comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.POSITION, MainV2.cs.rateposition); // request gps
comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.EXTRA1, MainV2.cs.rateattitude); // request attitude
comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.EXTRA2, MainV2.cs.rateattitude); // request vfr
comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.EXTRA3, MainV2.cs.ratesensors); // request extra stuff - tridge
comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.RAW_SENSORS, MainV2.cs.ratesensors); // request raw sensor
comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.RC_CHANNELS, MainV2.cs.raterc); // request rc info
}
catch { }
lastdata = DateTime.Now.AddSeconds(120); // prevent flooding
}
if (!MainV2.comPort.logreadmode)
System.Threading.Thread.Sleep(100); // max is only ever 10 hz
try
{
if (aviwriter != null && vidrec.AddMilliseconds(100) <= DateTime.Now)
{
vidrec = DateTime.Now;
hud1.streamjpgenable = true;
//aviwriter.avi_start("test.avi");
// add a frame
aviwriter.avi_add(hud1.streamjpg.ToArray(), (uint)hud1.streamjpg.Length);
// write header - so even partial files will play
aviwriter.avi_end(hud1.Width, hud1.Height, 10);
}
}
catch { }
if (MainV2.comPort.logreadmode && MainV2.comPort.logplaybackfile != null)
{
if (threadrun == 0) { return; }
if (comPort.BaseStream.IsOpen)
{
MainV2.comPort.logreadmode = false;
MainV2.comPort.logplaybackfile.Close();
MainV2.comPort.logplaybackfile = null;
}
//Console.WriteLine(DateTime.Now.Millisecond);
if (updatescreen.AddMilliseconds(300) < DateTime.Now)
{
updatePlayPauseButton(true);
updateLogPlayPosition();
updatescreen = DateTime.Now;
}
//Console.WriteLine(DateTime.Now.Millisecond + " done ");
DateTime logplayback = MainV2.comPort.lastlogread;
try
{
MainV2.comPort.readPacket();
}
catch { }
double act = (MainV2.comPort.lastlogread - logplayback).TotalMilliseconds;
if (act > 9999 || act < 0)
act = 0;
double ts = 0;
if (LogPlayBackSpeed == 0)
LogPlayBackSpeed = 0.01;
try
{
ts = Math.Min((act / LogPlayBackSpeed),1000);
}
catch { }
double timetook = (DateTime.Now - tsreal).TotalMilliseconds;
if (timetook != 0)
{
//Console.WriteLine("took: " + timetook + "=" + taketime + " " + (taketime - timetook) + " " + ts);
//Console.WriteLine(MainV2.comPort.lastlogread.Second + " " + DateTime.Now.Second + " " + (MainV2.comPort.lastlogread.Second - DateTime.Now.Second));
//if ((taketime - timetook) < 0)
{
timeerror += (taketime - timetook);
if (ts != 0)
{
ts += timeerror;
timeerror = 0;
}
}
if (ts > 1000)
ts = 1000;
}
taketime = ts;
tsreal = DateTime.Now;
if (ts > 0 && ts < 1000)
System.Threading.Thread.Sleep((int)ts);
if (threadrun == 0) { return; }
tracklast = tracklast.AddMilliseconds(ts - act);
tunning = tunning.AddMilliseconds(ts - act);
if (tracklast.Month != DateTime.Now.Month)
{
tracklast = DateTime.Now;
tunning = DateTime.Now;
}
if (MainV2.comPort.logplaybackfile != null && MainV2.comPort.logplaybackfile.BaseStream.Position == MainV2.comPort.logplaybackfile.BaseStream.Length)
{
MainV2.comPort.logreadmode = false;
}
}
else
{
// ensure we know to stop
if (MainV2.comPort.logreadmode)
MainV2.comPort.logreadmode = false;
updatePlayPauseButton(false);
if (!playingLog && MainV2.comPort.logplaybackfile != null)
{
continue;
}
}
try
{
// Console.WriteLine(DateTime.Now.Millisecond);
updateBindingSource();
// Console.WriteLine(DateTime.Now.Millisecond + " done ");
if (ArdupilotMega.Controls.OpenGLtest.instance != null)
{
ArdupilotMega.Controls.OpenGLtest.instance.rpy = new OpenTK.Vector3(MainV2.cs.roll,MainV2.cs.pitch,MainV2.cs.yaw);
ArdupilotMega.Controls.OpenGLtest.instance.LocationCenter = new PointLatLngAlt(MainV2.cs.lat,MainV2.cs.lng,MainV2.cs.alt,"here");
}
if (tunning.AddMilliseconds(50) < DateTime.Now && CB_tuning.Checked == true)
{
double time = (Environment.TickCount - tickStart) / 1000.0;
if (list1item != null)
list1.Add(time, (float)list1item.GetValue((object)MainV2.cs, null));
if (list2item != null)
list2.Add(time, (float)list2item.GetValue((object)MainV2.cs, null));
if (list3item != null)
list3.Add(time, (float)list3item.GetValue((object)MainV2.cs, null));
if (list4item != null)
list4.Add(time, (float)list4item.GetValue((object)MainV2.cs, null));
if (list5item != null)
list5.Add(time, (float)list5item.GetValue((object)MainV2.cs, null));
if (list6item != null)
list6.Add(time, (float)list6item.GetValue((object)MainV2.cs, null));
if (list7item != null)
list7.Add(time, (float)list7item.GetValue((object)MainV2.cs, null));
if (list8item != null)
list8.Add(time, (float)list8item.GetValue((object)MainV2.cs, null));
if (list9item != null)
list9.Add(time, (float)list9item.GetValue((object)MainV2.cs, null));
if (list10item != null)
list10.Add(time, (float)list10item.GetValue((object)MainV2.cs, null));
}
if (tracklast.AddSeconds(1) < DateTime.Now)
{
if (MainV2.config["CHK_maprotation"] != null && MainV2.config["CHK_maprotation"].ToString() == "True")
{
// dont holdinvalidation here
setMapBearing();
}
if (route == null)
{
route = new GMapRoute(trackPoints, "track");
routes.Routes.Add(route);
}
PointLatLng currentloc = new PointLatLng(MainV2.cs.lat, MainV2.cs.lng);
gMapControl1.HoldInvalidation = true;
int cnt = 0;
while (gMapControl1.inOnPaint == true)
{
System.Threading.Thread.Sleep(1);
cnt++;
}
if (route.Points.Count > int.Parse(MainV2.config["NUM_tracklength"].ToString()))
{
// trackPoints.RemoveRange(0, trackPoints.Count - int.Parse(MainV2.config["NUM_tracklength"].ToString()));
route.Points.RemoveRange(0, route.Points.Count - int.Parse(MainV2.config["NUM_tracklength"].ToString()));
}
if (MainV2.cs.lat != 0)
{
// trackPoints.Add(currentloc);
route.Points.Add(currentloc);
}
// if (CB_tuning.Checked == false) // draw if in view
{
while (gMapControl1.inOnPaint == true)
{
System.Threading.Thread.Sleep(1);
}
//route = new GMapRoute(route.Points, "track");
//track.Stroke = Pens.Red;
//route.Stroke = new Pen(Color.FromArgb(144, Color.Red));
//route.Stroke.Width = 5;
//route.Tag = "track";
//updateClearRoutes();
gMapControl1.UpdateRouteLocalPosition(route);
if (waypoints.AddSeconds(10) < DateTime.Now)
{
//Console.WriteLine("Doing FD WP's");
updateMissionRouteMarkers();
if (MainV2.comPort.logreadmode && MainV2.comPort.logplaybackfile != null)
{
FlightPlanner.pointlist.Clear();
FlightPlanner.pointlist.AddRange(MainV2.comPort.wps);
}
foreach (PointLatLngAlt plla in FlightPlanner.pointlist)
{
if (plla == null)
break;
if (plla.Lng == 0 || plla.Lat == 0)
continue;
if (plla.Tag.StartsWith("ROI"))
{
addpolygonmarkerred(plla.Tag, plla.Lng, plla.Lat, (int)plla.Alt, plla.color, routes);
continue;
}
addpolygonmarker(plla.Tag, plla.Lng, plla.Lat, (int)plla.Alt,plla.color,polygons);
}
RegeneratePolygon();
waypoints = DateTime.Now;
}
//routes.Polygons.Add(poly);
if (route.Points.Count > 0)
{
// add primary route icon
if (routes.Markers.Count != 1)
{
routes.Markers.Clear();
routes.Markers.Add( new GMapMarkerCross(currentloc));
}
if (MainV2.cs.mode.ToLower() == "guided" && MainV2.cs.GuidedModeWP != null && MainV2.cs.GuidedModeWP.Lat != 0)
{
addpolygonmarker("Guided Mode", MainV2.cs.GuidedModeWP.Lng, MainV2.cs.GuidedModeWP.Lat, (int)MainV2.cs.GuidedModeWP.Alt, Color.Blue, routes);
}
if (MainV2.cs.firmware == MainV2.Firmwares.ArduPlane)
{
routes.Markers[0] = (new GMapMarkerPlane(currentloc, MainV2.cs.yaw, MainV2.cs.groundcourse, MainV2.cs.nav_bearing, MainV2.cs.target_bearing, gMapControl1) { ToolTipText = MainV2.cs.alt.ToString("0"), ToolTipMode = MarkerTooltipMode.Always });
}
else if (MainV2.cs.firmware == MainV2.Firmwares.ArduRover)
{
routes.Markers[0] = (new GMapMarkerRover(currentloc, MainV2.cs.yaw, MainV2.cs.groundcourse, MainV2.cs.nav_bearing, MainV2.cs.target_bearing, gMapControl1));
}
else
{
routes.Markers[0] = (new GMapMarkerQuad(currentloc, MainV2.cs.yaw, MainV2.cs.groundcourse, MainV2.cs.nav_bearing));
}
if (route.Points[route.Points.Count - 1].Lat != 0 && (mapupdate.AddSeconds(3) < DateTime.Now) && CHK_autopan.Checked)
{
updateMapPosition(currentloc);
mapupdate = DateTime.Now;
}
if (route.Points.Count == 1 && gMapControl1.Zoom == 3) // 3 is the default load zoom
{
updateMapPosition(currentloc);
updateMapZoom(17);
//gMapControl1.ZoomAndCenterMarkers("routes");// ZoomAndCenterRoutes("routes");
}
}
gMapControl1.HoldInvalidation = false;
gMapControl1.Invalidate();
}
tracklast = DateTime.Now;
}
}
catch (Exception ex) { Console.WriteLine("FD Main loop exception " + ex.ToString()); }
}
Console.WriteLine("FD Main loop exit");
}
private void setMapBearing()
{
this.Invoke((System.Windows.Forms.MethodInvoker)delegate()
{
gMapControl1.Bearing = (int)MainV2.cs.yaw;
});
}
// to prevent cross thread calls while in a draw and exception
private void updateClearRoutes()
{
// not async
this.Invoke((System.Windows.Forms.MethodInvoker)delegate()
{
routes.Routes.Clear();
routes.Routes.Add(route);
});
}
// to prevent cross thread calls while in a draw and exception
private void updateMissionRouteMarkers()
{
// not async
this.Invoke((System.Windows.Forms.MethodInvoker)delegate()
{
polygons.Markers.Clear();
routes.Markers.Clear();
});
}
private void updatePlayPauseButton(bool playing)
{
if (playing)
{
if (BUT_playlog.Text == "Pause")
return;
this.BeginInvoke((System.Windows.Forms.MethodInvoker)delegate()
{
try
{
BUT_playlog.Text = "Pause";
}
catch { }
});
}
else
{
if (BUT_playlog.Text == "Play")
return;
this.BeginInvoke((System.Windows.Forms.MethodInvoker)delegate()
{
try
{
BUT_playlog.Text = "Play";
}
catch { }
});
}
}
private void updateBindingSource()
{
this.BeginInvoke((System.Windows.Forms.MethodInvoker)delegate()
{
try
{
MainV2.cs.UpdateCurrentSettings(bindingSource1);
}
catch { }
});
}
private void updateMapPosition(PointLatLng currentloc)
{
this.BeginInvoke((MethodInvoker)delegate()
{
try
{
gMapControl1.Position = currentloc;
//hud1.Refresh();
}
catch { }
});
}
private void updateMapZoom(int zoom)
{
this.BeginInvoke((MethodInvoker)delegate()
{
try
{
gMapControl1.Zoom = zoom;
}
catch { }
});
}
private void updateLogPlayPosition()
{
this.BeginInvoke((MethodInvoker)delegate()
{
try
{
if (tracklog.Visible)
tracklog.Value = (int)(MainV2.comPort.logplaybackfile.BaseStream.Position / (double)MainV2.comPort.logplaybackfile.BaseStream.Length * 100);
if (lbl_logpercent.Visible)
lbl_logpercent.Text = (MainV2.comPort.logplaybackfile.BaseStream.Position / (double)MainV2.comPort.logplaybackfile.BaseStream.Length).ToString("0.00%");
}
catch { }
});
}
private void addpolygonmarker(string tag, double lng, double lat, int alt, Color? color, GMapOverlay overlay)
{
try
{
PointLatLng point = new PointLatLng(lat, lng);
GMapMarkerGoogleGreen m = new GMapMarkerGoogleGreen(point);
m.ToolTipMode = MarkerTooltipMode.Always;
m.ToolTipText = tag;
m.Tag = tag;
GMapMarkerRect mBorders = new GMapMarkerRect(point);
{
mBorders.InnerMarker = m;
try
{
mBorders.wprad = (int)(float.Parse(ArdupilotMega.MainV2.config["TXT_WPRad"].ToString()) / MainV2.cs.multiplierdist);
}
catch { }
mBorders.MainMap = gMapControl1;
if (color.HasValue)
{
mBorders.Color = color.Value;
}
}
overlay.Markers.Add(m);
overlay.Markers.Add(mBorders);
}
catch (Exception) { }
}
private void addpolygonmarkerred(string tag, double lng, double lat, int alt, Color? color, GMapOverlay overlay)
{
try
{
PointLatLng point = new PointLatLng(lat, lng);
GMapMarkerGoogleRed m = new GMapMarkerGoogleRed(point);
m.ToolTipMode = MarkerTooltipMode.Always;
m.ToolTipText = tag;
m.Tag = tag;
GMapMarkerRect mBorders = new GMapMarkerRect(point);
{
mBorders.InnerMarker = m;
}
overlay.Markers.Add(m);
overlay.Markers.Add(mBorders);
}
catch (Exception) { }
}
/// <summary>
/// used to redraw the polygon
/// </summary>
void RegeneratePolygon()
{
List<PointLatLng> polygonPoints = new List<PointLatLng>();
if (routes == null)
return;
foreach (GMapMarker m in polygons.Markers)
{
if (m is GMapMarkerRect)
{
m.Tag = polygonPoints.Count;
polygonPoints.Add(m.Position);
}
}
if (polygon == null)
{
polygon = new GMapPolygon(polygonPoints, "polygon test");
polygons.Polygons.Add(polygon);
}
else
{
polygon.Points.Clear();
polygon.Points.AddRange(polygonPoints);
polygon.Stroke = new Pen(Color.Yellow, 4);
if (polygons.Polygons.Count == 0)
{
polygons.Polygons.Add(polygon);
}
else
{
gMapControl1.UpdatePolygonLocalPosition(polygon);
}
}
}
GMapPolygon polygon;
GMapOverlay polygons;
GMapOverlay routes;
GMapRoute route;
public void CreateChart(ZedGraphControl zgc)
{
GraphPane myPane = zgc.GraphPane;
// Set the titles and axis labels
myPane.Title.Text = "Tuning";
myPane.XAxis.Title.Text = "Time (s)";
myPane.YAxis.Title.Text = "Unit";
// Show the x axis grid
myPane.XAxis.MajorGrid.IsVisible = true;
myPane.XAxis.Scale.Min = 0;
myPane.XAxis.Scale.Max = 5;
// Make the Y axis scale red
myPane.YAxis.Scale.FontSpec.FontColor = Color.White;
myPane.YAxis.Title.FontSpec.FontColor = Color.White;
// turn off the opposite tics so the Y tics don't show up on the Y2 axis
myPane.YAxis.MajorTic.IsOpposite = false;
myPane.YAxis.MinorTic.IsOpposite = false;
// Don't display the Y zero line
myPane.YAxis.MajorGrid.IsZeroLine = true;
// Align the Y axis labels so they are flush to the axis
myPane.YAxis.Scale.Align = AlignP.Inside;
// Manually set the axis range
//myPane.YAxis.Scale.Min = -1;
//myPane.YAxis.Scale.Max = 1;
// Fill the axis background with a gradient
//myPane.Chart.Fill = new Fill(Color.White, Color.LightGray, 45.0f);
// Sample at 50ms intervals
ZedGraphTimer.Interval = 100;
//timer1.Enabled = true;
//timer1.Start();
// Calculate the Axis Scale Ranges
zgc.AxisChange();
tickStart = Environment.TickCount;
}
private void timer1_Tick(object sender, EventArgs e)
{
try
{
// Make sure that the curvelist has at least one curve
if (zg1.GraphPane.CurveList.Count <= 0)
return;
// Get the first CurveItem in the graph
LineItem curve = zg1.GraphPane.CurveList[0] as LineItem;
if (curve == null)
return;
// Get the PointPairList
IPointListEdit list = curve.Points as IPointListEdit;
// If this is null, it means the reference at curve.Points does not
// support IPointListEdit, so we won't be able to modify it
if (list == null)
return;
// Time is measured in seconds
double time = (Environment.TickCount - tickStart) / 1000.0;
// Keep the X scale at a rolling 30 second interval, with one
// major step between the max X value and the end of the axis
Scale xScale = zg1.GraphPane.XAxis.Scale;
if (time > xScale.Max - xScale.MajorStep)
{
xScale.Max = time + xScale.MajorStep;
xScale.Min = xScale.Max - 10.0;
}
// Make sure the Y axis is rescaled to accommodate actual data
zg1.AxisChange();
// Force a redraw
zg1.Invalidate();
}
catch { }
}
private void FlightData_FormClosing(object sender, FormClosingEventArgs e)
{
ZedGraphTimer.Stop();
threadrun = 0;
try
{
if (comPort.BaseStream.IsOpen)
{
comPort.Close();
}
}
catch { }
}
private void BUT_clear_track_Click(object sender, EventArgs e)
{
if (route !=null)
route.Points.Clear();
}
private void BUT_save_log_Click(object sender, EventArgs e)
{
// close existing log first
if (swlog != null)
swlog.Close();
try
{
Directory.CreateDirectory(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"logs");
swlog = new StreamWriter(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"logs" + Path.DirectorySeparatorChar + DateTime.Now.ToString("yyyy-MM-dd HH-mm") + " telem.log");
}
catch { CustomMessageBox.Show("Log creation error"); }
}
private void BUTactiondo_Click(object sender, EventArgs e)
{
try
{
((Button)sender).Enabled = false;
#if MAVLINK10
comPort.doCommand((MAVLink.MAV_CMD)Enum.Parse(typeof(MAVLink.MAV_CMD), CMB_action.Text),1,0,1,0,0,0,0);
#else
comPort.doAction((MAVLink.MAV_ACTION)Enum.Parse(typeof(MAVLink.MAV_ACTION), "MAV_ACTION_" + CMB_action.Text));
#endif
}
catch { CustomMessageBox.Show("The Command failed to execute"); }
((Button)sender).Enabled = true;
}
private void BUTrestartmission_Click(object sender, EventArgs e)
{
try
{
((Button)sender).Enabled = false;
//comPort.doAction(MAVLink09.MAV_ACTION.MAV_ACTION_RETURN); // set nav from
//System.Threading.Thread.Sleep(100);
comPort.setWPCurrent(1); // set nav to
//System.Threading.Thread.Sleep(100);
//comPort.doAction(MAVLink09.MAV_ACTION.MAV_ACTION_SET_AUTO); // set auto
}
catch { CustomMessageBox.Show("The command failed to execute"); }
((Button)sender).Enabled = true;
}
private void FlightData_Resize(object sender, EventArgs e)
{
//Gspeed;
//Galt;
//Gheading;
//attitudeIndicatorInstrumentControl1;
}
private void CB_tuning_CheckedChanged(object sender, EventArgs e)
{
if (CB_tuning.Checked)
{
splitContainer1.Panel1Collapsed = false;
ZedGraphTimer.Enabled = true;
ZedGraphTimer.Start();
zg1.Visible = true;
zg1.Refresh();
}
else
{
splitContainer1.Panel1Collapsed = true;
ZedGraphTimer.Enabled = false;
ZedGraphTimer.Stop();
zg1.Visible = false;
}
}
private void BUT_RAWSensor_Click(object sender, EventArgs e)
{
Form temp = new RAW_Sensor();
ThemeManager.ApplyThemeTo(temp);
temp.Show();
}
private void gMapControl1_Click(object sender, EventArgs e)
{
}
PointLatLng gotolocation = new PointLatLng();
private void gMapControl1_MouseDown(object sender, MouseEventArgs e)
{
gotolocation = gMapControl1.FromLocalToLatLng(e.X, e.Y);
}
private void goHereToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!MainV2.comPort.BaseStream.IsOpen)
{
CustomMessageBox.Show("Please Connect First");
return;
}
if (MainV2.cs.GuidedModeWP.Alt == 0)
{
flyToHereAltToolStripMenuItem_Click(null, null);
if (MainV2.cs.GuidedModeWP.Alt == 0)
return;
}
if (gotolocation.Lat == 0 || gotolocation.Lng == 0)
{
CustomMessageBox.Show("Bad Lat/Long");
return;
}
Locationwp gotohere = new Locationwp();
gotohere.id = (byte)MAVLink.MAV_CMD.WAYPOINT;
gotohere.alt = (float)(MainV2.cs.GuidedModeWP.Alt); // back to m
gotohere.lat = (float)(gotolocation.Lat);
gotohere.lng = (float)(gotolocation.Lng);
try
{
MainV2.comPort.setGuidedModeWP(gotohere);
MainV2.cs.GuidedModeWP = new PointLatLngAlt(gotohere.lat, gotohere.lng, gotohere.alt, "Guided Mode");
}
catch (Exception ex) { MainV2.giveComport = false; CustomMessageBox.Show("Error sending command : " + ex.Message); }
}
private void Zoomlevel_ValueChanged(object sender, EventArgs e)
{
try
{
if (gMapControl1.MaxZoom + 1 == (double)Zoomlevel.Value)
{
gMapControl1.Zoom = (double)Zoomlevel.Value - .1;
}
else
{
gMapControl1.Zoom = (double)Zoomlevel.Value;
}
}
catch { }
}
private void gMapControl1_MouseMove(object sender, MouseEventArgs e)
{
PointLatLng point = gMapControl1.FromLocalToLatLng(e.X, e.Y);
if (e.Button == MouseButtons.Left)
{
double latdif = gotolocation.Lat - point.Lat;
double lngdif = gotolocation.Lng - point.Lng;
try
{
gMapControl1.Position = new PointLatLng(gMapControl1.Position.Lat + latdif, gMapControl1.Position.Lng + lngdif);
}
catch { }
}
}
private void FlightData_ParentChanged(object sender, EventArgs e)
{
if (MainV2.cam != null)
{
MainV2.cam.camimage += new WebCamService.CamImage(cam_camimage);
}
}
void cam_camimage(Image camimage)
{
hud1.bgimage = camimage;
}
private void BUT_Homealt_Click(object sender, EventArgs e)
{
if (MainV2.cs.altoffsethome != 0)
{
MainV2.cs.altoffsethome = 0;
}
else
{
MainV2.cs.altoffsethome = MainV2.cs.alt / MainV2.cs.multiplierdist;
}
}
private void gMapControl1_Resize(object sender, EventArgs e)
{
gMapControl1.Zoom = gMapControl1.Zoom + 0.01;
}
private void BUT_loadtelem_Click(object sender, EventArgs e)
{
if (MainV2.comPort.logplaybackfile != null)
{
try
{
MainV2.comPort.logplaybackfile.Close();
MainV2.comPort.logplaybackfile = null;
}
catch { }
}
OpenFileDialog fd = new OpenFileDialog();
fd.AddExtension = true;
fd.Filter = "Ardupilot Telemtry log (*.tlog)|*.tlog|Mavlink Log (*.mavlog)|*.mavlog";
fd.InitialDirectory = Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"logs";
fd.DefaultExt = ".tlog";
DialogResult result = fd.ShowDialog();
string file = fd.FileName;
if (file != "")
{
try
{
BUT_clear_track_Click(sender, e);
MainV2.comPort.logreadmode = false;
MainV2.comPort.logplaybackfile = new BinaryReader(File.OpenRead(file));
MainV2.comPort.lastlogread = DateTime.MinValue;
tracklog.Value = 0;
tracklog.Minimum = 0;
tracklog.Maximum = 100;
}
catch { CustomMessageBox.Show("Error: Failed to write log file"); }
}
}
private void BUT_playlog_Click(object sender, EventArgs e)
{
if (MainV2.comPort.logreadmode)
{
MainV2.comPort.logreadmode = false;
ZedGraphTimer.Stop();
playingLog = false;
}
else
{
// BUT_clear_track_Click(sender, e);
MainV2.comPort.logreadmode = true;
list1.Clear();
list2.Clear();
list3.Clear();
list4.Clear();
list5.Clear();
list6.Clear();
list7.Clear();
list8.Clear();
list9.Clear();
list10.Clear();
tickStart = Environment.TickCount;
zg1.GraphPane.XAxis.Scale.Min = 0;
zg1.GraphPane.XAxis.Scale.Max = 1;
ZedGraphTimer.Start();
playingLog = true;
}
}
private void tracklog_Scroll(object sender, EventArgs e)
{
try
{
BUT_clear_track_Click(sender, e);
MainV2.comPort.lastlogread = DateTime.MinValue;
if (MainV2.comPort.logplaybackfile != null)
MainV2.comPort.logplaybackfile.BaseStream.Position = (long)(MainV2.comPort.logplaybackfile.BaseStream.Length * (tracklog.Value / 100.0));
updateLogPlayPosition();
}
catch { } // ignore any invalid
}
private void tabPage1_Resize(object sender, EventArgs e)
{
int mywidth, myheight;
// localize it
Control tabGauges = sender as Control;
float scale = tabGauges.Width / (float)tabGauges.Height;
if (scale > 0.5 && scale < 1.9)
{// square
Gvspeed.Visible = true;
if (tabGauges.Height < tabGauges.Width)
myheight = tabGauges.Height / 2;
else
myheight = tabGauges.Width / 2;
Gvspeed.Height = myheight;
Gspeed.Height = myheight;
Galt.Height = myheight;
Gheading.Height = myheight;
Gvspeed.Location = new Point(0, 0);
Gspeed.Location = new Point(Gvspeed.Right, 0);
Galt.Location = new Point(0, Gspeed.Bottom);
Gheading.Location = new Point(Galt.Right, Gspeed.Bottom);
return;
}
if (tabGauges.Width < 500)
{
Gvspeed.Visible = false;
mywidth = tabGauges.Width / 3;
Gspeed.Height = mywidth;
Galt.Height = mywidth;
Gheading.Height = mywidth;
Gspeed.Location = new Point(0, 0);
}
else
{
Gvspeed.Visible = true;
mywidth = tabGauges.Width / 4;
Gvspeed.Height = mywidth;
Gspeed.Height = mywidth;
Galt.Height = mywidth;
Gheading.Height = mywidth;
Gvspeed.Location = new Point(0, 0);
Gspeed.Location = new Point(Gvspeed.Right, 0);
}
Galt.Location = new Point(Gspeed.Right, 0);
Gheading.Location = new Point(Galt.Right, 0);
}
private void BUT_setmode_Click(object sender, EventArgs e)
{
MainV2.comPort.setMode(CMB_modes.Text);
}
private void BUT_setwp_Click(object sender, EventArgs e)
{
try
{
((Button)sender).Enabled = false;
comPort.setWPCurrent((ushort)CMB_setwp.SelectedIndex); // set nav to
}
catch { CustomMessageBox.Show("The command failed to execute"); }
((Button)sender).Enabled = true;
}
private void CMB_setwp_Click(object sender, EventArgs e)
{
CMB_setwp.Items.Clear();
CMB_setwp.Items.Add("0 (Home)");
if (MainV2.comPort.param["CMD_TOTAL"] != null)
{
int wps = int.Parse(MainV2.comPort.param["CMD_TOTAL"].ToString());
for (int z = 1; z <= wps; z++)
{
CMB_setwp.Items.Add(z.ToString());
}
}
}
private void BUT_quickauto_Click(object sender, EventArgs e)
{
try
{
((Button)sender).Enabled = false;
#if MAVLINK10
MainV2.comPort.setMode("Auto");
#else
comPort.doAction(MAVLink.MAV_ACTION.MAV_ACTION_SET_AUTO);
#endif
}
catch { CustomMessageBox.Show("The Command failed to execute"); }
((Button)sender).Enabled = true;
}
private void BUT_quickrtl_Click(object sender, EventArgs e)
{
try
{
((Button)sender).Enabled = false;
#if MAVLINK10
MainV2.comPort.setMode("RTL");
#else
comPort.doAction(MAVLink.MAV_ACTION.MAV_ACTION_RETURN);
#endif
}
catch { CustomMessageBox.Show("The Command failed to execute"); }
((Button)sender).Enabled = true;
}
private void BUT_quickmanual_Click(object sender, EventArgs e)
{
try
{
((Button)sender).Enabled = false;
#if MAVLINK10
if (MainV2.cs.firmware == MainV2.Firmwares.ArduPlane)
MainV2.comPort.setMode("Manual");
if (MainV2.cs.firmware == MainV2.Firmwares.ArduCopter2)
MainV2.comPort.setMode("Stabilize");
#else
comPort.doAction(MAVLink.MAV_ACTION.MAV_ACTION_SET_MANUAL);
#endif
}
catch { CustomMessageBox.Show("The Command failed to execute"); }
((Button)sender).Enabled = true;
}
private void BUT_log2kml_Click(object sender, EventArgs e)
{
Form frm = new MavlinkLog();
ThemeManager.ApplyThemeTo(frm);
frm.ShowDialog();
}
private void BUT_joystick_Click(object sender, EventArgs e)
{
Form joy = new JoystickSetup();
ThemeManager.ApplyThemeTo(joy);
joy.Show();
}
private void CMB_modes_Click(object sender, EventArgs e)
{
CMB_modes.DataSource = Common.getModesList();
CMB_modes.ValueMember = "Key";
CMB_modes.DisplayMember = "Value";
}
private void hud1_DoubleClick(object sender, EventArgs e)
{
if (huddropout)
return;
Form dropout = new Form();
dropout.Size = new System.Drawing.Size(hud1.Width, hud1.Height + 20);
dropout.Controls.Add(hud1);
dropout.Resize += new EventHandler(dropout_Resize);
dropout.FormClosed += new FormClosedEventHandler(dropout_FormClosed);
dropout.Show();
huddropout = true;
}
void dropout_FormClosed(object sender, FormClosedEventArgs e)
{
dockhud.DockableForm.Controls.Add(hud1);
huddropout = false;
}
void dropout_Resize(object sender, EventArgs e)
{
if (huddropoutresize)
return;
huddropoutresize = true;
int hudw = hud1.Width;
int hudh = hud1.Height;
int formh = ((Form)sender).Height - 30;
int formw = ((Form)sender).Width;
if (((Form)sender).Height < hudh)
{
if (((Form)sender).WindowState == FormWindowState.Maximized)
{
Point tl = ((Form)sender).DesktopLocation;
((Form)sender).WindowState = FormWindowState.Normal;
((Form)sender).Location = tl;
}
((Form)sender).Width = (int)(formh * 1.333f);
((Form)sender).Height = (int)(formh) + 20;
}
hud1.Refresh();
huddropoutresize = false;
}
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
/*
if (tabControl1.SelectedTab == tabStatus)
{
}
else
{
foreach (Control temp in tabStatus.Controls)
{
// temp.DataBindings.Clear();
// temp.Dispose();
// tabStatus.Controls.Remove(temp);
}
if (tabControl1.SelectedTab == tabQuick)
{
}
}
*/
}
private void Gspeed_DoubleClick(object sender, EventArgs e)
{
string max = "60";
if (DialogResult.OK == Common.InputBox("Enter Max", "Enter Max Speed", ref max))
{
Gspeed.MaxValue = float.Parse(max);
MainV2.config["GspeedMAX"] = Gspeed.MaxValue.ToString();
}
}
private void recordHudToAVIToolStripMenuItem_Click(object sender, EventArgs e)
{
stopRecordToolStripMenuItem_Click(sender, e);
CustomMessageBox.Show("Output avi will be saved to the log folder");
aviwriter = new AviWriter();
Directory.CreateDirectory(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"logs");
aviwriter.avi_start(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"logs" + Path.DirectorySeparatorChar + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ".avi");
recordHudToAVIToolStripMenuItem.Text = "Recording";
}
private void stopRecordToolStripMenuItem_Click(object sender, EventArgs e)
{
recordHudToAVIToolStripMenuItem.Text = "Start Recording";
if (aviwriter != null)
aviwriter.avi_close();
aviwriter = null;
}
bool setupPropertyInfo(ref System.Reflection.PropertyInfo input, string name, object source)
{
Type test = source.GetType();
foreach (var field in test.GetProperties())
{
if (field.Name == name)
{
input = field;
return true;
}
}
return false;
}
private void zg1_DoubleClick(object sender, EventArgs e)
{
Form selectform = new Form()
{
Name = "select",
Width = 50,
Height = 250,
Text = "Graph This"
};
int x = 10;
int y = 10;
{
CheckBox chk_box = new CheckBox();
chk_box.Text = "Logarithmic";
chk_box.Name = "Logarithmic";
chk_box.Location = new Point(x, y);
chk_box.Size = new System.Drawing.Size(100, 20);
chk_box.CheckedChanged += new EventHandler(chk_log_CheckedChanged);
selectform.Controls.Add(chk_box);
}
y += 20;
object thisBoxed = MainV2.cs;
Type test = thisBoxed.GetType();
foreach (var field in test.GetProperties())
{
// field.Name has the field's name.
object fieldValue;
try
{
fieldValue = field.GetValue(thisBoxed, null); // Get value
}
catch { continue; }
// Get the TypeCode enumeration. Multiple types get mapped to a common typecode.
TypeCode typeCode = Type.GetTypeCode(fieldValue.GetType());
if (!(typeCode == TypeCode.Single))
continue;
CheckBox chk_box = new CheckBox();
if (list1item != null && list1item.Name == field.Name)
chk_box.Checked = true;
if (list2item != null && list2item.Name == field.Name)
chk_box.Checked = true;
if (list3item != null && list3item.Name == field.Name)
chk_box.Checked = true;
if (list4item != null && list4item.Name == field.Name)
chk_box.Checked = true;
if (list5item != null && list5item.Name == field.Name)
chk_box.Checked = true;
if (list6item != null && list6item.Name == field.Name)
chk_box.Checked = true;
if (list7item != null && list7item.Name == field.Name)
chk_box.Checked = true;
if (list8item != null && list8item.Name == field.Name)
chk_box.Checked = true;
if (list9item != null && list9item.Name == field.Name)
chk_box.Checked = true;
if (list10item != null && list10item.Name == field.Name)
chk_box.Checked = true;
chk_box.Text = field.Name;
chk_box.Name = field.Name;
chk_box.Location = new Point(x, y);
chk_box.Size = new System.Drawing.Size(100, 20);
chk_box.CheckedChanged += new EventHandler(chk_box_CheckedChanged);
selectform.Controls.Add(chk_box);
Application.DoEvents();
x += 0;
y += 20;
if (y > selectform.Height - 50)
{
x += 100;
y = 10;
selectform.Width = x + 100;
}
}
ThemeManager.ApplyThemeTo(selectform);
selectform.Show();
}
private void hud_UserItem(object sender, EventArgs e)
{
Form selectform = new Form()
{
Name = "select",
Width = 50,
Height = 250,
Text = "Display This"
};
int x = 10;
int y = 10;
object thisBoxed = MainV2.cs;
Type test = thisBoxed.GetType();
foreach (var field in test.GetProperties())
{
// field.Name has the field's name.
object fieldValue;
try
{
fieldValue = field.GetValue(thisBoxed, null); // Get value
}
catch { continue; }
// Get the TypeCode enumeration. Multiple types get mapped to a common typecode.
TypeCode typeCode = Type.GetTypeCode(fieldValue.GetType());
if (!(typeCode == TypeCode.Single))
continue;
CheckBox chk_box = new CheckBox();
chk_box.Text = field.Name;
chk_box.Name = field.Name;
chk_box.Tag = (sender);
chk_box.Location = new Point(x, y);
chk_box.Size = new System.Drawing.Size(100, 20);
if (hud1.CustomItems.ContainsKey(field.Name))
{
chk_box.Checked = true;
}
chk_box.CheckedChanged += chk_box_hud_UserItem_CheckedChanged;
selectform.Controls.Add(chk_box);
Application.DoEvents();
x += 0;
y += 20;
if (y > selectform.Height - 50)
{
x += 100;
y = 10;
selectform.Width = x + 100;
}
}
ThemeManager.ApplyThemeTo(selectform);
selectform.Show();
}
void addHudUserItem(ref HUD.Custom cust, CheckBox sender)
{
setupPropertyInfo(ref cust.Item, (sender).Name, MainV2.cs);
hud1.CustomItems.Add((sender).Name, cust);
hud1.Invalidate();
}
void chk_box_hud_UserItem_CheckedChanged(object sender, EventArgs e)
{
if (((CheckBox)sender).Checked)
{
HUD.Custom cust = new HUD.Custom();
string prefix = ((CheckBox)sender).Name +": ";
if (MainV2.config["hud1_useritem_" + ((CheckBox)sender).Name] != null)
prefix = (string)MainV2.config["hud1_useritem_" + ((CheckBox)sender).Name];
Common.InputBox("Header", "Please enter your item prefix", ref prefix);
MainV2.config["hud1_useritem_" + ((CheckBox)sender).Name] = prefix;
cust.Header = prefix;
addHudUserItem(ref cust, (CheckBox)sender);
}
else
{
if (hud1.CustomItems.ContainsKey(((CheckBox)sender).Name))
{
hud1.CustomItems.Remove(((CheckBox)sender).Name);
}
MainV2.config.Remove("hud1_useritem_" + ((CheckBox)sender).Name);
hud1.Invalidate();
}
}
void chk_log_CheckedChanged(object sender, EventArgs e)
{
if (((CheckBox)sender).Checked)
{
zg1.GraphPane.YAxis.Type = AxisType.Log;
}
else
{
zg1.GraphPane.YAxis.Type = AxisType.Linear;
}
}
void chk_box_CheckedChanged(object sender, EventArgs e)
{
if (((CheckBox)sender).Checked)
{
if (list1item == null)
{
if (setupPropertyInfo(ref list1item, ((CheckBox)sender).Name, MainV2.cs))
{
list1.Clear();
list1curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list1, Color.Red, SymbolType.None);
}
}
else if (list2item == null)
{
if (setupPropertyInfo(ref list2item, ((CheckBox)sender).Name, MainV2.cs))
{
list2.Clear();
list2curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list2, Color.Blue, SymbolType.None);
}
}
else if (list3item == null)
{
if (setupPropertyInfo(ref list3item, ((CheckBox)sender).Name, MainV2.cs))
{
list3.Clear();
list3curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list3, Color.Green, SymbolType.None);
}
}
else if (list4item == null)
{
if (setupPropertyInfo(ref list4item, ((CheckBox)sender).Name, MainV2.cs))
{
list4.Clear();
list4curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list4, Color.Orange, SymbolType.None);
}
}
else if (list5item == null)
{
if (setupPropertyInfo(ref list5item, ((CheckBox)sender).Name, MainV2.cs))
{
list5.Clear();
list5curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list5, Color.Yellow, SymbolType.None);
}
}
else if (list6item == null)
{
if (setupPropertyInfo(ref list6item, ((CheckBox)sender).Name, MainV2.cs))
{
list6.Clear();
list6curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list6, Color.Magenta, SymbolType.None);
}
}
else if (list7item == null)
{
if (setupPropertyInfo(ref list7item, ((CheckBox)sender).Name, MainV2.cs))
{
list7.Clear();
list7curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list7, Color.Purple, SymbolType.None);
}
}
else if (list8item == null)
{
if (setupPropertyInfo(ref list8item, ((CheckBox)sender).Name, MainV2.cs))
{
list8.Clear();
list8curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list8, Color.LimeGreen, SymbolType.None);
}
}
else if (list9item == null)
{
if (setupPropertyInfo(ref list9item, ((CheckBox)sender).Name, MainV2.cs))
{
list9.Clear();
list9curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list9, Color.Cyan, SymbolType.None);
}
}
else if (list10item == null)
{
if (setupPropertyInfo(ref list10item, ((CheckBox)sender).Name, MainV2.cs))
{
list10.Clear();
list10curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list10, Color.Violet, SymbolType.None);
}
}
else
{
CustomMessageBox.Show("Max 10 at a time.");
((CheckBox)sender).Checked = false;
}
ThemeManager.ApplyThemeTo(this);
string selected = "";
try
{
selected = selected + zg1.GraphPane.CurveList[0].Label.Text + "|";
selected = selected + zg1.GraphPane.CurveList[1].Label.Text + "|";
selected = selected + zg1.GraphPane.CurveList[2].Label.Text + "|";
selected = selected + zg1.GraphPane.CurveList[3].Label.Text + "|";
selected = selected + zg1.GraphPane.CurveList[4].Label.Text + "|";
selected = selected + zg1.GraphPane.CurveList[5].Label.Text + "|";
selected = selected + zg1.GraphPane.CurveList[6].Label.Text + "|";
selected = selected + zg1.GraphPane.CurveList[7].Label.Text + "|";
selected = selected + zg1.GraphPane.CurveList[8].Label.Text + "|";
selected = selected + zg1.GraphPane.CurveList[9].Label.Text + "|";
selected = selected + zg1.GraphPane.CurveList[10].Label.Text + "|";
}
catch { }
MainV2.config["Tuning_Graph_Selected"] = selected;
}
else
{
// reset old stuff
if (list1item != null && list1item.Name == ((CheckBox)sender).Name)
{
list1item = null;
zg1.GraphPane.CurveList.Remove(list1curve);
}
if (list2item != null && list2item.Name == ((CheckBox)sender).Name)
{
list2item = null;
zg1.GraphPane.CurveList.Remove(list2curve);
}
if (list3item != null && list3item.Name == ((CheckBox)sender).Name)
{
list3item = null;
zg1.GraphPane.CurveList.Remove(list3curve);
}
if (list4item != null && list4item.Name == ((CheckBox)sender).Name)
{
list4item = null;
zg1.GraphPane.CurveList.Remove(list4curve);
}
if (list5item != null && list5item.Name == ((CheckBox)sender).Name)
{
list5item = null;
zg1.GraphPane.CurveList.Remove(list5curve);
}
if (list6item != null && list6item.Name == ((CheckBox)sender).Name)
{
list6item = null;
zg1.GraphPane.CurveList.Remove(list6curve);
}
if (list7item != null && list7item.Name == ((CheckBox)sender).Name)
{
list7item = null;
zg1.GraphPane.CurveList.Remove(list7curve);
}
if (list8item != null && list8item.Name == ((CheckBox)sender).Name)
{
list8item = null;
zg1.GraphPane.CurveList.Remove(list8curve);
}
if (list9item != null && list9item.Name == ((CheckBox)sender).Name)
{
list9item = null;
zg1.GraphPane.CurveList.Remove(list9curve);
}
if (list10item != null && list10item.Name == ((CheckBox)sender).Name)
{
list10item = null;
zg1.GraphPane.CurveList.Remove(list10curve);
}
}
}
private void pointCameraHereToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!MainV2.comPort.BaseStream.IsOpen)
{
CustomMessageBox.Show("Please Connect First");
return;
}
string alt = (100 * MainV2.cs.multiplierdist).ToString("0");
Common.InputBox("Enter Alt", "Enter Target Alt (absolute)", ref alt);
int intalt = (int)(100 * MainV2.cs.multiplierdist);
if (!int.TryParse(alt, out intalt))
{
CustomMessageBox.Show("Bad Alt");
return;
}
if (gotolocation.Lat == 0 || gotolocation.Lng == 0)
{
CustomMessageBox.Show("Bad Lat/Long");
return;
}
MainV2.comPort.setMountConfigure(MAVLink.MAV_MOUNT_MODE.GPS_POINT, true, true, true);
MainV2.comPort.setMountControl(gotolocation.Lat, gotolocation.Lng, (int)(intalt / MainV2.cs.multiplierdist), true);
}
private void BUT_script_Click(object sender, EventArgs e)
{
System.Threading.Thread t11 = new System.Threading.Thread(new System.Threading.ThreadStart(ScriptStart))
{
IsBackground = true,
Name = "Script Thread"
};
t11.Start();
}
void ScriptStart()
{
string myscript = @"
# cs.???? = currentstate, any variable on the status tab in the planner can be used.
# Script = options are
# Script.Sleep(ms)
# Script.ChangeParam(name,value)
# Script.GetParam(name)
# Script.ChangeMode(mode) - same as displayed in mode setup screen 'AUTO'
# Script.WaitFor(string,timeout)
# Script.SendRC(channel,pwm,sendnow)
#
print 'Start Script'
for chan in range(1,9):
Script.SendRC(chan,1500,False)
Script.SendRC(3,Script.GetParam('RC3_MIN'),True)
Script.Sleep(5000)
while cs.lat == 0:
print 'Waiting for GPS'
Script.Sleep(1000)
print 'Got GPS'
jo = 10 * 13
print jo
Script.SendRC(3,1000,False)
Script.SendRC(4,2000,True)
cs.messages.Clear()
Script.WaitFor('ARMING MOTORS',30000)
Script.SendRC(4,1500,True)
print 'Motors Armed!'
Script.SendRC(3,1700,True)
while cs.alt < 50:
Script.Sleep(50)
Script.SendRC(5,2000,True) # acro
Script.SendRC(1,2000,False) # roll
Script.SendRC(3,1370,True) # throttle
while cs.roll > -45: # top hald 0 - 180
Script.Sleep(5)
while cs.roll < -45: # -180 - -45
Script.Sleep(5)
Script.SendRC(5,1500,False) # stabalise
Script.SendRC(1,1500,True) # level roll
Script.Sleep(2000) # 2 sec to stabalise
Script.SendRC(3,1300,True) # throttle back to land
thro = 1350 # will decend
while cs.alt > 0.1:
Script.Sleep(300)
Script.SendRC(3,1000,False)
Script.SendRC(4,1000,True)
Script.WaitFor('DISARMING MOTORS',30000)
Script.SendRC(4,1500,True)
print 'Roll complete'
";
// CustomMessageBox.Show("This is Very ALPHA");
Form scriptedit = new Form();
scriptedit.Size = new System.Drawing.Size(500,500);
TextBox tb = new TextBox();
tb.Dock = DockStyle.Fill;
tb.ScrollBars = ScrollBars.Both;
tb.Multiline = true;
tb.Location = new Point(0,0);
tb.Size = new System.Drawing.Size(scriptedit.Size.Width-30,scriptedit.Size.Height-30);
scriptedit.Controls.Add(tb);
tb.Text = myscript;
scriptedit.ShowDialog();
if (DialogResult.Yes == CustomMessageBox.Show("Run Script", "Run this script?", MessageBoxButtons.YesNo))
{
Script scr = new Script();
scr.runScript(tb.Text);
}
}
private void CHK_autopan_CheckedChanged(object sender, EventArgs e)
{
MainV2.config["CHK_autopan"] = CHK_autopan.Checked.ToString();
}
private void NUM_playbackspeed_Scroll(object sender, EventArgs e)
{
LogPlayBackSpeed = NUM_playbackspeed.Value;
lbl_playbackspeed.Text = "x " + LogPlayBackSpeed;
}
private void setMJPEGSourceToolStripMenuItem_Click(object sender, EventArgs e)
{
string url = MainV2.config["mjpeg_url"] != null ? MainV2.config["mjpeg_url"].ToString() : @"http://127.0.0.1:56781/map.jpg";
if (DialogResult.OK == Common.InputBox("Mjpeg url", "Enter the url to the mjpeg source url", ref url))
{
MainV2.config["mjpeg_url"] = url;
Utilities.CaptureMJPEG.Stop();
Utilities.CaptureMJPEG.URL = url;
Utilities.CaptureMJPEG.OnNewImage += new EventHandler(CaptureMJPEG_OnNewImage);
Utilities.CaptureMJPEG.runAsync();
}
else
{
Utilities.CaptureMJPEG.Stop();
}
}
void CaptureMJPEG_OnNewImage(object sender, EventArgs e)
{
GCSViews.FlightData.myhud.bgimage = (Image)sender;
}
private void setAspectRatioToolStripMenuItem_Click(object sender, EventArgs e)
{
hud1.SixteenXNine = !hud1.SixteenXNine;
hud1.Invalidate();
}
private void displayBatteryInfoToolStripMenuItem_Click(object sender, EventArgs e)
{
hud1.batteryon = !hud1.batteryon;
}
private void quickView_DoubleClick(object sender, EventArgs e)
{
Form selectform = new Form()
{
Name = "select",
Width = 50,
Height = 250,
Text = "Display This"
};
int x = 10;
int y = 10;
object thisBoxed = MainV2.cs;
Type test = thisBoxed.GetType();
foreach (var field in test.GetProperties())
{
// field.Name has the field's name.
object fieldValue;
try
{
fieldValue = field.GetValue(thisBoxed, null); // Get value
}
catch { continue; }
// Get the TypeCode enumeration. Multiple types get mapped to a common typecode.
TypeCode typeCode = Type.GetTypeCode(fieldValue.GetType());
if (!(typeCode == TypeCode.Single))
continue;
CheckBox chk_box = new CheckBox();
if (((QuickView)sender).desc == field.Name)
chk_box.Checked = true;
chk_box.Text = field.Name;
chk_box.Name = field.Name;
chk_box.Tag = ((QuickView)sender);
chk_box.Location = new Point(x, y);
chk_box.Size = new System.Drawing.Size(100, 20);
chk_box.CheckedChanged += new EventHandler(chk_box_quickview_CheckedChanged);
selectform.Controls.Add(chk_box);
Application.DoEvents();
x += 0;
y += 20;
if (y > selectform.Height - 50)
{
x += 100;
y = 10;
selectform.Width = x + 100;
}
}
ThemeManager.ApplyThemeTo(selectform);
selectform.Show();
}
void chk_box_quickview_CheckedChanged(object sender, EventArgs e)
{
if (((CheckBox)sender).Checked)
{
// save settings
MainV2.config[((QuickView)((CheckBox)sender).Tag).Name] = ((CheckBox)sender).Name;
// set description
((QuickView)((CheckBox)sender).Tag).desc = ((CheckBox)sender).Name;
// set databinding for value
((QuickView)((CheckBox)sender).Tag).DataBindings.Clear();
((QuickView)((CheckBox)sender).Tag).DataBindings.Add(new System.Windows.Forms.Binding("number",this.bindingSource1, ((CheckBox)sender).Name, true));
// close selection form
((Form)((CheckBox)sender).Parent).Close();
}
}
private void flyToHereAltToolStripMenuItem_Click(object sender, EventArgs e)
{
string alt = "100";
if (MainV2.cs.firmware == MainV2.Firmwares.ArduCopter2)
{
alt = (10 * MainV2.cs.multiplierdist).ToString("0");
}
else
{
alt = (100 * MainV2.cs.multiplierdist).ToString("0");
}
if (MainV2.config.ContainsKey("guided_alt"))
alt = MainV2.config["guided_alt"].ToString();
if (DialogResult.Cancel == Common.InputBox("Enter Alt", "Enter Guided Mode Alt", ref alt))
return;
MainV2.config["guided_alt"] = alt;
int intalt = (int)(100 * MainV2.cs.multiplierdist);
if (!int.TryParse(alt, out intalt))
{
CustomMessageBox.Show("Bad Alt");
return;
}
MainV2.cs.GuidedModeWP.Alt = intalt;
if (MainV2.cs.mode == "Guided")
{
MainV2.comPort.setGuidedModeWP(new Locationwp() { alt = (float)MainV2.cs.GuidedModeWP.Alt, lat = (float)MainV2.cs.GuidedModeWP.Lat, lng = (float)MainV2.cs.GuidedModeWP.Lng });
}
}
private void flightPlannerToolStripMenuItem_Click(object sender, EventArgs e)
{
foreach (Control ctl in splitContainer1.Panel2.Controls)
{
ctl.Visible = false;
}
foreach (MainSwitcher.Screen sc in MainV2.View.screens)
{
if (sc.Name == "FlightPlanner")
{
MyButton but = new MyButton() { Location = new Point(splitContainer1.Panel2.Width / 2, 0), Text = "Close" };
but.Click += new EventHandler(but_Click);
splitContainer1.Panel2.Controls.Add(but);
splitContainer1.Panel2.Controls.Add(sc.Control);
ThemeManager.ApplyThemeTo(sc.Control);
sc.Control.Dock = DockStyle.Fill;
sc.Control.Visible = true;
if (sc.Control is IActivate)
{
((IActivate)(sc.Control)).Activate();
}
but.BringToFront();
break;
}
}
}
void but_Click(object sender, EventArgs e)
{
foreach (MainSwitcher.Screen sc in MainV2.View.screens)
{
if (sc.Name == "FlightPlanner")
{
splitContainer1.Panel2.Controls.Remove(sc.Control);
splitContainer1.Panel2.Controls.Remove((Control)sender);
sc.Control.Visible = false;
if (sc.Control is IDeactivate)
{
((IDeactivate)(sc.Control)).Deactivate();
}
break;
}
}
foreach (Control ctl in splitContainer1.Panel2.Controls)
{
ctl.Visible = true;
}
}
private void tabQuick_Resize(object sender, EventArgs e)
{
int height = ((Control)sender).Height / 6;
quickView1.Size = new System.Drawing.Size(tabQuick.Width, height);
quickView2.Size = new System.Drawing.Size(tabQuick.Width, height);
quickView3.Size = new System.Drawing.Size(tabQuick.Width, height);
quickView4.Size = new System.Drawing.Size(tabQuick.Width, height);
quickView5.Size = new System.Drawing.Size(tabQuick.Width, height);
quickView6.Size = new System.Drawing.Size(tabQuick.Width, height);
}
private void hud1_Resize(object sender, EventArgs e)
{
Console.WriteLine("HUD resize "+ hud1.Width + " " + hud1.Height);
try
{
// dockContainer1.SetHeight(dockhud, hud1.Height);
}
catch { }
}
private void resetToolStripMenuItem_Click(object sender, EventArgs e)
{
dockContainer1.Clear();
SetupDocking();
cleanupDocks();
this.Refresh();
}
}
}