mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-03 22:48:29 -04:00
32832dd296
add experimental antenna tracker find add new apparam eeprom reader add ground alt display to hud mod stats modify guided mode alt selection. test flight planner tab on flight data tab move some functions to the right click menu add xplanes data in/out setup to be automatic. add better mission upload handeling.
305 lines
8.8 KiB
C#
305 lines
8.8 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 ArdupilotMega.Controls.BackstageView;
|
|
using ArdupilotMega.Comms;
|
|
using ArdupilotMega.Utilities;
|
|
|
|
namespace ArdupilotMega.Antenna
|
|
{
|
|
public partial class Tracker : UserControl, IDeactivate
|
|
{
|
|
System.Threading.Thread t12;
|
|
static bool threadrun = false;
|
|
static ITrackerOutput tracker;
|
|
|
|
enum interfaces
|
|
{
|
|
Maestro,
|
|
ArduTracker,
|
|
DegreeTracker
|
|
}
|
|
|
|
public Tracker()
|
|
{
|
|
InitializeComponent();
|
|
|
|
ThemeManager.ApplyThemeTo(this);
|
|
|
|
CMB_serialport.DataSource = SerialPort.GetPortNames();
|
|
|
|
if (threadrun)
|
|
{
|
|
BUT_connect.Text = "Disconnect";
|
|
}
|
|
|
|
foreach (string value in MainV2.config.Keys)
|
|
{
|
|
if (value.StartsWith("Tracker_"))
|
|
{
|
|
var ctls = Controls.Find(value.Replace("Tracker_",""),true);
|
|
|
|
foreach (Control ctl in ctls)
|
|
{
|
|
if (typeof(TextBox) == ctl.GetType() ||
|
|
typeof(ComboBox) == ctl.GetType())
|
|
{
|
|
ctl.Text = MainV2.config[value].ToString();
|
|
}
|
|
else if (typeof(TrackBar) == ctl.GetType())
|
|
{
|
|
((TrackBar)ctl).Value = int.Parse(MainV2.config[value].ToString());
|
|
}
|
|
else if (typeof(CheckBox) == ctl.GetType())
|
|
{
|
|
((CheckBox)ctl).Checked = bool.Parse(MainV2.config[value].ToString());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// update other fields from load params
|
|
TXT_panrange_TextChanged(null, null);
|
|
TXT_tiltrange_TextChanged(null, null);
|
|
TRK_pantrim_Scroll(null, null);
|
|
TRK_tilttrim_Scroll(null, null);
|
|
}
|
|
|
|
void saveconfig()
|
|
{
|
|
foreach (Control ctl in Controls)
|
|
{
|
|
if (typeof(TextBox) == ctl.GetType() ||
|
|
typeof(ComboBox) == ctl.GetType())
|
|
{
|
|
MainV2.config["Tracker_" + ctl.Name] = ctl.Text;
|
|
}
|
|
if (typeof(TrackBar) == ctl.GetType())
|
|
{
|
|
MainV2.config["Tracker_" + ctl.Name] = ((TrackBar)ctl).Value;
|
|
}
|
|
if (typeof(CheckBox) == ctl.GetType())
|
|
{
|
|
MainV2.config["Tracker_" + ctl.Name] = ((CheckBox)ctl).Checked;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void BUT_connect_Click(object sender, EventArgs e)
|
|
{
|
|
saveconfig();
|
|
|
|
if (threadrun)
|
|
{
|
|
threadrun = false;
|
|
BUT_connect.Text = "Connect";
|
|
tracker.Close();
|
|
return;
|
|
}
|
|
|
|
if (tracker != null && tracker.ComPort != null && tracker.ComPort.IsOpen)
|
|
{
|
|
tracker.ComPort.Close();
|
|
}
|
|
|
|
if (CMB_interface.Text == "Maestro")
|
|
tracker = new ArdupilotMega.Antenna.Maestro();
|
|
if (CMB_interface.Text == "ArduTracker")
|
|
tracker = new ArdupilotMega.Antenna.ArduTracker();
|
|
if (CMB_interface.Text == "DegreeTracker")
|
|
tracker = new ArdupilotMega.Antenna.DegreeTracker();
|
|
|
|
try
|
|
{
|
|
tracker.ComPort = new SerialPort()
|
|
{
|
|
PortName = CMB_serialport.Text,
|
|
BaudRate = int.Parse(CMB_baudrate.Text)
|
|
};
|
|
}
|
|
catch (Exception ex) { CustomMessageBox.Show("Bad Port settings " + ex.Message); return; }
|
|
|
|
try
|
|
{
|
|
tracker.PanStartRange = int.Parse(TXT_panrange.Text) / 2 * -1;
|
|
tracker.PanEndRange = int.Parse(TXT_panrange.Text) / 2;
|
|
tracker.TrimPan = TRK_pantrim.Value;
|
|
|
|
tracker.TiltStartRange = int.Parse(TXT_tiltrange.Text) / 2 * -1;
|
|
tracker.TiltEndRange = int.Parse(TXT_tiltrange.Text) / 2;
|
|
tracker.TrimTilt = TRK_tilttrim.Value;
|
|
|
|
tracker.PanReverse = CHK_revpan.Checked;
|
|
tracker.TiltReverse = CHK_revtilt.Checked;
|
|
|
|
tracker.PanPWMRange = int.Parse(TXT_pwmrangepan.Text);
|
|
tracker.TiltPWMRange = int.Parse(TXT_pwmrangetilt.Text);
|
|
|
|
}
|
|
catch (Exception ex) { CustomMessageBox.Show("Bad User input " + ex.Message); return; }
|
|
|
|
if (tracker.Init())
|
|
{
|
|
if (tracker.Setup())
|
|
{
|
|
tracker.PanAndTilt(0, 0);
|
|
|
|
t12 = new System.Threading.Thread(new System.Threading.ThreadStart(mainloop))
|
|
{
|
|
IsBackground = true,
|
|
Name = "Antenna Tracker"
|
|
};
|
|
t12.Start();
|
|
}
|
|
}
|
|
|
|
BUT_connect.Text = "Disconnect";
|
|
}
|
|
|
|
void mainloop()
|
|
{
|
|
threadrun = true;
|
|
while (threadrun)
|
|
{
|
|
try
|
|
{
|
|
// 10 hz - position updates default to 3 hz on the stream rate
|
|
tracker.PanAndTilt(MainV2.cs.AZToMAV, MainV2.cs.ELToMAV);
|
|
System.Threading.Thread.Sleep(100);
|
|
}
|
|
catch { }
|
|
}
|
|
}
|
|
|
|
private void TRK_pantrim_Scroll(object sender, EventArgs e)
|
|
{
|
|
if (tracker != null)
|
|
tracker.TrimPan = TRK_pantrim.Value;
|
|
LBL_pantrim.Text = TRK_pantrim.Value.ToString();
|
|
}
|
|
|
|
private void TRK_tilttrim_Scroll(object sender, EventArgs e)
|
|
{
|
|
if (tracker != null)
|
|
tracker.TrimTilt = TRK_tilttrim.Value;
|
|
LBL_tilttrim.Text = TRK_tilttrim.Value.ToString();
|
|
}
|
|
|
|
private void TXT_panrange_TextChanged(object sender, EventArgs e)
|
|
{
|
|
int range;
|
|
|
|
int.TryParse(TXT_panrange.Text, out range);
|
|
|
|
TRK_pantrim.Minimum = range / 1 * -1;
|
|
TRK_pantrim.Maximum = range / 1;
|
|
}
|
|
|
|
private void TXT_tiltrange_TextChanged(object sender, EventArgs e)
|
|
{
|
|
int range;
|
|
|
|
int.TryParse(TXT_tiltrange.Text, out range);
|
|
|
|
TRK_tilttrim.Minimum = range / 1 * -1;
|
|
TRK_tilttrim.Maximum = range / 1;
|
|
}
|
|
|
|
private void CHK_revpan_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void CHK_revtilt_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
public void Deactivate()
|
|
{
|
|
saveconfig();
|
|
}
|
|
|
|
private void BUT_find_Click(object sender, EventArgs e)
|
|
{
|
|
System.Threading.ThreadPool.QueueUserWorkItem(tm1_Tick);
|
|
}
|
|
|
|
void tm1_Tick(object item)
|
|
{
|
|
|
|
float snr = MainV2.cs.localsnrdb;
|
|
float best = snr;
|
|
|
|
float tilt = 0;
|
|
float pan = 0;
|
|
|
|
this.Invoke((MethodInvoker)delegate
|
|
{
|
|
tilt = TRK_tilttrim.Value;
|
|
pan = TRK_pantrim.Value;
|
|
});
|
|
|
|
|
|
// scan entire range withing 30 degrees
|
|
float ans = checkpos((pan - float.Parse(TXT_panrange.Text) / 4), (pan + float.Parse(TXT_panrange.Text) / 4) - 1, 30);
|
|
|
|
// scan new range within 30 - little overlap
|
|
ans = checkpos((-30 + ans), (30 + ans), 5);
|
|
|
|
// scan new range
|
|
ans = checkpos((-5 + ans), (5 + ans), 1);
|
|
|
|
setpan(ans);
|
|
|
|
|
|
}
|
|
|
|
void setpan(float no)
|
|
{
|
|
this.Invoke((MethodInvoker)delegate
|
|
{
|
|
try
|
|
{
|
|
TRK_pantrim.Value = (int)no;
|
|
TRK_pantrim_Scroll(null, null);
|
|
}
|
|
catch { return; }
|
|
});
|
|
}
|
|
|
|
float checkpos(float start, float end,float scale)
|
|
{
|
|
float lastsnr = 0;
|
|
float best = 0;
|
|
|
|
setpan(start);
|
|
|
|
System.Threading.Thread.Sleep(4000);
|
|
|
|
for (float n = start; n < end; n += scale)
|
|
{
|
|
setpan(n);
|
|
|
|
System.Threading.Thread.Sleep(2000);
|
|
|
|
Console.WriteLine("Angle " + n + " snr " + MainV2.cs.localsnrdb);
|
|
|
|
if (MainV2.cs.localsnrdb > lastsnr)
|
|
{
|
|
|
|
best = n;
|
|
lastsnr = MainV2.cs.localsnrdb;
|
|
}
|
|
}
|
|
|
|
return best;
|
|
}
|
|
}
|
|
}
|