mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-10 01:48:29 -04:00
9c836ab037
move mavlink structure/currentstate around for future mods update old firmware git hashs mod some error descriptions AP_mount camera trigger mod modify raw param display with units/range/desc add radio support for 868mhz update ch7 options updated dataflashlog format small df log parser mod for bad gps loc renable menu to always dock. right click for autohide
373 lines
14 KiB
C#
373 lines
14 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.Data;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using ArdupilotMega.Controls.BackstageView;
|
|
using ArdupilotMega.Controls;
|
|
|
|
namespace ArdupilotMega.GCSViews.ConfigurationView
|
|
{
|
|
public partial class ConfigRadioInput : UserControl, IActivate, IDeactivate
|
|
{
|
|
bool startup = false;
|
|
bool run = false;
|
|
|
|
float[] rcmin = new float[8];
|
|
float[] rcmax = new float[8];
|
|
float[] rctrim = new float[8];
|
|
|
|
Timer timer = new Timer();
|
|
|
|
public ConfigRadioInput()
|
|
{
|
|
InitializeComponent();
|
|
|
|
// setup rc calib extents
|
|
for (int a = 0; a < rcmin.Length; a++)
|
|
{
|
|
rcmin[a] = 3000;
|
|
rcmax[a] = 0;
|
|
rctrim[a] = 1500;
|
|
}
|
|
|
|
// setup rc update
|
|
timer.Tick += new EventHandler(timer_Tick);
|
|
}
|
|
|
|
public void Deactivate()
|
|
{
|
|
timer.Stop();
|
|
}
|
|
|
|
void timer_Tick(object sender, EventArgs e)
|
|
{
|
|
// update all linked controls - 10hz
|
|
try
|
|
{
|
|
MainV2.comPort.MAV.cs.UpdateCurrentSettings(currentStateBindingSource);
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
public void Activate()
|
|
{
|
|
timer.Enabled = true;
|
|
timer.Interval = 100;
|
|
timer.Start();
|
|
|
|
startup = true;
|
|
|
|
if (MainV2.comPort.MAV.cs.firmware == MainV2.Firmwares.ArduPlane)
|
|
{
|
|
try
|
|
{
|
|
CHK_mixmode.Checked = MainV2.comPort.MAV.param["ELEVON_MIXING"].ToString() == "1";
|
|
CHK_elevonrev.Checked = MainV2.comPort.MAV.param["ELEVON_REVERSE"].ToString() == "1";
|
|
CHK_elevonch1rev.Checked = MainV2.comPort.MAV.param["ELEVON_CH1_REV"].ToString() == "1";
|
|
CHK_elevonch2rev.Checked = MainV2.comPort.MAV.param["ELEVON_CH2_REV"].ToString() == "1";
|
|
}
|
|
catch { } // this will fail on arducopter
|
|
}
|
|
else
|
|
{
|
|
groupBoxElevons.Visible = false;
|
|
|
|
if (MainV2.comPort.MAV.cs.firmware == MainV2.Firmwares.ArduCopter2)
|
|
{
|
|
CHK_revch1.Visible = false;
|
|
CHK_revch2.Visible = false;
|
|
CHK_revch3.Visible = false;
|
|
CHK_revch4.Visible = false;
|
|
}
|
|
}
|
|
try
|
|
{
|
|
CHK_revch1.Checked = MainV2.comPort.MAV.param["RC1_REV"].ToString() == "-1";
|
|
CHK_revch2.Checked = MainV2.comPort.MAV.param["RC2_REV"].ToString() == "-1";
|
|
CHK_revch3.Checked = MainV2.comPort.MAV.param["RC3_REV"].ToString() == "-1";
|
|
CHK_revch4.Checked = MainV2.comPort.MAV.param["RC4_REV"].ToString() == "-1";
|
|
}
|
|
catch {}//(Exception ex) { CustomMessageBox.Show("Missing RC rev Param " + ex.ToString()); }
|
|
startup = false;
|
|
}
|
|
|
|
private void BUT_Calibrateradio_Click(object sender, EventArgs e)
|
|
{
|
|
if (run)
|
|
{
|
|
BUT_Calibrateradio.Text = "Completed";
|
|
run = false;
|
|
return;
|
|
}
|
|
|
|
CustomMessageBox.Show("Ensure your transmitter is on and receiver is powered and connected\nEnsure your motor does not have power/no props!!!");
|
|
|
|
byte oldrc = MainV2.comPort.MAV.cs.raterc;
|
|
byte oldatt = MainV2.comPort.MAV.cs.rateattitude;
|
|
byte oldpos = MainV2.comPort.MAV.cs.rateposition;
|
|
byte oldstatus = MainV2.comPort.MAV.cs.ratestatus;
|
|
|
|
MainV2.comPort.MAV.cs.raterc = 10;
|
|
MainV2.comPort.MAV.cs.rateattitude = 0;
|
|
MainV2.comPort.MAV.cs.rateposition = 0;
|
|
MainV2.comPort.MAV.cs.ratestatus = 0;
|
|
|
|
try
|
|
{
|
|
|
|
MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.RC_CHANNELS, 10);
|
|
|
|
}
|
|
catch { }
|
|
|
|
BUT_Calibrateradio.Text = "Click when Done";
|
|
|
|
run = true;
|
|
|
|
|
|
while (run)
|
|
{
|
|
Application.DoEvents();
|
|
|
|
System.Threading.Thread.Sleep(5);
|
|
|
|
MainV2.comPort.MAV.cs.UpdateCurrentSettings(currentStateBindingSource, true, MainV2.comPort);
|
|
|
|
// check for non 0 values
|
|
if (MainV2.comPort.MAV.cs.ch1in > 800 && MainV2.comPort.MAV.cs.ch1in < 2200)
|
|
{
|
|
rcmin[0] = Math.Min(rcmin[0], MainV2.comPort.MAV.cs.ch1in);
|
|
rcmax[0] = Math.Max(rcmax[0], MainV2.comPort.MAV.cs.ch1in);
|
|
|
|
rcmin[1] = Math.Min(rcmin[1], MainV2.comPort.MAV.cs.ch2in);
|
|
rcmax[1] = Math.Max(rcmax[1], MainV2.comPort.MAV.cs.ch2in);
|
|
|
|
rcmin[2] = Math.Min(rcmin[2], MainV2.comPort.MAV.cs.ch3in);
|
|
rcmax[2] = Math.Max(rcmax[2], MainV2.comPort.MAV.cs.ch3in);
|
|
|
|
rcmin[3] = Math.Min(rcmin[3], MainV2.comPort.MAV.cs.ch4in);
|
|
rcmax[3] = Math.Max(rcmax[3], MainV2.comPort.MAV.cs.ch4in);
|
|
|
|
rcmin[4] = Math.Min(rcmin[4], MainV2.comPort.MAV.cs.ch5in);
|
|
rcmax[4] = Math.Max(rcmax[4], MainV2.comPort.MAV.cs.ch5in);
|
|
|
|
rcmin[5] = Math.Min(rcmin[5], MainV2.comPort.MAV.cs.ch6in);
|
|
rcmax[5] = Math.Max(rcmax[5], MainV2.comPort.MAV.cs.ch6in);
|
|
|
|
rcmin[6] = Math.Min(rcmin[6], MainV2.comPort.MAV.cs.ch7in);
|
|
rcmax[6] = Math.Max(rcmax[6], MainV2.comPort.MAV.cs.ch7in);
|
|
|
|
rcmin[7] = Math.Min(rcmin[7], MainV2.comPort.MAV.cs.ch8in);
|
|
rcmax[7] = Math.Max(rcmax[7], MainV2.comPort.MAV.cs.ch8in);
|
|
|
|
BARroll.minline = (int)rcmin[0];
|
|
BARroll.maxline = (int)rcmax[0];
|
|
|
|
BARpitch.minline = (int)rcmin[1];
|
|
BARpitch.maxline = (int)rcmax[1];
|
|
|
|
BARthrottle.minline = (int)rcmin[2];
|
|
BARthrottle.maxline = (int)rcmax[2];
|
|
|
|
BARyaw.minline = (int)rcmin[3];
|
|
BARyaw.maxline = (int)rcmax[3];
|
|
|
|
BAR5.minline = (int)rcmin[4];
|
|
BAR5.maxline = (int)rcmax[4];
|
|
|
|
BAR6.minline = (int)rcmin[5];
|
|
BAR6.maxline = (int)rcmax[5];
|
|
|
|
BAR7.minline = (int)rcmin[6];
|
|
BAR7.maxline = (int)rcmax[6];
|
|
|
|
BAR8.minline = (int)rcmin[7];
|
|
BAR8.maxline = (int)rcmax[7];
|
|
|
|
}
|
|
}
|
|
|
|
CustomMessageBox.Show("Ensure all your sticks are centered and throttle is down, and click ok to continue");
|
|
|
|
MainV2.comPort.MAV.cs.UpdateCurrentSettings(currentStateBindingSource, true, MainV2.comPort);
|
|
|
|
rctrim[0] = MainV2.comPort.MAV.cs.ch1in;
|
|
rctrim[1] = MainV2.comPort.MAV.cs.ch2in;
|
|
rctrim[2] = MainV2.comPort.MAV.cs.ch3in;
|
|
rctrim[3] = MainV2.comPort.MAV.cs.ch4in;
|
|
rctrim[4] = MainV2.comPort.MAV.cs.ch5in;
|
|
rctrim[5] = MainV2.comPort.MAV.cs.ch6in;
|
|
rctrim[6] = MainV2.comPort.MAV.cs.ch7in;
|
|
rctrim[7] = MainV2.comPort.MAV.cs.ch8in;
|
|
|
|
string data = "---------------\n";
|
|
|
|
for (int a = 0; a < 8; a++)
|
|
{
|
|
// we want these to save no matter what
|
|
BUT_Calibrateradio.Text = "Saving";
|
|
try
|
|
{
|
|
if (rcmin[a] != rcmax[a])
|
|
{
|
|
MainV2.comPort.setParam("RC" + (a + 1).ToString("0") + "_MIN", rcmin[a]);
|
|
MainV2.comPort.setParam("RC" + (a + 1).ToString("0") + "_MAX", rcmax[a]);
|
|
}
|
|
if (rctrim[a] < 1195 || rctrim[a] > 1205)
|
|
MainV2.comPort.setParam("RC" + (a + 1).ToString("0") + "_TRIM", rctrim[a]);
|
|
}
|
|
catch { CustomMessageBox.Show("Failed to set Channel " + (a + 1).ToString()); }
|
|
|
|
data = data + "CH" + (a + 1) + " " + rcmin[a] + " | " + rcmax[a] + "\n";
|
|
}
|
|
|
|
MainV2.comPort.MAV.cs.raterc = oldrc;
|
|
MainV2.comPort.MAV.cs.rateattitude = oldatt;
|
|
MainV2.comPort.MAV.cs.rateposition = oldpos;
|
|
MainV2.comPort.MAV.cs.ratestatus = oldstatus;
|
|
|
|
try
|
|
{
|
|
|
|
MainV2.comPort.requestDatastream((byte)ArdupilotMega.MAVLink.MAV_DATA_STREAM.RC_CHANNELS, oldrc);
|
|
|
|
}
|
|
catch { }
|
|
|
|
CustomMessageBox.Show("Here are the detected radio options\nNOTE Channels not connected are displayed as 1500 +-2\nNormal values are around 1100 | 1900\nChannel:Min | Max \n" + data, "Radio");
|
|
|
|
BUT_Calibrateradio.Text = "Completed";
|
|
}
|
|
|
|
private void CHK_mixmode_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
if (startup)
|
|
return;
|
|
try
|
|
{
|
|
if (MainV2.comPort.MAV.param["ELEVON_MIXING"] == null)
|
|
{
|
|
CustomMessageBox.Show("Not Available on " + MainV2.comPort.MAV.cs.firmware.ToString());
|
|
}
|
|
else
|
|
{
|
|
MainV2.comPort.setParam("ELEVON_MIXING", ((CheckBox)sender).Checked == true ? 1 : 0);
|
|
}
|
|
}
|
|
catch { CustomMessageBox.Show("Set ELEVON_MIXING Failed"); }
|
|
}
|
|
|
|
private void CHK_elevonrev_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
if (startup)
|
|
return;
|
|
try
|
|
{
|
|
if (MainV2.comPort.MAV.param["ELEVON_REVERSE"] == null)
|
|
{
|
|
CustomMessageBox.Show("Not Available on " + MainV2.comPort.MAV.cs.firmware.ToString());
|
|
}
|
|
else
|
|
{
|
|
MainV2.comPort.setParam("ELEVON_REVERSE", ((CheckBox)sender).Checked == true ? 1 : 0);
|
|
}
|
|
}
|
|
catch { CustomMessageBox.Show("Set ELEVON_REVERSE Failed"); }
|
|
}
|
|
|
|
private void CHK_elevonch1rev_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
if (startup)
|
|
return;
|
|
try
|
|
{
|
|
if (MainV2.comPort.MAV.param["ELEVON_CH1_REV"] == null)
|
|
{
|
|
CustomMessageBox.Show("Not Available on " + MainV2.comPort.MAV.cs.firmware.ToString());
|
|
}
|
|
else
|
|
{
|
|
MainV2.comPort.setParam("ELEVON_CH1_REV", ((CheckBox)sender).Checked == true ? 1 : 0);
|
|
}
|
|
}
|
|
catch { CustomMessageBox.Show("Set ELEVON_CH1_REV Failed"); }
|
|
}
|
|
|
|
private void CHK_elevonch2rev_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
if (startup)
|
|
return;
|
|
try
|
|
{
|
|
if (MainV2.comPort.MAV.param["ELEVON_CH2_REV"] == null)
|
|
{
|
|
CustomMessageBox.Show("Not Available on " + MainV2.comPort.MAV.cs.firmware.ToString());
|
|
}
|
|
else
|
|
{
|
|
MainV2.comPort.setParam("ELEVON_CH2_REV", ((CheckBox)sender).Checked == true ? 1 : 0);
|
|
}
|
|
}
|
|
catch { CustomMessageBox.Show("Set ELEVON_CH2_REV Failed"); }
|
|
}
|
|
|
|
private void CHK_revch1_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
reverseChannel("RC1_REV", ((CheckBox)sender).Checked, BARroll);
|
|
}
|
|
|
|
private void CHK_revch2_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
reverseChannel("RC2_REV", ((CheckBox)sender).Checked, BARpitch);
|
|
}
|
|
|
|
private void CHK_revch3_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
reverseChannel("RC3_REV", ((CheckBox)sender).Checked, BARthrottle);
|
|
}
|
|
|
|
private void CHK_revch4_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
reverseChannel("RC4_REV", ((CheckBox)sender).Checked, BARyaw);
|
|
}
|
|
|
|
void reverseChannel(string name, bool normalreverse, Control progressbar)
|
|
{
|
|
if (normalreverse == true)
|
|
{
|
|
((HorizontalProgressBar2)progressbar).reverse = true;
|
|
((HorizontalProgressBar2)progressbar).BackgroundColor = Color.FromArgb(148, 193, 31);
|
|
((HorizontalProgressBar2)progressbar).ValueColor = Color.FromArgb(0x43, 0x44, 0x45);
|
|
}
|
|
else
|
|
{
|
|
((HorizontalProgressBar2)progressbar).reverse = false;
|
|
((HorizontalProgressBar2)progressbar).BackgroundColor = Color.FromArgb(0x43, 0x44, 0x45);
|
|
((HorizontalProgressBar2)progressbar).ValueColor = Color.FromArgb(148, 193, 31);
|
|
}
|
|
|
|
if (startup)
|
|
return;
|
|
if (MainV2.comPort.MAV.param["SWITCH_ENABLE"] != null && (float)MainV2.comPort.MAV.param["SWITCH_ENABLE"] == 1)
|
|
{
|
|
try
|
|
{
|
|
MainV2.comPort.setParam("SWITCH_ENABLE", 0);
|
|
CustomMessageBox.Show("Disabled Dip Switchs");
|
|
}
|
|
catch { CustomMessageBox.Show("Error Disableing Dip Switch"); }
|
|
}
|
|
try
|
|
{
|
|
int i = normalreverse == false ? 1 : -1;
|
|
MainV2.comPort.setParam(name, i);
|
|
}
|
|
catch { CustomMessageBox.Show("Error Reversing"); }
|
|
}
|
|
}
|
|
}
|