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 : BackStageViewContentPanel { 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); timer.Enabled = true; timer.Interval = 100; timer.Start(); } void timer_Tick(object sender, EventArgs e) { // update all linked controls - 10hz try { MainV2.cs.UpdateCurrentSettings(currentStateBindingSource); } catch { } } private void ConfigRadioInput_Load(object sender, EventArgs e) { if (!MainV2.comPort.BaseStream.IsOpen) { this.Enabled = false; return; } else { this.Enabled = true; } startup = true; if (MainV2.cs.firmware == MainV2.Firmwares.ArduPlane) { try { CHK_mixmode.Checked = MainV2.comPort.param["ELEVON_MIXING"].ToString() == "1"; CHK_elevonrev.Checked = MainV2.comPort.param["ELEVON_REVERSE"].ToString() == "1"; CHK_elevonch1rev.Checked = MainV2.comPort.param["ELEVON_CH1_REV"].ToString() == "1"; CHK_elevonch2rev.Checked = MainV2.comPort.param["ELEVON_CH2_REV"].ToString() == "1"; } catch { } // this will fail on arducopter } else { groupBoxElevons.Visible = false; } try { CHK_revch1.Checked = MainV2.comPort.param["RC1_REV"].ToString() == "-1"; CHK_revch2.Checked = MainV2.comPort.param["RC2_REV"].ToString() == "-1"; CHK_revch3.Checked = MainV2.comPort.param["RC3_REV"].ToString() == "-1"; CHK_revch4.Checked = MainV2.comPort.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.cs.raterc; byte oldatt = MainV2.cs.rateattitude; byte oldpos = MainV2.cs.rateposition; byte oldstatus = MainV2.cs.ratestatus; MainV2.cs.raterc = 10; MainV2.cs.rateattitude = 0; MainV2.cs.rateposition = 0; MainV2.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.cs.UpdateCurrentSettings(currentStateBindingSource, true, MainV2.comPort); // check for non 0 values if (MainV2.cs.ch1in > 800 && MainV2.cs.ch1in < 2200) { rcmin[0] = Math.Min(rcmin[0], MainV2.cs.ch1in); rcmax[0] = Math.Max(rcmax[0], MainV2.cs.ch1in); rcmin[1] = Math.Min(rcmin[1], MainV2.cs.ch2in); rcmax[1] = Math.Max(rcmax[1], MainV2.cs.ch2in); rcmin[2] = Math.Min(rcmin[2], MainV2.cs.ch3in); rcmax[2] = Math.Max(rcmax[2], MainV2.cs.ch3in); rcmin[3] = Math.Min(rcmin[3], MainV2.cs.ch4in); rcmax[3] = Math.Max(rcmax[3], MainV2.cs.ch4in); rcmin[4] = Math.Min(rcmin[4], MainV2.cs.ch5in); rcmax[4] = Math.Max(rcmax[4], MainV2.cs.ch5in); rcmin[5] = Math.Min(rcmin[5], MainV2.cs.ch6in); rcmax[5] = Math.Max(rcmax[5], MainV2.cs.ch6in); rcmin[6] = Math.Min(rcmin[6], MainV2.cs.ch7in); rcmax[6] = Math.Max(rcmax[6], MainV2.cs.ch7in); rcmin[7] = Math.Min(rcmin[7], MainV2.cs.ch8in); rcmax[7] = Math.Max(rcmax[7], MainV2.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.cs.UpdateCurrentSettings(currentStateBindingSource, true, MainV2.comPort); rctrim[0] = MainV2.cs.ch1in; rctrim[1] = MainV2.cs.ch2in; rctrim[2] = MainV2.cs.ch3in; rctrim[3] = MainV2.cs.ch4in; rctrim[4] = MainV2.cs.ch5in; rctrim[5] = MainV2.cs.ch6in; rctrim[6] = MainV2.cs.ch7in; rctrim[7] = MainV2.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.cs.raterc = oldrc; MainV2.cs.rateattitude = oldatt; MainV2.cs.rateposition = oldpos; MainV2.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.param["ELEVON_MIXING"] == null) { CustomMessageBox.Show("Not Available on " + MainV2.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.param["ELEVON_REVERSE"] == null) { CustomMessageBox.Show("Not Available on " + MainV2.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.param["ELEVON_CH1_REV"] == null) { CustomMessageBox.Show("Not Available on " + MainV2.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.param["ELEVON_CH2_REV"] == null) { CustomMessageBox.Show("Not Available on " + MainV2.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.param["SWITCH_ENABLE"] != null && (float)MainV2.comPort.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"); } } } }