mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-05 23:48:31 -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
361 lines
13 KiB
C#
361 lines
13 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Reflection;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using System.IO;
|
|
using log4net;
|
|
using ZedGraph; // Graphs
|
|
using System.Xml;
|
|
|
|
namespace ArdupilotMega
|
|
{
|
|
public partial class LogBrowse : Form
|
|
{
|
|
private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
|
int m_iColumnCount = 0;
|
|
DataTable m_dtCSV = new DataTable();
|
|
|
|
PointPairList list1 = new PointPairList();
|
|
PointPairList list2 = new PointPairList();
|
|
PointPairList list3 = new PointPairList();
|
|
PointPairList list4 = new PointPairList();
|
|
PointPairList list5 = new PointPairList();
|
|
|
|
int graphs = 0;
|
|
|
|
public LogBrowse()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void Form1_Load(object sender, EventArgs e)
|
|
{
|
|
OpenFileDialog openFileDialog1 = new OpenFileDialog();
|
|
openFileDialog1.Filter = "Log Files|*.log";
|
|
openFileDialog1.FilterIndex = 2;
|
|
openFileDialog1.RestoreDirectory = true;
|
|
|
|
openFileDialog1.InitialDirectory = Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + "logs";
|
|
|
|
if (openFileDialog1.ShowDialog() == DialogResult.OK)
|
|
{
|
|
try
|
|
{
|
|
Stream stream = File.Open(openFileDialog1.FileName, FileMode.Open);
|
|
PopulateDataTableFromUploadedFile(stream);
|
|
stream.Close();
|
|
|
|
dataGridView1.DataSource = m_dtCSV;
|
|
|
|
}
|
|
catch (Exception ex) { CustomMessageBox.Show("Failed to read File: " + ex.ToString()); }
|
|
|
|
foreach (DataGridViewColumn column in dataGridView1.Columns)
|
|
{
|
|
column.SortMode = DataGridViewColumnSortMode.NotSortable;
|
|
}
|
|
|
|
CreateChart(zg1);
|
|
|
|
int a = 1;
|
|
foreach (DataGridViewRow row in dataGridView1.Rows)
|
|
{
|
|
//Commands.Rows[a].HeaderCell.Value
|
|
row.HeaderCell.Value = a.ToString();
|
|
a++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
private void PopulateDataTableFromUploadedFile(System.IO.Stream strm)
|
|
{
|
|
System.IO.StreamReader srdr = new System.IO.StreamReader(strm);
|
|
String strLine = String.Empty;
|
|
Int32 iLineCount = 0;
|
|
do
|
|
{
|
|
strLine = srdr.ReadLine();
|
|
if (strLine == null)
|
|
{
|
|
break;
|
|
}
|
|
if (0 == iLineCount++)
|
|
{
|
|
m_dtCSV = new DataTable("CSVTable");
|
|
//m_dtCSV = this.CreateDataTableForCSVData(strLine);
|
|
}
|
|
this.AddDataRowToTable(strLine, m_dtCSV);
|
|
} while (true);
|
|
}
|
|
|
|
private DataTable CreateDataTableForCSVData(String strLine)
|
|
{
|
|
DataTable dt = new DataTable("CSVTable");
|
|
String[] strVals = strLine.Split(new char[] { ',', ':' });
|
|
m_iColumnCount = strVals.Length;
|
|
int idx = 0;
|
|
foreach (String strVal in strVals)
|
|
{
|
|
String strColumnName = String.Format("{0}", idx++);
|
|
dt.Columns.Add(strColumnName, Type.GetType("System.String"));
|
|
}
|
|
return dt;
|
|
}
|
|
|
|
private DataRow AddDataRowToTable(String strCSVLine, DataTable dt)
|
|
{
|
|
String[] strVals = strCSVLine.Split(new char[] { ',', ':' });
|
|
Int32 iTotalNumberOfValues = strVals.Length;
|
|
// If number of values in this line are more than the columns
|
|
// currently in table, then we need to add more columns to table.
|
|
if (iTotalNumberOfValues > m_iColumnCount)
|
|
{
|
|
Int32 iDiff = iTotalNumberOfValues - m_iColumnCount;
|
|
for (Int32 i = 0; i < iDiff; i++)
|
|
{
|
|
String strColumnName = String.Format("{0}", (m_iColumnCount + i));
|
|
dt.Columns.Add(strColumnName, Type.GetType("System.String"));
|
|
}
|
|
m_iColumnCount = iTotalNumberOfValues;
|
|
}
|
|
int idx = 0;
|
|
DataRow drow = dt.NewRow();
|
|
foreach (String strVal in strVals)
|
|
{
|
|
String strColumnName = String.Format("{0}", idx++);
|
|
drow[strColumnName] = strVal.Trim();
|
|
}
|
|
dt.Rows.Add(drow);
|
|
return drow;
|
|
}
|
|
|
|
private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
int a = 0;
|
|
foreach (DataGridViewColumn col in dataGridView1.Columns)
|
|
{
|
|
col.HeaderText = a.ToString();
|
|
a++;
|
|
}
|
|
}
|
|
catch { }
|
|
try
|
|
{
|
|
string option = dataGridView1[0, e.RowIndex].EditedFormattedValue.ToString();
|
|
|
|
if (option.StartsWith("PID-"))
|
|
option = "PID-1";
|
|
|
|
using (XmlReader reader = XmlReader.Create(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + "dataflashlog.xml"))
|
|
{
|
|
reader.Read();
|
|
reader.ReadStartElement("LOGFORMAT");
|
|
if (MainV2.comPort.MAV.cs.firmware == MainV2.Firmwares.ArduPlane)
|
|
{
|
|
reader.ReadToFollowing("APM");
|
|
}
|
|
else if (MainV2.comPort.MAV.cs.firmware == MainV2.Firmwares.ArduRover)
|
|
{
|
|
reader.ReadToFollowing("APRover");
|
|
}
|
|
else
|
|
{
|
|
reader.ReadToFollowing("AC2");
|
|
}
|
|
reader.ReadToFollowing(option);
|
|
|
|
dataGridView1.Columns[0].HeaderText = "";
|
|
|
|
XmlReader inner = reader.ReadSubtree();
|
|
|
|
inner.MoveToElement();
|
|
|
|
int a = 1;
|
|
|
|
while (inner.Read())
|
|
{
|
|
inner.MoveToElement();
|
|
if (inner.IsStartElement())
|
|
{
|
|
if (inner.Name.StartsWith("F"))
|
|
{
|
|
dataGridView1.Columns[a].HeaderText = inner.ReadString();
|
|
log.Info(a + " " + dataGridView1.Columns[a].HeaderText);
|
|
a++;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
for (; a < dataGridView1.Columns.Count; a++)
|
|
{
|
|
dataGridView1.Columns[a].HeaderText = "";
|
|
}
|
|
|
|
}
|
|
}
|
|
catch { log.Info("DGV logbrowse error"); }
|
|
}
|
|
|
|
public void CreateChart(ZedGraphControl zgc)
|
|
{
|
|
GraphPane myPane = zgc.GraphPane;
|
|
|
|
// Set the titles and axis labels
|
|
myPane.Title.Text = "Value Graph";
|
|
myPane.XAxis.Title.Text = "Line Number";
|
|
myPane.YAxis.Title.Text = "Output";
|
|
|
|
LineItem myCurve;
|
|
|
|
myCurve = myPane.AddCurve("Value", list1, Color.Red, SymbolType.None);
|
|
myCurve = myPane.AddCurve("Value", list2, Color.Green, SymbolType.None);
|
|
myCurve = myPane.AddCurve("Value", list3, Color.Blue, SymbolType.None);
|
|
myCurve = myPane.AddCurve("Value", list4, Color.Pink, SymbolType.None);
|
|
myCurve = myPane.AddCurve("Value", list5, Color.Yellow, SymbolType.None);
|
|
|
|
// Show the x axis grid
|
|
myPane.XAxis.MajorGrid.IsVisible = true;
|
|
|
|
myPane.XAxis.Scale.Min = 0;
|
|
//myPane.XAxis.Scale.Max = -1;
|
|
|
|
// Make the Y axis scale red
|
|
myPane.YAxis.Scale.FontSpec.FontColor = Color.Red;
|
|
myPane.YAxis.Title.FontSpec.FontColor = Color.Red;
|
|
// turn off the opposite tics so the Y tics don't show up on the Y2 axis
|
|
myPane.YAxis.MajorTic.IsOpposite = false;
|
|
myPane.YAxis.MinorTic.IsOpposite = false;
|
|
// Don't display the Y zero line
|
|
myPane.YAxis.MajorGrid.IsZeroLine = true;
|
|
// Align the Y axis labels so they are flush to the axis
|
|
myPane.YAxis.Scale.Align = AlignP.Inside;
|
|
// Manually set the axis range
|
|
//myPane.YAxis.Scale.Min = -1;
|
|
//myPane.YAxis.Scale.Max = 1;
|
|
|
|
// Fill the axis background with a gradient
|
|
//myPane.Chart.Fill = new Fill(Color.White, Color.LightGray, 45.0f);
|
|
|
|
|
|
// Calculate the Axis Scale Ranges
|
|
try
|
|
{
|
|
zg1.AxisChange();
|
|
}
|
|
catch { }
|
|
|
|
|
|
|
|
}
|
|
|
|
private void Graphit_Click(object sender, EventArgs e)
|
|
{
|
|
if (dataGridView1.RowCount == 0 || dataGridView1.ColumnCount == 0)
|
|
{
|
|
CustomMessageBox.Show("Please load a valid file");
|
|
return;
|
|
}
|
|
|
|
int col = dataGridView1.CurrentCell.ColumnIndex;
|
|
int row = dataGridView1.CurrentCell.RowIndex;
|
|
string type = dataGridView1[0, row].Value.ToString();
|
|
double a = 0; // row counter
|
|
|
|
if (col == 0)
|
|
{
|
|
CustomMessageBox.Show("Please pick another column, Highlight the cell you wish to graph");
|
|
return;
|
|
}
|
|
|
|
int error = 0;
|
|
|
|
foreach (DataGridViewRow datarow in dataGridView1.Rows)
|
|
{
|
|
if (datarow.Cells[0].Value.ToString() == type)
|
|
{
|
|
try
|
|
{
|
|
double value = double.Parse(datarow.Cells[col].Value.ToString(), new System.Globalization.CultureInfo("en-US"));
|
|
if (graphs == 0)
|
|
{
|
|
zg1.GraphPane.CurveList[0].Label.Text = dataGridView1.Columns[col].HeaderText;
|
|
list1.Add(a, value);
|
|
}
|
|
else if (graphs == 1)
|
|
{
|
|
zg1.GraphPane.CurveList[1].Label.Text = dataGridView1.Columns[col].HeaderText;
|
|
list2.Add(a, value);
|
|
}
|
|
else if (graphs == 2)
|
|
{
|
|
zg1.GraphPane.CurveList[2].Label.Text = dataGridView1.Columns[col].HeaderText;
|
|
list3.Add(a, value);
|
|
}
|
|
else if (graphs == 3)
|
|
{
|
|
zg1.GraphPane.CurveList[3].Label.Text = dataGridView1.Columns[col].HeaderText;
|
|
list4.Add(a, value);
|
|
}
|
|
else if (graphs == 4)
|
|
{
|
|
zg1.GraphPane.CurveList[4].Label.Text = dataGridView1.Columns[col].HeaderText;
|
|
list5.Add(a, value);
|
|
}
|
|
else
|
|
{
|
|
CustomMessageBox.Show("Max of 5");
|
|
break;
|
|
}
|
|
}
|
|
catch { error++; log.Info("Bad Data : " + type + " " + col + " " + a); if (error >= 500) { CustomMessageBox.Show("There is to much bad data - failing"); break; } }
|
|
}
|
|
a++;
|
|
}
|
|
|
|
// Make sure the Y axis is rescaled to accommodate actual data
|
|
try
|
|
{
|
|
zg1.AxisChange();
|
|
}
|
|
catch { }
|
|
// Zoom all
|
|
zg1.ZoomOutAll(zg1.GraphPane);
|
|
// Force a redraw
|
|
zg1.Invalidate();
|
|
|
|
graphs++;
|
|
}
|
|
|
|
private void BUT_cleargraph_Click(object sender, EventArgs e)
|
|
{
|
|
graphs = 0;
|
|
foreach (LineItem line in zg1.GraphPane.CurveList)
|
|
{
|
|
line.Clear();
|
|
line.Label.Text = "Value";
|
|
}
|
|
zg1.Invalidate();
|
|
}
|
|
|
|
private void BUT_loadlog_Click(object sender, EventArgs e)
|
|
{
|
|
// reset column count
|
|
m_iColumnCount = 0;
|
|
// clear existing lists
|
|
zg1.GraphPane.CurveList.Clear();
|
|
// reload
|
|
Form1_Load(sender, e);
|
|
}
|
|
}
|
|
} |