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; } } }