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> |