ardupilot/Tools/ArdupilotMegaPlanner/LogBrowse.cs
Michael Oborne 9c836ab037 Mission Planner 1.2.26
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
2012-12-07 17:19:46 +08:00

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);
}
}
}