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 ConfigHardwareOptions : UserControl, IActivate { bool startup = false; const float rad2deg = (float)(180 / Math.PI); const float deg2rad = (float)(1.0 / rad2deg); public ConfigHardwareOptions() { InitializeComponent(); } private void BUT_MagCalibration_Click(object sender, EventArgs e) { // list of x,y,z 's List> data = new List>(); // backup current rate and set to 10 hz byte backupratesens = MainV2.cs.ratesensors; MainV2.cs.ratesensors = 10; MainV2.comPort.requestDatastream((byte)MAVLink.MAV_DATA_STREAM.RAW_SENSORS, MainV2.cs.ratesensors); // mag captures at 10 hz CustomMessageBox.Show("Data will be collected for 30 seconds, Please click ok and move the apm around all axises"); DateTime deadline = DateTime.Now.AddSeconds(30); float oldmx = 0; float oldmy = 0; float oldmz = 0; while (deadline > DateTime.Now) { // dont let the gui hang Application.DoEvents(); if (oldmx != MainV2.cs.mx && oldmy != MainV2.cs.my && oldmz != MainV2.cs.mz) { data.Add(new Tuple( MainV2.cs.mx - (float)MainV2.cs.mag_ofs_x, MainV2.cs.my - (float)MainV2.cs.mag_ofs_y, MainV2.cs.mz - (float)MainV2.cs.mag_ofs_z)); oldmx = MainV2.cs.mx; oldmy = MainV2.cs.my; oldmz = MainV2.cs.mz; } } // restore old sensor rate MainV2.cs.ratesensors = backupratesens; MainV2.comPort.requestDatastream((byte)MAVLink.MAV_DATA_STREAM.RAW_SENSORS, MainV2.cs.ratesensors); if (data.Count < 10) { CustomMessageBox.Show("Log does not contain enough data"); return; } double[] ans = MagCalib.LeastSq(data); MagCalib.SaveOffsets(ans); } private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { try { //System.Diagnostics.Process.Start("http://www.ngdc.noaa.gov/geomagmodels/Declination.jsp"); System.Diagnostics.Process.Start("http://www.magnetic-declination.com/"); } catch { CustomMessageBox.Show("Webpage open failed... do you have a virus?\nhttp://www.magnetic-declination.com/"); } } private void TXT_declination_Validating(object sender, CancelEventArgs e) { float ans = 0; e.Cancel = !float.TryParse(TXT_declination.Text, out ans); } private void TXT_declination_Validated(object sender, EventArgs e) { if (startup) return; try { if (MainV2.comPort.param["COMPASS_DEC"] == null) { CustomMessageBox.Show("Not Available"); } else { float dec = 0.0f; try { string declination = TXT_declination.Text; float.TryParse(declination, out dec); float deg = (float)((int)dec); float mins = (dec - deg); if (dec > 0) { dec += ((mins) / 60.0f); } else { dec -= ((mins) / 60.0f); } } catch { CustomMessageBox.Show("Invalid input!"); return; } TXT_declination.Text = dec.ToString(); MainV2.comPort.setParam("COMPASS_DEC", dec * deg2rad); } } catch { CustomMessageBox.Show("Set COMPASS_DEC Failed"); } } private void CHK_enablecompass_CheckedChanged(object sender, EventArgs e) { if (((CheckBox)sender).Checked == true) { CHK_autodec.Enabled = true; TXT_declination.Enabled = true; } else { CHK_autodec.Enabled = false; TXT_declination.Enabled = false; } if (startup) return; try { if (MainV2.comPort.param["MAG_ENABLE"] == null) { CustomMessageBox.Show("Not Available"); } else { MainV2.comPort.setParam("MAG_ENABLE", ((CheckBox)sender).Checked == true ? 1 : 0); } } catch { CustomMessageBox.Show("Set MAG_ENABLE Failed"); } } private void CHK_enablesonar_CheckedChanged(object sender, EventArgs e) { if (startup) return; try { if (MainV2.comPort.param["SONAR_ENABLE"] == null) { CustomMessageBox.Show("Not Available"); } else { MainV2.comPort.setParam("SONAR_ENABLE", ((CheckBox)sender).Checked == true ? 1 : 0); } } catch { CustomMessageBox.Show("Set SONAR_ENABLE Failed"); } } private void CHK_enableairspeed_CheckedChanged(object sender, EventArgs e) { if (startup) return; try { if (MainV2.comPort.param["ARSPD_ENABLE"] == null) { CustomMessageBox.Show("Not Available on " + MainV2.cs.firmware.ToString()); } else { MainV2.comPort.setParam("ARSPD_ENABLE", ((CheckBox)sender).Checked == true ? 1 : 0); } } catch { CustomMessageBox.Show("Set ARSPD_ENABLE Failed"); } } private void CHK_enableoptflow_CheckedChanged(object sender, EventArgs e) { if (startup) return; try { if (MainV2.comPort.param["FLOW_ENABLE"] == null) { CustomMessageBox.Show("Not Available on " + MainV2.cs.firmware.ToString()); } else { MainV2.comPort.setParam("FLOW_ENABLE", ((CheckBox)sender).Checked == true ? 1 : 0); } } catch { CustomMessageBox.Show("Set FLOW_ENABLE Failed"); } } private void CMB_sonartype_SelectedIndexChanged(object sender, EventArgs e) { if (startup) return; try { if (MainV2.comPort.param["SONAR_TYPE"] == null) { CustomMessageBox.Show("Not Available on " + MainV2.cs.firmware.ToString()); } else { MainV2.comPort.setParam("SONAR_TYPE", ((ComboBox)sender).SelectedIndex); } } catch { CustomMessageBox.Show("Set SONAR_TYPE Failed"); } } public void Activate() { if (!MainV2.comPort.BaseStream.IsOpen) { this.Enabled = false; return; } else { this.Enabled = true; } startup = true; if (MainV2.comPort.param["ARSPD_ENABLE"] != null) { CHK_enableairspeed.Checked = MainV2.comPort.param["ARSPD_ENABLE"].ToString() == "1" ? true : false; CHK_enableairspeed.Enabled = true; } if (MainV2.comPort.param["SONAR_ENABLE"] != null) { CHK_enablesonar.Checked = MainV2.comPort.param["SONAR_ENABLE"].ToString() == "1" ? true : false; CHK_enablesonar.Enabled = true; } if (MainV2.comPort.param["MAG_ENABLE"] != null) { CHK_enablecompass.Checked = MainV2.comPort.param["MAG_ENABLE"].ToString() == "1" ? true : false; CHK_enablecompass.Enabled = true; } if (MainV2.comPort.param["COMPASS_DEC"] != null) { TXT_declination.Text = (float.Parse(MainV2.comPort.param["COMPASS_DEC"].ToString()) * rad2deg).ToString(); } if (MainV2.comPort.param["SONAR_TYPE"] != null) { CMB_sonartype.SelectedIndex = int.Parse(MainV2.comPort.param["SONAR_TYPE"].ToString()); } if (MainV2.comPort.param["FLOW_ENABLE"] != null) { CHK_enableoptflow.Checked = MainV2.comPort.param["FLOW_ENABLE"].ToString() == "1" ? true : false; CHK_enableoptflow.Enabled = true; } if (MainV2.comPort.param["COMPASS_AUTODEC"] != null) { CHK_autodec.Checked = MainV2.comPort.param["COMPASS_AUTODEC"].ToString() == "1" ? true : false; } startup = false; } private void BUT_MagCalibrationLog_Click(object sender, EventArgs e) { string minthro = "30"; Common.InputBox("Min Throttle", "Use only data above this throttle percent.", ref minthro); int ans = 0; int.TryParse(minthro, out ans); MagCalib.ProcessLog(ans); } private void CHK_autodec_CheckedChanged(object sender, EventArgs e) { if (((CheckBox)sender).Checked == true) { TXT_declination.Enabled = false; } else { TXT_declination.Enabled = true; } if (startup) return; try { if (MainV2.comPort.param["COMPASS_AUTODEC"] == null) { CustomMessageBox.Show("Not Available on " + MainV2.cs.firmware.ToString()); } else { MainV2.comPort.setParam("COMPASS_AUTODEC", ((CheckBox)sender).Checked == true ? 1 : 0); } } catch { CustomMessageBox.Show("Set COMPASS_AUTODEC Failed"); } } } }