Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 2323 → Rev 2324

/MKLiveView/v1.0/Source/MainWindow.xaml.cs
27,6 → 27,8
using System.Windows.Shapes;
using System.Windows.Threading;
using System.Globalization;
using System.Xml;
using System.Xml.Linq;
 
namespace MKLiveView
{
43,7 → 45,7
PointLatLng end;
PointLatLng pHome;
 
 
#region NC-Errors
String[] NC_Error = new string[44]
{
"No Error",
91,7 → 93,7
"ACC not calibr." + Environment.NewLine + "http://wiki.mikrokopter.de/ErrorCodes#A42_.22ACC_not_calibr..22",
"ERR:Parachute!" + Environment.NewLine + "http://wiki.mikrokopter.de/ErrorCodes#A43_.22ERR:Parachute.21.22"
};
 
#endregion NC-Errors
[FlagsAttribute]
enum NC_HWError0 : short
{
146,6 → 148,7
bool _bErrorLog = false;
bool _bConnErr = false;
bool _bFollowCopter = false;
bool _bGPXLog = false;
 
bool _bSaveWinStateNormal = true;
bool _bSaveWinStateFull = true;
233,6 → 236,7
 
string[] sAnalogLabel = new string[32];
string[] sAnalogData = new string[32];
int[] iAnalogData = new int[32];
 
int[] iTimings = new int[] {100,150,200,250,300,350,400,450,500,550,600,650,700,750,800,850,900,950,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000 };
int[] iMotors = new int[] {3,4,5,6,7,8,9,10,11,12 };
268,7 → 272,9
int _iWPTimeout = 1000;
bool _bGetWP = false;
static volatile bool _bGetWPCount = false;
 
DataTable dtGPX = new DataTable();
DataRow drGPX;
bool _bAirborne = false;
DispatcherTimer timer = new DispatcherTimer();
 
/// <summary>
341,8 → 347,8
cBoxTimingsOSD.SelectedItem = OSDInterval * 10;
checkBoxAutoSetHP.IsChecked = _bAutoHome;
checkBoxFollowCopter.IsChecked = _bFollowCopter;
checkBoxGPXLog.IsChecked = _bGPXLog;
 
 
}
/// <summary>
/// initialize the datatables
388,6 → 394,13
dgvWP.ColumnHeaderStyle = new Style();
dgvWP.ColumnHeaderStyle = style;
 
dtGPX.Columns.Add("Index",typeof(int));
dtGPX.Columns.Add("Latitude",typeof(double));
dtGPX.Columns.Add("Longitude",typeof(double));
dtGPX.Columns.Add("Elevation",typeof(int));
dtGPX.Columns.Add("Time",typeof(string));
dtGPX.PrimaryKey = new DataColumn[] { dtGPX.Columns["Index"] };
drGPX = dtGPX.NewRow();
 
}
/// <summary>
426,6 → 439,7
Dispatcher.Invoke(() => imageWiFi.Source = new BitmapImage(new Uri("Images/WiFi_W.png", UriKind.Relative)));
_readCont(false);
}
bool _bToggle = false;
void timerEvent(object sender, EventArgs e)
{
if (bReadContinously)
450,6 → 464,15
// Dispatcher.Invoke((Action)(() => rctConnection.Fill = Brushes.LightGreen));
_iLifeCounter = 0;
_bConnErr = false;
// if(_bAirborne && _bGPXLog)
{
drGPX[0] = dtGPX.Rows.Count;
dtGPX.Rows.Add(new object[] { drGPX[0], drGPX[1], drGPX[2], drGPX[3], drGPX[4] });
}
Dispatcher.Invoke((Action)(() => tbSideBarGPXLog.Background = (_bGPXLog && _bToggle) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));
Dispatcher.Invoke((Action)(() => tbSideBarGPXLog.Foreground = (_bGPXLog) ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Color.FromArgb(255, 211, 210, 210))));
Dispatcher.Invoke((Action)(() => tbSideBarGPXLog.BorderBrush = (_bGPXLog) ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Color.FromArgb(255, 211, 210, 210))));
_bToggle = !_bToggle;
}
else
{
595,6 → 618,8
private void Window_Closing(object sender, CancelEventArgs e)
{
_writeIni();
if(_bGPXLog && dtGPX.Rows.Count > 0)
_saveGPXLog();
}
#endregion events
 
1273,7 → 1298,7
{
if (data.Length == 66)
{
int[] iAnalogData = new int[32];
double v;
int index = 0;
Int16 i16 = 0;
1301,6 → 1326,7
case 4: //altitude
Dispatcher.Invoke(() => tbAlt.Text = ((double)iAnalogData[index] / (double)10).ToString("0.0 m"));
Dispatcher.Invoke(() => tbTopHeight.Text = ((double)iAnalogData[index] / (double)10).ToString("0.0 m"));
Dispatcher.Invoke(() => { drGPX[3] = (double)iAnalogData[index] / (double)10; });
break;
case 7: //Voltage
v = (double)iAnalogData[index] / (double)10;
1556,7 → 1582,8
iVal += i_32 << 8;
iVal += data[1];
d = (double)iVal / Math.Pow(10, 7);
Dispatcher.Invoke(() => { drGPX[2] = d; });
 
PointLatLng p = new PointLatLng();
 
p.Lng = d;
1571,6 → 1598,8
iVal += i_32 << 8;
iVal += data[5];
d = (double)iVal / Math.Pow(10, 7);
Dispatcher.Invoke(() => { drGPX[1] = d; });
Dispatcher.Invoke(() => { drGPX[4] = DateTime.UtcNow.ToString("u", System.Globalization.CultureInfo.InvariantCulture); }); //2011-01-14T01:59:01Z });
p.Lat = d;
if (data[50] > 4)//if more than 4 sats in use . otherwise the map would jump and scroll insane at beginning
{
1758,6 → 1787,7
Dispatcher.Invoke((Action)(() => tbSideBarStatusPH.Foreground = (((data[68] & 2) == 2)|((data[68] & 4) == 4)) ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Color.FromArgb(255, 211, 210, 210))));// NC_FLAG_PH 0x02 / NC_FLAG_CH 0x04
Dispatcher.Invoke((Action)(() => tbSideBarStatusPH.BorderBrush = (((data[68] & 2) == 2)|((data[68] & 4) == 4)) ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Color.FromArgb(255, 211, 210, 210))));// NC_FLAG_PH 0x02 / NC_FLAG_CH 0x04
 
_bAirborne = (data[67] & 2) == 2 ? true : false;
}
/// <summary>
/// Navi-Ctrl WP data struct 'X'
2463,6 → 2493,8
if (sVal != "") _bFollowCopter = Convert.ToBoolean(sVal);
sVal = ini.IniReadValue("map", "AutoSetHome");
if (sVal != "") _bAutoHome = Convert.ToBoolean(sVal);
sVal = ini.IniReadValue("map", "GPXLog");
if (sVal != "") _bGPXLog = Convert.ToBoolean(sVal);
 
sVal = ini.IniReadValue("threshold", "VoltageWarning");
if(sVal != "") _dThresholdVoltageWarn = Convert.ToDouble(sVal);
2531,6 → 2563,7
 
ini.IniWriteValue("map", "followMe", _bFollowCopter.ToString());
ini.IniWriteValue("map", "AutoSetHome", _bAutoHome.ToString());
ini.IniWriteValue("map", "GPXLog", _bGPXLog.ToString());
 
ini.IniWriteValue("topBar", "voltage", chkBoxTopBarShowVoltage.IsChecked.ToString());
ini.IniWriteValue("topBar", "capacity", chkBoxTopBarShowCapacity.IsChecked.ToString());
2834,12 → 2867,155
((CustomMarkerCopter)(copter.Shape)).setColor("red");
});
}
 
