26,6 → 26,7 |
using System.Windows.Navigation; |
using System.Windows.Shapes; |
using System.Windows.Threading; |
using System.Globalization; |
|
namespace MKLiveView |
{ |
262,7 → 263,9 |
DataTable dtMotors1 = new DataTable(); |
|
DataTable dtWaypoints = new DataTable(); |
static volatile int _iWP = -1; |
static volatile int _iWPCount = -1; |
static volatile int _iWPIndex = -1; |
int _iWPTimeout = 1000; |
bool _bGetWP = false; |
static volatile bool _bGetWPCount = false; |
|
347,50 → 350,15 |
/// </summary> |
void _dataTablesInit() |
{ |
//dtAnalog.Columns.Add("ID"); |
//dtAnalog.Columns.Add("Value"); |
// dataGridView1.DataSource = dtAnalog; |
|
dtMotors1.Columns.Add("#"); |
if (Thread.CurrentThread.CurrentUICulture.Name == "") |
if (Thread.CurrentThread.CurrentUICulture.Name == "de-DE") |
dtMotors1.Columns.Add("Strom"); |
else |
dtMotors1.Columns.Add("Current"); |
else |
dtMotors1.Columns.Add("Strom"); |
dtMotors1.Columns.Add("Temp"); |
//dtMotors2.Columns.Add("#"); |
//if (Thread.CurrentThread.CurrentUICulture.Name == "") |
// dtMotors2.Columns.Add("Current"); |
//else |
// dtMotors2.Columns.Add("Strom"); |
//dtMotors2.Columns.Add("Temp"); |
dgvMotors1.DataContext = dtMotors1.DefaultView; |
//dgvMotors2.DataContext = dtMotors2.DefaultView; |
_initDTMotors(); |
//dgvMotors1.Columns[0].Width = 24; |
//dgvMotors1.Columns[1].Width = 74; |
//dgvMotors1.Columns[2].Width = 74; |
//dgvMotors2.Columns[0].Width = 24; |
//dgvMotors2.Columns[1].Width = 74; |
//dgvMotors2.Columns[2].Width = 74; |
|
dtWaypoints.Columns.Add("Index"); |
dtWaypoints.Columns.Add("Type"); |
dtWaypoints.Columns.Add("Name"); |
dtWaypoints.Columns.Add("Latitude"); |
dtWaypoints.Columns.Add("Longitude"); |
dtWaypoints.Columns.Add("Altitude"); |
dtWaypoints.Columns.Add("Heading"); |
dtWaypoints.Columns.Add("Speed"); |
dtWaypoints.Columns.Add("Altitude rate"); |
dtWaypoints.Columns.Add("Tol radius"); |
dtWaypoints.Columns.Add("Hold time"); |
dtWaypoints.Columns.Add("AutoTrigger"); |
dtWaypoints.Columns.Add("Cam angle"); |
dtWaypoints.Columns.Add("Event"); |
dtWaypoints.Columns.Add("Eventchan Val"); |
dtWaypoints.Columns.Add("Status"); |
dtWaypoints.PrimaryKey = new DataColumn[] { dtWaypoints.Columns["Index"] }; |
dgvWP.DataContext = dtWaypoints.DefaultView; |
Setter setter = new Setter(ContentControl.PaddingProperty, new Thickness(5,0,5,0)); |
Style style = new Style(typeof(System.Windows.Controls.Primitives.DataGridColumnHeader)); |
style.Setters.Add(setter); |
398,14 → 366,33 |
style.Setters.Add(setter); |
setter = new Setter(ContentControl.ForegroundProperty, new SolidColorBrush(Colors.White)); |
style.Setters.Add(setter); |
|
dtWaypoints.Columns.Add("Index",typeof(int)); |
dtWaypoints.Columns.Add("Type",typeof(string)); |
dtWaypoints.Columns.Add("Name",typeof(string)); |
dtWaypoints.Columns.Add("Latitude",typeof(string)); |
dtWaypoints.Columns.Add("Longitude",typeof(string)); |
dtWaypoints.Columns.Add("Altitude",typeof(string)); |
dtWaypoints.Columns.Add("Heading",typeof(string)); |
dtWaypoints.Columns.Add("Speed",typeof(string)); |
dtWaypoints.Columns.Add("ClimbRate",typeof(string)); |
dtWaypoints.Columns.Add("Radius",typeof(string)); |
dtWaypoints.Columns.Add("HoldTime",typeof(string)); |
dtWaypoints.Columns.Add("AutoTrigger",typeof(string)); |
dtWaypoints.Columns.Add("CamAngle",typeof(string)); |
dtWaypoints.Columns.Add("Event",typeof(string)); |
dtWaypoints.Columns.Add("Out1Timer",typeof(string)); |
dtWaypoints.Columns.Add("Status",typeof(string)); |
dtWaypoints.PrimaryKey = new DataColumn[] { dtWaypoints.Columns["Index"] }; |
dgvWP.ItemsSource = dtWaypoints.DefaultView; |
dgvWP.ColumnHeaderStyle = new Style(); |
dgvWP.ColumnHeaderStyle = style; |
|
|
} |
/// <summary> |
/// initialize the 2 datatables for motor values |
/// dtMotors1 - motor 1 - 4 |
/// dtMotors2 - motor 5 - 8 |
/// DataGridView dgvMotors1/2 are bound to dtMotors1/2 |
/// initialize the datatable dtMotors1 for motor values |
/// DataGridView dgvMotors1 is bound to dtMotors1 |
/// </summary> |
void _initDTMotors() |
{ |
418,16 → 405,7 |
dtMotors1.Rows[i].SetField(1, "NA"); |
dtMotors1.Rows[i].SetField(2, "NA"); |
} |
//if (dtMotors2.Rows.Count < 4) |
// dtMotors2.Rows.Add((i + 5).ToString(), "NA", "NA"); |
//else |
//{ |
// dtMotors2.Rows[i].SetField(1, "NA"); |
// dtMotors2.Rows[i].SetField(2, "NA"); |
//} |
} |
// Dispatcher.Invoke((Action)(() => dgvMotors1.UpdateLayout())); |
//dgvMotors2.Invoke((Action)(() => dgvMotors2.Refresh())); |
} |
|
#endregion init |
523,7 → 501,8 |
} |
private void btnSendWPList_Click(object sender, RoutedEventArgs e) |
{ |
|
Thread t = new Thread(new ThreadStart(_sendWPList)); |
t.Start(); |
} |
|
private void btnConnectToCopter_Click(object sender, RoutedEventArgs e) |
1241,6 → 1220,9 |
_processWPData(data); |
break; |
|
case 'W': //return new Waypoint items count after sending waypoint to copter |
_iWPCount = data[0]; |
break; |
//default: |
// Log(LogMsgType.Incoming, "cmd: " + cmdID.ToString()); |
// Log(LogMsgType.Incoming, BitConverter.ToString(data)); |
1778,16 → 1760,10 |
/// <param name="data">the received byte array to process</param> |
void _processWPData(byte[] data) |
{ |
_iWP = data[0]; |
_iWPCount = data[0]; |
_bGetWPCount = false; |
if (data.Length >= 28) |
{ |
//int count = data[0]; |
//int index = data[1]; |
//cbWPIndex.Invoke((Action)(() => cbWPIndex.Items.Clear())); |
//for (int i = 0; i < count; i++) |
// cbWPIndex.Invoke((Action)(() => cbWPIndex.Items.Add(i + 1))); |
//cbWPIndex.Invoke((Action)(() => cbWPIndex.SelectedItem = index)); |
Dispatcher.Invoke(() => lblWPIndex.Content = data[1].ToString()); |
Dispatcher.Invoke(() => lblWPCount.Content = data[0].ToString()); |
if (_bGetWP) |
1796,14 → 1772,9 |
dtWaypoints.Rows.Clear(); |
DataRow dr = dtWaypoints.NewRow(); |
dr = Waypoints.toDataRow(data, dr); |
//if (dtWaypoints.Rows.Contains(data[1])) |
//{ |
// dtWaypoints.Rows.Find(data[1]).Delete(); |
// dtWaypoints.Rows.InsertAt(dr, data[1] - 1); |
//} |
//else |
dtWaypoints.Rows.Add(dr); |
|
Dispatcher.Invoke(() => dgvWP.Items.Refresh()); |
Dispatcher.Invoke(() => _iWPIndex = data[1]); |
if (data[1] == data[0]) |
{ |
_bGetWP = false; |
1816,7 → 1787,6 |
{ |
Dispatcher.Invoke(() => lblWPIndex.Content = 0); |
Dispatcher.Invoke(() => lblWPCount.Content = 0); |
// Debug.Print(new string(ASCIIEncoding.ASCII.GetChars(data, 0, data.Length))); |
} |
} |
/// <summary> |
2047,7 → 2017,7 |
_getpWP(1); |
while (_bGetWPCount) |
Thread.Sleep(100); |
if (_iWP > 0) |
if (_iWPCount > 0) |
_getWPList(); |
// } |
//} |
2055,13 → 2025,107 |
void _getWPList() |
{ |
_bGetWP = true; |
for (int j = 0; j < _iWP; j++) |
int iTimeout=0; |
for (int j = 0; j < _iWPCount; j++) |
{ |
_getpWP(j + 1); |
iTimeout = 0; |
while (_iWPIndex != j + 1 & iTimeout < _iWPTimeout * 5) |
{ |
Thread.Sleep(1); |
iTimeout++; |
} |
} |
} |
void _sendWPList() |
{ |
if (serialPortCtrl.Port.IsOpen) |
{ |
byte[] bData = new byte[30]; |
for (int i = 0; i < 30; i++) |
bData[i] = 0; |
Stream serialStream = serialPortCtrl.Port.BaseStream; |
byte[] bytes = FlightControllerMessage.CreateMessage('w', 2, bData); //delete all WP on Copter by sending 'invalid'(==0) at index 0 |
serialStream.Write(bytes, 0, bytes.Length); |
|
_iWPCount = -1; |
while (_iWPCount == -1) |
Thread.Sleep(10); |
Dispatcher.Invoke(() => lblWPCount.Content = _iWPCount.ToString()); |
|
int iVal; |
double dVal; |
NumberFormatInfo nfi = new NumberFormatInfo(); |
nfi.NumberDecimalSeparator = ","; |
for (int i = 0; i < dtWaypoints.Rows.Count; i++) |
{ |
//longitude |
dVal = Convert.ToDouble(dtWaypoints.Rows[i][4], nfi); |
iVal = (int)(dVal * Math.Pow(10, 7)); |
bData[0] = (byte)(iVal & 0xff); |
bData[1] = (byte)((iVal >> 8) & 0xff); |
bData[2] = (byte)((iVal >> 16) & 0xff); |
bData[3] = (byte)(iVal >> 24); |
//latitude |
dVal = Convert.ToDouble(dtWaypoints.Rows[i][3], nfi); |
iVal = (int)(dVal * Math.Pow(10, 7)); |
bData[4] = (byte)(iVal & 0xff); |
bData[5] = (byte)((iVal >> 8) & 0xff); |
bData[6] = (byte)((iVal >> 16) & 0xff); |
bData[7] = (byte)(iVal >> 24); |
//altitude |
dVal = Convert.ToDouble(dtWaypoints.Rows[i][5], nfi); |
iVal = (int)(dVal * 10); |
bData[8] = (byte)(iVal & 0xff); |
bData[9] = (byte)((iVal >> 8) & 0xff); |
bData[10] = (byte)((iVal >> 16) & 0xff); |
bData[11] = (byte)(iVal >> 24); |
//Status 'NEWDATA' |
bData[12] = 1; |
//heading |
iVal = Convert.ToInt16(dtWaypoints.Rows[i][6]); |
bData[13] = (byte)(iVal & 0xff); |
bData[14] = (byte)((iVal >> 8) & 0xff); |
//ToleranceRadius |
bData[15] = Convert.ToByte(dtWaypoints.Rows[i][9]); |
//HoldTime |
bData[16] = Convert.ToByte(dtWaypoints.Rows[i][10]); |
//Event_Flag |
bData[17] = Convert.ToByte(dtWaypoints.Rows[i][13]); |
//Index |
bData[18] = Convert.ToByte((int)dtWaypoints.Rows[i][0]); |
//Type |
bData[19] = Convert.ToByte(dtWaypoints.Rows[i][1]); |
//WP_EventChannelValue |
bData[20] = Convert.ToByte(dtWaypoints.Rows[i][14]); |
//AltitudeRate |
bData[21] = Convert.ToByte(dtWaypoints.Rows[i][8]); |
//Speed |
bData[22] = Convert.ToByte(dtWaypoints.Rows[i][7]); |
//CamAngle |
bData[23] = (byte)Convert.ToInt16(dtWaypoints.Rows[i][12]); |
//Name |
byte[] name = ASCIIEncoding.ASCII.GetBytes((string)dtWaypoints.Rows[i][2]); |
bData[24] = name.Length > 0 ? name[0] : (byte)0; |
bData[25] = name.Length > 1 ? name[1] : (byte)0; |
bData[26] = name.Length > 2 ? name[2] : (byte)0; |
bData[27] = name.Length > 3 ? name[3] : (byte)0; |
//Autotrigger |
bData[28] = Convert.ToByte(dtWaypoints.Rows[i][11]); |
|
bytes = FlightControllerMessage.CreateMessage('w', 2, bData); |
serialStream.Write(bytes, 0, bytes.Length); |
|
_iWPCount = -1; |
while (_iWPCount == -1) |
Thread.Sleep(10); |
Dispatcher.Invoke(() => lblWPCount.Content = _iWPCount.ToString()); |
} |
} |
else |
Log(LogMsgType.Error, "NOT CONNECTED!"); |
|
} |
|
#region OSD-Menue |
|
2524,6 → 2588,8 |
int wpnum = Convert.ToInt16(sVal); |
string wp; |
int i; |
NumberFormatInfo nfi = new NumberFormatInfo(); |
nfi.NumberDecimalSeparator = "."; |
dtWaypoints.Rows.Clear(); |
for (int k = 1; k <= wpnum; k++) |
{ |
2536,23 → 2602,23 |
i++; |
sVal = ini.IniReadValue(wp, "Type"); |
if (sVal != "") |
o[i] = ((Waypoints.pointType)(Convert.ToInt16(sVal) - 1)).ToString(); |
o[i] = Convert.ToInt16(sVal) -1; |
i++; |
sVal = ini.IniReadValue(wp, "Prefix"); |
if (sVal != "") |
o[i] = sVal == "0" ? "P" + k.ToString() : sVal + k.ToString(); |
i++; |
sVal = ini.IniReadValue(wp, "Longitude"); |
sVal = ini.IniReadValue(wp, "Latitude"); |
if (sVal != "") |
o[i] = Convert.ToDouble(sVal); |
o[i] = Convert.ToDouble(sVal, nfi); |
i++; |
sVal = ini.IniReadValue(wp, "Latitude"); |
sVal = ini.IniReadValue(wp, "Longitude"); |
if (sVal != "") |
o[i] = Convert.ToDouble(sVal); |
o[i] = Convert.ToDouble(sVal, nfi); |
i++; |
sVal = ini.IniReadValue(wp, "Altitude"); |
if (sVal != "") |
o[i] = Convert.ToInt16(sVal); |
o[i] = Convert.ToDouble(sVal, nfi); |
i++; |
sVal = ini.IniReadValue(wp, "Heading"); |
if (sVal != "") |
2560,7 → 2626,7 |
i++; |
sVal = ini.IniReadValue(wp, "Speed"); |
if (sVal != "") |
o[i] = Waypoints.WPSpeed(Convert.ToInt16(sVal)); |
o[i] =Convert.ToInt16(sVal); |
i++; |
sVal = ini.IniReadValue(wp, "ClimbRate"); |
if (sVal != "") |
2580,7 → 2646,7 |
i++; |
sVal = ini.IniReadValue(wp, "CAM-Nick"); |
if (sVal != "") |
o[i] = Waypoints.CAMAngle(Convert.ToInt16(sVal)); |
o[i] = Convert.ToInt16(sVal); |
i++; |
o[i] = 0; |
i++; |
2591,6 → 2657,7 |
o[i] = "New"; |
|
dr.ItemArray = o; |
// dtWaypoints.Rows.Add(dr); |
dtWaypoints.Rows.Add(dr); |
Dispatcher.Invoke(() => lblWPIndex.Content = k.ToString()); |
Dispatcher.Invoke(() => lblWPCount.Content = k.ToString()); |
2631,6 → 2698,51 |
} |
} |
|
public class waypointsConverter : IValueConverter |
{ |
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) |
{ |
if (value != null) |
{ |
switch ((string)parameter) |
{ |
case "Latitude": |
return value.ToString() + " °"; |
case "Longitude": |
return value.ToString() + " °"; |
case "Radius": |
return value.ToString() + " m"; |
case "Altitude": |
return value.ToString() + " m"; |
case "ClimbRate": |
return value.ToString() == "255" ? "Auto" : (System.Convert.ToDouble(value) / 10).ToString("0.0 m/s"); |
case "DelayTime": |
return value.ToString() + " s"; |
case "Heading": |
return Waypoints.Heading(System.Convert.ToInt32(value)); |
case "Speed": |
return Waypoints.WPSpeed(System.Convert.ToInt16(value)); |
case "CamAngle": |
return Waypoints.CAMAngle(System.Convert.ToInt16(value)); |
case "Type": |
return ((Waypoints.pointType)(System.Convert.ToInt16(value))).ToString(); |
case "AutoTrigger": |
return value.ToString() == "0" ? "- - -" : value.ToString() + " m"; |
case "Status": |
return Waypoints.WPSpeed(System.Convert.ToInt16(value)); |
} |
|
return value.ToString(); |
} |
else return value; |
} |
|
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) |
{ |
throw new NotImplementedException(); |
} |
} |
|
public class IniFile |
{ |
public string path; |