Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 2312 → Rev 2313

/MKLiveView/v1.0/Source/MainWindow.xaml.cs
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);
 
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,14 → 2025,108
void _getWPList()
{
_bGetWP = true;
for (int j = 0; j < _iWP; j++)
int iTimeout=0;
for (int j = 0; j < _iWPCount; j++)
{
_getpWP(j + 1);
Thread.Sleep(10);
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
 
/// <summary>
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;