mirror of https://github.com/ArduPilot/ardupilot
436 lines
16 KiB
C#
436 lines
16 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using ArdupilotMega.Utilities;
|
|
using log4net;
|
|
using ArdupilotMega.Controls.BackstageView;
|
|
|
|
namespace ArdupilotMega.GCSViews.ConfigurationView
|
|
{
|
|
public partial class ConfigRawParams : BackStageViewContentPanel
|
|
{
|
|
private static readonly ILog log =
|
|
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
|
private readonly ParameterMetaDataRepository _parameterMetaDataRepository;
|
|
|
|
// Changes made to the params between writing to the copter
|
|
readonly Hashtable _changes = new Hashtable();
|
|
|
|
static Hashtable tooltips = new Hashtable();
|
|
|
|
// ?
|
|
internal bool startup = true;
|
|
|
|
public struct paramsettings // hk's
|
|
{
|
|
public string name;
|
|
public float minvalue;
|
|
public float maxvalue;
|
|
public float normalvalue;
|
|
public float scale;
|
|
public string desc;
|
|
}
|
|
|
|
|
|
public ConfigRawParams()
|
|
{
|
|
InitializeComponent();
|
|
_parameterMetaDataRepository = new ParameterMetaDataRepository();
|
|
}
|
|
|
|
Hashtable loadParamFile(string Filename)
|
|
{
|
|
Hashtable param = new Hashtable();
|
|
|
|
StreamReader sr = new StreamReader(Filename);
|
|
while (!sr.EndOfStream)
|
|
{
|
|
string line = sr.ReadLine();
|
|
|
|
if (line.Contains("NOTE:"))
|
|
CustomMessageBox.Show(line, "Saved Note");
|
|
|
|
if (line.StartsWith("#"))
|
|
continue;
|
|
|
|
string[] items = line.Split(new char[] { ' ', ',', '\t' }, StringSplitOptions.RemoveEmptyEntries);
|
|
|
|
if (items.Length != 2)
|
|
continue;
|
|
|
|
string name = items[0];
|
|
float value = float.Parse(items[1], new System.Globalization.CultureInfo("en-US"));
|
|
|
|
MAVLink.modifyParamForDisplay(true, name, ref value);
|
|
|
|
if (name == "SYSID_SW_MREV")
|
|
continue;
|
|
if (name == "WP_TOTAL")
|
|
continue;
|
|
if (name == "CMD_TOTAL")
|
|
continue;
|
|
if (name == "FENCE_TOTAL")
|
|
continue;
|
|
if (name == "SYS_NUM_RESETS")
|
|
continue;
|
|
if (name == "ARSPD_OFFSET")
|
|
continue;
|
|
if (name == "GND_ABS_PRESS")
|
|
continue;
|
|
if (name == "GND_TEMP")
|
|
continue;
|
|
if (name == "CMD_INDEX")
|
|
continue;
|
|
if (name == "LOG_LASTFILE")
|
|
continue;
|
|
|
|
param[name] = value;
|
|
}
|
|
sr.Close();
|
|
|
|
return param;
|
|
}
|
|
|
|
private void BUT_load_Click(object sender, EventArgs e)
|
|
{
|
|
var ofd = new OpenFileDialog
|
|
{
|
|
AddExtension = true,
|
|
DefaultExt = ".param",
|
|
RestoreDirectory = true,
|
|
Filter = "Param List|*.param;*.parm"
|
|
};
|
|
var dr = ofd.ShowDialog();
|
|
|
|
if (dr == DialogResult.OK)
|
|
{
|
|
Hashtable param2 = loadParamFile(ofd.FileName);
|
|
|
|
foreach (string name in param2.Keys)
|
|
{
|
|
string value = param2[name].ToString();
|
|
// set param table as well
|
|
foreach (DataGridViewRow row in Params.Rows)
|
|
{
|
|
if (name == "SYSID_SW_MREV")
|
|
continue;
|
|
if (name == "WP_TOTAL")
|
|
continue;
|
|
if (name == "CMD_TOTAL")
|
|
continue;
|
|
if (name == "FENCE_TOTAL")
|
|
continue;
|
|
if (name == "SYS_NUM_RESETS")
|
|
continue;
|
|
if (name == "ARSPD_OFFSET")
|
|
continue;
|
|
if (name == "GND_ABS_PRESS")
|
|
continue;
|
|
if (name == "GND_TEMP")
|
|
continue;
|
|
if (name == "CMD_INDEX")
|
|
continue;
|
|
if (name == "LOG_LASTFILE")
|
|
continue;
|
|
if (row.Cells[0].Value.ToString() == name)
|
|
{
|
|
if (row.Cells[1].Value.ToString() != value.ToString())
|
|
row.Cells[1].Value = value;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void BUT_save_Click(object sender, EventArgs e)
|
|
{
|
|
var sfd = new SaveFileDialog
|
|
{
|
|
AddExtension = true,
|
|
DefaultExt = ".param",
|
|
RestoreDirectory = true,
|
|
Filter = "Param List|*.param;*.parm"
|
|
};
|
|
|
|
var dr = sfd.ShowDialog();
|
|
if (dr == DialogResult.OK)
|
|
{
|
|
StreamWriter sw = new StreamWriter(sfd.OpenFile());
|
|
string input = DateTime.Now + " Frame : + | Arducopter Kit | Kit motors";
|
|
if (MainV2.cs.firmware == MainV2.Firmwares.ArduPlane)
|
|
{
|
|
input = DateTime.Now + " Plane: Skywalker";
|
|
}
|
|
Common.InputBox("Custom Note", "Enter your Notes/Frame Type etc", ref input);
|
|
if (input != "")
|
|
sw.WriteLine("NOTE: " + input.Replace(',', '|'));
|
|
foreach (DataGridViewRow row in Params.Rows)
|
|
{
|
|
float value = float.Parse(row.Cells[1].Value.ToString());
|
|
|
|
MAVLink.modifyParamForDisplay(false, row.Cells[0].Value.ToString(), ref value);
|
|
|
|
sw.WriteLine(row.Cells[0].Value.ToString() + "," + value.ToString(new System.Globalization.CultureInfo("en-US")));
|
|
}
|
|
sw.Close();
|
|
}
|
|
}
|
|
|
|
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
|
|
{
|
|
|
|
}
|
|
|
|
try
|
|
{
|
|
// set param table as well
|
|
foreach (DataGridViewRow row in Params.Rows)
|
|
{
|
|
if (row.Cells[0].Value.ToString() == value)
|
|
{
|
|
row.Cells[1].Style.BackColor = Color.FromArgb(0x43, 0x44, 0x45);
|
|
_changes.Remove(value);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
catch { }
|
|
|
|
}
|
|
catch
|
|
{
|
|
CustomMessageBox.Show("Set " + value + " Failed");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
private void BUT_compare_Click(object sender, EventArgs e)
|
|
{
|
|
Hashtable param2 = new Hashtable();
|
|
|
|
var ofd = new OpenFileDialog
|
|
{
|
|
AddExtension = true,
|
|
DefaultExt = ".param",
|
|
RestoreDirectory = true,
|
|
Filter = "Param List|*.param;*.parm"
|
|
};
|
|
|
|
var dr = ofd.ShowDialog();
|
|
if (dr == DialogResult.OK)
|
|
{
|
|
param2 = loadParamFile(ofd.FileName);
|
|
|
|
Form paramCompareForm = new ParamCompare(Params, MainV2.comPort.param, param2);
|
|
|
|
ThemeManager.ApplyThemeTo(paramCompareForm);
|
|
paramCompareForm.ShowDialog();
|
|
}
|
|
}
|
|
|
|
|
|
private 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)
|
|
{
|
|
log.Error("Exception getting param list", ex);
|
|
CustomMessageBox.Show("Error: getting param list");
|
|
}
|
|
|
|
|
|
((Control)sender).Enabled = true;
|
|
|
|
startup = true;
|
|
|
|
processToScreen();
|
|
|
|
startup = false;
|
|
|
|
// Todo: this populates or the combos etc and what not. This shoudl prob be a bsv button
|
|
|
|
}
|
|
|
|
void Params_CellValueChanged(object sender, DataGridViewCellEventArgs e)
|
|
{
|
|
if (e.RowIndex == -1 || e.ColumnIndex == -1 || startup == true || e.ColumnIndex != 1)
|
|
return;
|
|
try
|
|
{
|
|
if (Params[Command.Index, e.RowIndex].Value.ToString().EndsWith("_REV") && (Params[Command.Index, e.RowIndex].Value.ToString().StartsWith("RC") || Params[Command.Index, e.RowIndex].Value.ToString().StartsWith("HS")))
|
|
{
|
|
if (Params[e.ColumnIndex, e.RowIndex].Value.ToString() == "0")
|
|
Params[e.ColumnIndex, e.RowIndex].Value = "-1";
|
|
}
|
|
|
|
Params[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Green;
|
|
_changes[Params[0, e.RowIndex].Value] = float.Parse(Params[e.ColumnIndex, e.RowIndex].Value.ToString());
|
|
}
|
|
catch (Exception)
|
|
{
|
|
Params[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Red;
|
|
}
|
|
|
|
|
|
Params.Focus();
|
|
}
|
|
|
|
void readToolTips()
|
|
{
|
|
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Configuration));
|
|
|
|
string data = resources.GetString("MAVParam");
|
|
|
|
if (data == null)
|
|
{
|
|
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();
|
|
}
|
|
|
|
internal void processToScreen()
|
|
{
|
|
toolTip1.RemoveAll();
|
|
Params.Rows.Clear();
|
|
|
|
// process hashdefines and update display
|
|
foreach (string value in MainV2.comPort.param.Keys)
|
|
{
|
|
if (value == null || value == "")
|
|
continue;
|
|
|
|
//System.Diagnostics.Debug.WriteLine("Doing: " + value);
|
|
|
|
Params.Rows.Add();
|
|
Params.Rows[Params.RowCount - 1].Cells[Command.Index].Value = value;
|
|
Params.Rows[Params.RowCount - 1].Cells[Value.Index].Value = ((float)MainV2.comPort.param[value]).ToString("0.###");
|
|
try
|
|
{
|
|
string metaDataDescription = _parameterMetaDataRepository.GetParameterMetaData(value, ParameterMetaDataConstants.Description);
|
|
if(!String.IsNullOrEmpty(metaDataDescription))
|
|
{
|
|
Params.Rows[Params.RowCount - 1].Cells[Command.Index].ToolTipText = metaDataDescription;
|
|
Params.Rows[Params.RowCount - 1].Cells[Value.Index].ToolTipText = metaDataDescription;
|
|
}
|
|
else if (tooltips[value] != null)
|
|
{
|
|
Params.Rows[Params.RowCount - 1].Cells[Command.Index].ToolTipText = ((paramsettings)tooltips[value]).desc;
|
|
//Params.Rows[Params.RowCount - 1].Cells[RawValue.Index].ToolTipText = ((paramsettings)tooltips[value]).desc;
|
|
Params.Rows[Params.RowCount - 1].Cells[Value.Index].ToolTipText = ((paramsettings)tooltips[value]).desc;
|
|
|
|
//Params.Rows[Params.RowCount - 1].Cells[Default.Index].Value = ((paramsettings)tooltips[value]).normalvalue;
|
|
//Params.Rows[Params.RowCount - 1].Cells[mavScale.Index].Value = ((paramsettings)tooltips[value]).scale;
|
|
//Params.Rows[Params.RowCount - 1].Cells[Value.Index].Value = float.Parse(Params.Rows[Params.RowCount - 1].Cells[RawValue.Index].Value.ToString()) / float.Parse(Params.Rows[Params.RowCount - 1].Cells[mavScale.Index].Value.ToString());
|
|
}
|
|
}
|
|
catch { }
|
|
|
|
}
|
|
Params.Sort(Params.Columns[0], ListSortDirection.Ascending);
|
|
}
|
|
|
|
private void ConfigRawParams_Load(object sender, EventArgs e)
|
|
{
|
|
// read tooltips
|
|
if (tooltips.Count == 0)
|
|
readToolTips();
|
|
|
|
startup = true;
|
|
|
|
processToScreen();
|
|
|
|
startup = false;
|
|
}
|
|
}
|
|
}
|