private void btnLoadWPLFile_Click(object sender, RoutedEventArgs e)
{
_readWPLFile();
}
#endregion WP
#region GPX
private void checkBoxGPXLog_Click(object sender, RoutedEventArgs e)
{
_bGPXLog = (bool)checkBoxGPXLog.IsChecked;
}
void _gpxAdd(double lat,double lon, int elevation)
{
DataRow dr = dtGPX.NewRow();
dr[0] = dtGPX.Rows.Count - 1;
dr[1] = lat;
dr[2] = lon;
dr[3] = elevation;
dr[4] = DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture); //2011-01-14T01:59:01Z
dtGPX.Rows.Add(dr);
}
void _saveGPXLog()
{
if (!Directory.Exists("GPXLog"))
Directory.CreateDirectory("GPXLog");
string SaveFileName = "GPXLog\\" + DateTime.Now.ToString("yyyyMMdd_HHmm") + ".gpx";
XmlTextWriter myXmlTextWriter = null;
myXmlTextWriter = new XmlTextWriter(SaveFileName, null);
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ".";
 
try
{
myXmlTextWriter.Formatting = Formatting.Indented;
 
myXmlTextWriter.WriteStartDocument();
 
myXmlTextWriter.WriteStartElement("gpx");
 
myXmlTextWriter.WriteAttributeString("version", "1.0");
myXmlTextWriter.WriteAttributeString("creator", "MKLiveView v1.0");
myXmlTextWriter.WriteAttributeString("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
myXmlTextWriter.WriteAttributeString("xmlns", "http://www.topografix.com/GPX/1/1");
myXmlTextWriter.WriteAttributeString("xsi:schemaLocation", "http://www.topografix.com/GPX/1/1/gpx.xsd");
 
myXmlTextWriter.WriteElementString("time", DateTime.UtcNow.ToString("u", System.Globalization.CultureInfo.InvariantCulture));
 
myXmlTextWriter.WriteStartElement("trk");
myXmlTextWriter.WriteStartElement("trkseg");
for(int i = 0; i< dtGPX.Rows.Count;i++)
{
myXmlTextWriter.WriteStartElement("trkpt");
myXmlTextWriter.WriteAttributeString("lat", dtGPX.Rows[i][1].ToString() != "" ? ((double)dtGPX.Rows[i][1]).ToString(nfi) : "");
myXmlTextWriter.WriteAttributeString("lon", dtGPX.Rows[i][2].ToString() != "" ? ((double)dtGPX.Rows[i][2]).ToString(nfi) : "");
myXmlTextWriter.WriteElementString("ele", dtGPX.Rows[i][3].ToString());
myXmlTextWriter.WriteElementString("time", dtGPX.Rows[i][4].ToString());
myXmlTextWriter.WriteEndElement();
}
myXmlTextWriter.WriteEndElement();
myXmlTextWriter.WriteEndElement();
myXmlTextWriter.WriteEndElement();
}
catch (Exception e)
{
Console.WriteLine("Exception: {0}", e.ToString());
}
finally
{
if (myXmlTextWriter != null)
{
myXmlTextWriter.Close();
}
}
}
 
private void btnLoadGPXLog_Click(object sender, RoutedEventArgs e)
{
_loadGPXLog();
}
 
void _loadGPXLog()
{
 
Microsoft.Win32.OpenFileDialog fd = new Microsoft.Win32.OpenFileDialog();
fd.Filter = "GPX-Logfile | *.gpx";
fd.Multiselect = false;
if (fd.ShowDialog().Value)
{
string file = fd.FileName;
try
{
XDocument gpxDoc = XDocument.Load(file);
XNamespace gpx = XNamespace.Get("http://www.topografix.com/GPX/1/1");
 
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ".";
 
var tracks = from track in gpxDoc.Descendants(gpx + "trk")
select new
{
Name = track.Element(gpx + "name") != null ? track.Element(gpx + "name").Value : null,
Segs = (
from trackpoint in track.Descendants(gpx + "trkpt")
select new
{
Latitude = trackpoint.Attribute("lat").Value,
Longitude = trackpoint.Attribute("lon").Value,
Elevation = trackpoint.Element(gpx + "ele") != null ?
trackpoint.Element(gpx + "ele").Value : null,
Time = trackpoint.Element(gpx + "time") != null ?
trackpoint.Element(gpx + "time").Value : null
}
)
};
 
List<PointLatLng> wpl = new List<PointLatLng>();
foreach(var trk in tracks)
{
foreach(var trkseg in trk.Segs)
{
if(trkseg.Latitude != "" && trkseg.Longitude !="")
wpl.Add(new PointLatLng(Convert.ToDouble(trkseg.Latitude, nfi), Convert.ToDouble(trkseg.Longitude, nfi)));
}
 
}
if(wpl.Count() > 0)
{
for (int k = 0; k < MainMap.Markers.Count;)
{
GMapMarker p = MainMap.Markers[k];
if (p.Shape.GetType() == typeof(GMapRoute))
MainMap.Markers.Remove(p);
else
k++;
}
MapRoute mr = new MapRoute(wpl, "flying");
 
GMapRoute mRoute = new GMapRoute(mr.Points);
MainMap.Markers.Add(mRoute);
}
 
}
catch (Exception e)
{
Console.WriteLine("Exception: {0}", e.ToString());
}
}
}
#endregion GPX
#endregion functions
}
/// <summary>