You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
330 lines
11 KiB
330 lines
11 KiB
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 System.Collections; |
|
using ArdupilotMega.Controls; |
|
|
|
namespace ArdupilotMega.GCSViews.ConfigurationView |
|
{ |
|
public partial class ConfigArduplane : UserControl, IActivate |
|
{ |
|
Hashtable changes = new Hashtable(); |
|
static Hashtable tooltips = new Hashtable(); |
|
internal bool startup = true; |
|
|
|
public ConfigArduplane() |
|
{ |
|
InitializeComponent(); |
|
} |
|
|
|
public void Activate() |
|
{ |
|
if (!MainV2.comPort.BaseStream.IsOpen) |
|
{ |
|
this.Enabled = false; |
|
return; |
|
} |
|
else |
|
{ |
|
if (MainV2.cs.firmware == MainV2.Firmwares.ArduPlane) |
|
{ |
|
this.Enabled = true; |
|
} |
|
else |
|
{ |
|
this.Enabled = false; |
|
return; |
|
} |
|
} |
|
|
|
startup = true; |
|
|
|
changes.Clear(); |
|
|
|
// read tooltips |
|
if (tooltips.Count == 0) |
|
readToolTips(); |
|
|
|
processToScreen(); |
|
|
|
startup = false; |
|
} |
|
|
|
public struct paramsettings // hk's |
|
{ |
|
public string name; |
|
public float minvalue; |
|
public float maxvalue; |
|
public float normalvalue; |
|
public float scale; |
|
public string desc; |
|
} |
|
|
|
void readToolTips() |
|
{ |
|
string data = global::ArdupilotMega.Properties.Resources.MAVParam; |
|
|
|
|
|
string[] tips = data.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); |
|
|
|
foreach (var tip in tips) |
|
{ |
|
if (!tip.StartsWith("||")) |
|
continue; |
|
|
|
string[] cols = tip.Split(new string[] { "||" }, 9, StringSplitOptions.None); |
|
|
|
if (cols.Length >= 8) |
|
{ |
|
paramsettings param = new paramsettings(); |
|
try |
|
{ |
|
param.name = cols[1]; |
|
param.desc = AddNewLinesForTooltip(cols[7]); |
|
param.scale = float.Parse(cols[5]); |
|
param.minvalue = float.Parse(cols[2]); |
|
param.maxvalue = float.Parse(cols[3]); |
|
param.normalvalue = float.Parse(cols[4]); |
|
} |
|
catch { } |
|
tooltips[cols[1]] = param; |
|
} |
|
|
|
} |
|
} |
|
|
|
|
|
// from http://stackoverflow.com/questions/2512781/winforms-big-paragraph-tooltip/2512895#2512895 |
|
private const int maximumSingleLineTooltipLength = 50; |
|
|
|
private static string AddNewLinesForTooltip(string text) |
|
{ |
|
if (text.Length < maximumSingleLineTooltipLength) |
|
return text; |
|
int lineLength = (int)Math.Sqrt((double)text.Length) * 2; |
|
StringBuilder sb = new StringBuilder(); |
|
int currentLinePosition = 0; |
|
for (int textIndex = 0; textIndex < text.Length; textIndex++) |
|
{ |
|
// If we have reached the target line length and the next |
|
// character is whitespace then begin a new line. |
|
if (currentLinePosition >= lineLength && |
|
char.IsWhiteSpace(text[textIndex])) |
|
{ |
|
sb.Append(Environment.NewLine); |
|
currentLinePosition = 0; |
|
} |
|
// If we have just started a new line, skip all the whitespace. |
|
if (currentLinePosition == 0) |
|
while (textIndex < text.Length && char.IsWhiteSpace(text[textIndex])) |
|
textIndex++; |
|
// Append the next character. |
|
if (textIndex < text.Length) sb.Append(text[textIndex]); |
|
currentLinePosition++; |
|
} |
|
return sb.ToString(); |
|
} |
|
|
|
void disableNumericUpDownControls(Control inctl) |
|
{ |
|
foreach (Control ctl in inctl.Controls) |
|
{ |
|
if (ctl.Controls.Count > 0) |
|
{ |
|
disableNumericUpDownControls(ctl); |
|
} |
|
if (ctl.GetType() == typeof(NumericUpDown)) |
|
{ |
|
ctl.Enabled = false; |
|
} |
|
} |
|
} |
|
|
|
internal void processToScreen() |
|
{ |
|
toolTip1.RemoveAll(); |
|
|
|
disableNumericUpDownControls(this); |
|
|
|
// process hashdefines and update display |
|
foreach (string value in MainV2.comPort.param.Keys) |
|
{ |
|
if (value == null || value == "") |
|
continue; |
|
|
|
string name = value; |
|
Control[] text = this.Controls.Find(name, true); |
|
foreach (Control ctl in text) |
|
{ |
|
try |
|
{ |
|
if (ctl.GetType() == typeof(NumericUpDown)) |
|
{ |
|
|
|
float numbervalue = (float)MainV2.comPort.param[value]; |
|
|
|
MAVLink.modifyParamForDisplay(true, value,ref numbervalue); |
|
|
|
NumericUpDown thisctl = ((NumericUpDown)ctl); |
|
thisctl.Maximum = 9000; |
|
thisctl.Minimum = -9000; |
|
thisctl.Value = (decimal)numbervalue; |
|
thisctl.Increment = (decimal)0.001; |
|
if (thisctl.Name.EndsWith("_P") || thisctl.Name.EndsWith("_I") || thisctl.Name.EndsWith("_D") |
|
|| thisctl.Name.EndsWith("_LOW") || thisctl.Name.EndsWith("_HIGH") || thisctl.Value == 0 |
|
|| thisctl.Value.ToString("0.###", new System.Globalization.CultureInfo("en-US")).Contains(".")) |
|
{ |
|
thisctl.DecimalPlaces = 3; |
|
} |
|
else |
|
{ |
|
thisctl.Increment = (decimal)1; |
|
thisctl.DecimalPlaces = 1; |
|
} |
|
|
|
if (thisctl.Name.EndsWith("_IMAX")) |
|
{ |
|
thisctl.Maximum = 180; |
|
thisctl.Minimum = -180; |
|
} |
|
|
|
thisctl.Enabled = true; |
|
|
|
thisctl.BackColor = Color.FromArgb(0x43, 0x44, 0x45); |
|
thisctl.Validated += null; |
|
if (tooltips[value] != null) |
|
{ |
|
try |
|
{ |
|
toolTip1.SetToolTip(ctl, ((paramsettings)tooltips[value]).desc); |
|
} |
|
catch { } |
|
} |
|
thisctl.Validated += new EventHandler(EEPROM_View_float_TextChanged); |
|
|
|
} |
|
else if (ctl.GetType() == typeof(ComboBox)) |
|
{ |
|
|
|
ComboBox thisctl = ((ComboBox)ctl); |
|
|
|
thisctl.SelectedIndex = (int)(float)MainV2.comPort.param[value]; |
|
|
|
thisctl.Validated += new EventHandler(ComboBox_Validated); |
|
} |
|
} |
|
catch { } |
|
|
|
} |
|
if (text.Length == 0) |
|
{ |
|
//Console.WriteLine(name + " not found"); |
|
} |
|
|
|
} |
|
} |
|
|
|
void ComboBox_Validated(object sender, EventArgs e) |
|
{ |
|
EEPROM_View_float_TextChanged(sender, e); |
|
} |
|
|
|
void Configuration_Validating(object sender, CancelEventArgs e) |
|
{ |
|
EEPROM_View_float_TextChanged(sender, e); |
|
} |
|
|
|
internal void EEPROM_View_float_TextChanged(object sender, EventArgs e) |
|
{ |
|
float value = 0; |
|
string name = ((Control)sender).Name; |
|
|
|
// do domainupdown state check |
|
try |
|
{ |
|
if (sender.GetType() == typeof(NumericUpDown)) |
|
{ |
|
value = float.Parse(((Control)sender).Text); |
|
MAVLink.modifyParamForDisplay(false, ((Control)sender).Name, ref value); |
|
changes[name] = value; |
|
} |
|
else if (sender.GetType() == typeof(ComboBox)) |
|
{ |
|
value = ((ComboBox)sender).SelectedIndex; |
|
changes[name] = value; |
|
} |
|
((Control)sender).BackColor = Color.Green; |
|
} |
|
catch (Exception) |
|
{ |
|
((Control)sender).BackColor = Color.Red; |
|
} |
|
} |
|
|
|
private void BUT_writePIDS_Click(object sender, EventArgs e) |
|
{ |
|
var temp = (Hashtable)changes.Clone(); |
|
|
|
foreach (string value in temp.Keys) |
|
{ |
|
try |
|
{ |
|
MainV2.comPort.setParam(value, (float)changes[value]); |
|
|
|
try |
|
{ |
|
// set control as well |
|
var textControls = this.Controls.Find(value, true); |
|
if (textControls.Length > 0) |
|
{ |
|
textControls[0].BackColor = Color.FromArgb(0x43, 0x44, 0x45); |
|
} |
|
} |
|
catch |
|
{ |
|
|
|
} |
|
|
|
} |
|
catch |
|
{ |
|
CustomMessageBox.Show("Set " + value + " Failed"); |
|
} |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// Handles the Click event of the BUT_rerequestparams control. |
|
/// </summary> |
|
/// <param name="sender">The source of the event.</param> |
|
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> |
|
protected void BUT_rerequestparams_Click(object sender, EventArgs e) |
|
{ |
|
if (!MainV2.comPort.BaseStream.IsOpen) |
|
return; |
|
|
|
((Control)sender).Enabled = false; |
|
|
|
try |
|
{ |
|
MainV2.comPort.getParamList(); |
|
} |
|
catch (Exception ex) |
|
{ |
|
CustomMessageBox.Show("Error: getting param list " + ex.ToString()); |
|
} |
|
|
|
|
|
((Control)sender).Enabled = true; |
|
|
|
this.Activate(); |
|
} |
|
|
|
} |
|
}
|
|
|