Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 2427 → Rev 2428

/MKLiveView/v1.0/Source/MainWindow.xaml.cs
1457,7 → 1457,10
break;
 
case 'O': //NC Data
_processNCData(data);
if (data[0] < 10)
_processNCData(data);
else
_processNCDataV2(data);
break;
 
//case 'E': //NC error-string
1817,10 → 1820,411
/// GPS-Position, capacatiy, flying time...
/// </summary>
/// <param name="data">the received byte array to process</param>
 
 
byte OSD_FLAG_MASK1 = 0x04 + 0x20 + 0x40 + 0x80;
byte OSD_FLAG_MASK2 = 0x01 + 0x02 + 0x08 + 0x10;
int FCSTATUSFLAGS1 = 0;
int FCSTATUSFLAGS2 = 0;
byte OSDSTATUSFLAGS1 = 0;
byte OSDSTATUSFLAGS2 = 0;
void _processNCDataV2(byte[] data)
{
int i_32, i_16, iVal;
double d;
OSD_Base_Data_t osd = new OSD_Base_Data_t(data);
OSDSTATUSFLAGS1 = osd.OSDSTATUSFLAGS1();
FCSTATUSFLAGS1 = (OSDSTATUSFLAGS1 & OSD_FLAG_MASK1) | (OSDSTATUSFLAGS2 & ~OSD_FLAG_MASK1);
FCSTATUSFLAGS2 = (OSDSTATUSFLAGS1 & OSD_FLAG_MASK2) | (OSDSTATUSFLAGS2 & ~OSD_FLAG_MASK2);
Dispatcher.Invoke(() => { drGPX[2] = osd.Pos().Lng; });
Dispatcher.Invoke(() => { drGPX[1] = osd.Pos().Lat; });
Dispatcher.Invoke(() => { drGPX[4] = DateTime.UtcNow.ToString("u", System.Globalization.CultureInfo.InvariantCulture); }); //2011-01-14T01:59:01Z });
Dispatcher.Invoke((Action)(() => tbNCGrSpeed.Text = osd.Speed().ToString("0.0 m/s")));
if (_Simulate)
Dispatcher.Invoke((Action)(() => tbTopSpeed.Text = osd.Speed().ToString("0.0 m/s")));
 
switch ((int)data[0])
{
case 10:
break;
case 11:
//---------------NC-Flags--------------------------
Dispatcher.Invoke((Action)(() => NC1_2.Background = ((data[14] & 2) == 2) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// NC_FLAG_PH 0x02
Dispatcher.Invoke((Action)(() => NC1_3.Background = ((data[14] & 4) == 4) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// NC_FLAG_CH 0x04
Dispatcher.Invoke((Action)(() => NC1_4.Background = ((data[14] & 8) == 8) ? new SolidColorBrush(Colors.LightCoral) : new SolidColorBrush(Colors.Transparent)));// NC_FLAG_RANGE_LIMIT 0x08
Dispatcher.Invoke((Action)(() => NC1_5.Background = ((data[14] & 16) == 16) ? new SolidColorBrush(Colors.LightCoral) : new SolidColorBrush(Colors.Transparent)));// NC_FLAG_NOSERIALLINK 0x10
Dispatcher.Invoke((Action)(() => NC1_6.Background = ((data[14] & 32) == 32) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// NC_FLAG_TARGET_REACHED 0x20
Dispatcher.Invoke((Action)(() => NC1_7.Background = ((data[14] & 64) == 64) ? new SolidColorBrush(Colors.DodgerBlue) : new SolidColorBrush(Colors.Transparent)));// NC_FLAG_MANUAL_CONTROL 0x40
Dispatcher.Invoke((Action)(() => NC1_8.Background = ((data[14] & 128) == 128) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// NC_FLAG_GPS_OK 0x80
 
Dispatcher.Invoke((Action)(() => tbSideBarStatusPH.Text = ((data[14] & 4) == 4) ? "CH" : "PH"));// NC_FLAG_PH 0x02 / NC_FLAG_CH 0x04
Dispatcher.Invoke((Action)(() => tbSideBarStatusPH.Background = (((data[14] & 2) == 2) | ((data[14] & 4) == 4)) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// NC_FLAG_PH 0x02 / NC_FLAG_CH 0x04
Dispatcher.Invoke((Action)(() => tbSideBarStatusPH.Foreground = (((data[14] & 2) == 2) | ((data[14] & 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[14] & 2) == 2) | ((data[14] & 4) == 4)) ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Color.FromArgb(255, 211, 210, 210))));// NC_FLAG_PH 0x02 / NC_FLAG_CH 0x04
 
//--------------- NC Error ------------------------
Dispatcher.Invoke((Action)(() => tbNCErr.Text = data[16].ToString())); //NC Errornumber
if (data[16] > 0)
_readNCError();
if (data[16] > 0 & data[16] < 44)
ErrorLog(LogMsgType.Error, " NC Error [" + data[16].ToString() + "]: ", NC_Error_Link[data[16]], NC_Error[data[16]]);
 
break;
case 12:
//--------------- RC quality ------------------------
Dispatcher.Invoke((Action)(() => tbRCQ.Text = data[23].ToString()));
Dispatcher.Invoke((Action)(() => tbTopRC.Text = data[23].ToString()));
 
if (data[23] > _iThresholdRC)
{
_iRCLevelJitter = 0; _bVoiceRCLevelActive = false;
if (stbRCLevelAnim != null && _bAnimRCLevelActive)
{
Dispatcher.Invoke(() => stbRCLevelAnim.Stop());
_bAnimRCLevelActive = false;
}
}
else
{
if (_iRCLevelJitter < 20) _iRCLevelJitter++;
if (_iRCLevelJitter == 20)
{
if (stbRCLevelAnim != null && !_bAnimRCLevelActive)
{
Dispatcher.Invoke(() => stbRCLevelAnim.Begin());
_bAnimRCLevelActive = true;
}
if (_bVoiceRCLevelPlay && !_bVoiceRCLevelActive)
{
_bVoiceRCLevelActive = true;
ThreadPool.QueueUserWorkItem(new WaitCallback(_mediaPlayer), "Voice\\MagneticField.mp3");
//Thread th = new Thread(() => _mediaPlayer("Voice\\RCLevel.mp3"));
//th.Start();
}
_iRCLevelJitter++;
}
}
break;
case 13:
//-------------------------Waypoint max range (by license)------------------------------
i_32 = data[24];
iVal = i_32 << 8;
iVal += data[23];
 
if (dWPMaxRange != iVal)
{
dWPMaxRange = iVal;
if (home != null && checkBoxShowWPMaxRange.IsChecked == true)
{
if (cWPBound != null && cWPBound.Tag != null)
MainMap.Markers.Remove(cWPBound.Tag as GMapMarker);
 
createCircle(home.Position, dWPMaxRange);
Dispatcher.Invoke(() =>
{
if (comboBoxWPMaxRangeColor.SelectionBoxItem != null)
{
string s = comboBoxWPMaxRangeColor.SelectionBoxItem.ToString();
cWPBound.setColor(s);
}
});
}
Dispatcher.Invoke((Action)(() => tbWPMaxRange.Text = iVal.ToString() + " m"));
}
 
OSDSTATUSFLAGS2 = osd.OSDSTATUSFLAGS2();
FCSTATUSFLAGS1 = (OSDSTATUSFLAGS1 & OSD_FLAG_MASK1) | (OSDSTATUSFLAGS2 & ~OSD_FLAG_MASK1);
FCSTATUSFLAGS2 = (OSDSTATUSFLAGS1 & OSD_FLAG_MASK2) | (OSDSTATUSFLAGS2 & ~OSD_FLAG_MASK2);
break;
 
case 14:
//--------------- Flying time ------------------------
i_16 = data[14];
i_16 = (Int16)(i_16 << 8);
iVal = data[13] + i_16;
TimeSpan t = TimeSpan.FromSeconds(iVal);
string Text = t.Hours.ToString("D2") + ":" + t.Minutes.ToString("D2") + ":" + t.Seconds.ToString("D2");
Dispatcher.Invoke((Action)(() => tbFTime.Text = Text.ToString()));
Dispatcher.Invoke((Action)(() => tbTopFTime.Text = Text.ToString()));
 
//--------------------------------Distance HP------------------------------------
i_16 = data[16];
i_16 = (Int16)(i_16 << 8);
iVal = data[15] + i_16;
Dispatcher.Invoke((Action)(() => tbHP.Text = ((double)iVal / (double)10).ToString("0.0 m")));
 
//--------------------------Distance to next WP--------------------------------
i_16 = data[19];
i_16 = (Int16)(i_16 << 8);
iVal = data[18] + i_16;
Dispatcher.Invoke((Action)(() => tbWP.Text = ((double)iVal / (double)10).ToString("0.0 m")));
Dispatcher.Invoke((Action)(() => lblWPRouteDistanceWP.Content = ((double)iVal / (double)10).ToString("0.0 m")));
Dispatcher.Invoke((Action)(() => tbWPStatusDistanceWP.Text = ((double)iVal / (double)10).ToString("0.0 m")));
 
//-------------------Satellites----------------------------------
Dispatcher.Invoke((Action)(() => tbTopSats.Text = data[23].ToString()));
 
if (data[23] > 4)//if more than 4 sats in use . otherwise the map would jump and scroll insane at beginning
{
_bSatFix = true; _iSatsJitter = 0; _bVoiceSatFixActive = false;
if (_bAutoHome && !_bFirstSatFix)
{
if (_iFirstSatFix < 3)
_iFirstSatFix++;
else
{
_bFirstSatFix = true;
Dispatcher.Invoke(() => _setHomePos());
}
}
if (stbSatFixLostAnim != null && _bAnimSatFixActive)
{
Dispatcher.Invoke(() => stbSatFixLostAnim.Stop());
_bAnimSatFixActive = false;
}
if (!_bFollowCopter)
{
_setCopterData(osd.Pos());
if (!MainMap.ViewArea.Contains(osd.Pos()))
Dispatcher.Invoke(() => MainMap.Position = osd.Pos());
 
}
else
Dispatcher.Invoke(() => MainMap.Position = osd.Pos());
}
else
{
if (_bSatFix)
{
if (data[23] == _iSatsLast)
{
if (_iSatsJitter < 20) _iSatsJitter++;
}
else
{
_iSatsJitter = 0;
_iSatsLast = data[23];
}
 
if (_iSatsJitter == 20)
{
if (stbSatFixLostAnim != null && !_bAnimSatFixActive)
{
Dispatcher.Invoke(() => stbSatFixLostAnim.Begin());
_bAnimSatFixActive = true;
}
if (_bVoiceSatFixPlay && !_bVoiceSatFixActive)
{
_bVoiceSatFixActive = true;
ThreadPool.QueueUserWorkItem(new WaitCallback(_mediaPlayer), "Voice\\SatFixLost.mp3");
//Thread th = new Thread(() => _mediaPlayer("Voice\\SatFixLost.mp3"));
//th.Start();
}
 
_bSatFix = false;
}
}
}
 
break;
 
case 15:
//--------------------------------Waypoint index------------------------------------
Dispatcher.Invoke((Action)(() => tbWPIndex.Text = data[13].ToString()));
Dispatcher.Invoke((Action)(() => lblWPIndexNC.Content = data[13].ToString()));
Dispatcher.Invoke((Action)(() => lblWPStatusIndexNC.Content = data[13].ToString()));
if (data[13] > 0 && _wpIndex != data[13]-1 && wpList.Count >= data[13]-1)
{
_setActiveWP(data[13]-1);
if ((FCSTATUSFLAGS1 & 2) == 2)
Dispatcher.Invoke(() => {
DataGridRow row;
if (_wpIndex > -1)
{
row = (DataGridRow)dgvWP.ItemContainerGenerator.ContainerFromIndex(wpOffset[_wpIndex]);
row.Background = new SolidColorBrush(Colors.Transparent);
row.BorderBrush = new SolidColorBrush(Colors.Transparent);
row.BorderThickness = new Thickness(0);
}
 
_wpIndex = data[13]-1;
row = (DataGridRow)dgvWP.ItemContainerGenerator.ContainerFromIndex(wpOffset[_wpIndex]);
row.Background = new SolidColorBrush(Color.FromArgb(80, 0, 255, 100));
row.BorderBrush = new SolidColorBrush(Colors.SpringGreen);
row.BorderThickness = new Thickness(2);
dgvWP.UpdateLayout();
});
_wpIndex = data[13]-1;
}
else
{
if ((data[13] == 0 || wpList.Count == 0) & MainMap.Markers.Contains(wpActiveMarker))
{
Dispatcher.Invoke(() => MainMap.Markers.Remove(wpActiveMarker));
Dispatcher.Invoke(() =>
{
DataGridRow row;
if (_wpIndex > -1 && data[13] == 0 && wpList.Count > _wpIndex)
{
row = (DataGridRow)dgvWP.ItemContainerGenerator.ContainerFromIndex(wpOffset[_wpIndex]);
row.Background = new SolidColorBrush(Colors.Transparent);
row.BorderBrush = new SolidColorBrush(Colors.Transparent);
row.BorderThickness = new Thickness(0);
_wpIndex = -1;
}
});
 
}
}
//----------------Waypoints count----------------------
Dispatcher.Invoke((Action)(() => tbWPCount.Text = data[14].ToString())); //Waypoints count
Dispatcher.Invoke((Action)(() => lblWPCountNC.Content = data[14].ToString())); //Waypoints count
Dispatcher.Invoke((Action)(() => lblWPStatusCountNC.Content = data[14].ToString())); //Waypoints count
_wpCount = data[14];
 
//---------------------------------Target hold time------------------------------
Dispatcher.Invoke((Action)(() => lblWPHoldTime.Content = data[15].ToString() + " s"));
Dispatcher.Invoke((Action)(() => tbWPStatusHoldTime.Text = data[15].ToString() + " s"));
 
break;
 
case 16:
//--------------- Capacity used ------------------------
i_16 = data[18];
i_16 = (Int16)(i_16 << 8);
iVal = data[17] + i_16;
Dispatcher.Invoke((Action)(() => tbCapacity.Text = iVal.ToString() + " mAh"));
Dispatcher.Invoke((Action)(() => tbTopCapacity.Text = iVal.ToString() + " mAh"));
 
//--------------- Heading compass ------------------------
i_16 = data[21];
iVal = 2 * i_16;
Dispatcher.Invoke((Action)(() => tbHeadingCompass.Text = iVal.ToString() + " °"));
if (_Simulate)
{
Dispatcher.Invoke(() => ArtHor.rotate = iVal);
Dispatcher.Invoke(() => ((CustomMarkerCopter)(copter.Shape)).rotate = iVal);
}
 
break;
case 17:
 
break;
case 18:
 
break;
default:
break;
}
//--------------------------------------------------------------------------------
//-----------------------------FC Status Flags-------------------------------
//--------------------------------------------------------------------------------
Dispatcher.Invoke((Action)(() => FC1_1.Background = ((FCSTATUSFLAGS1 & 1) == 1) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS_MOTOR_RUN 0x01
Dispatcher.Invoke((Action)(() => FC1_2.Background = ((FCSTATUSFLAGS1 & 2) == 2) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS_FLY 0x02
Dispatcher.Invoke((Action)(() => FC1_3.Background = ((FCSTATUSFLAGS1 & 4) == 4) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS_CALIBRATE 0x04
Dispatcher.Invoke((Action)(() => FC1_4.Background = ((FCSTATUSFLAGS1 & 8) == 8) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS_START 0x08
Dispatcher.Invoke((Action)(() => FC1_5.Background = ((FCSTATUSFLAGS1 & 16) == 16) ? new SolidColorBrush(Colors.LightCoral) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS_EMERGENCY_LANDING 0x10
Dispatcher.Invoke((Action)(() => FC1_6.Background = ((FCSTATUSFLAGS1 & 32) == 32) ? new SolidColorBrush(Colors.LightCoral) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS_LOWBAT 0x20
 
Dispatcher.Invoke((Action)(() => FC2_1.Background = ((FCSTATUSFLAGS2 & 1) == 1) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS2_CAREFREE 0x01
Dispatcher.Invoke((Action)(() => FC2_2.Background = ((FCSTATUSFLAGS2 & 2) == 2) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS2_ALTITUDE_CONTROL 0x02
Dispatcher.Invoke((Action)(() => FC2_3.Background = ((FCSTATUSFLAGS2 & 4) == 4) ? new SolidColorBrush(Colors.LightCoral) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS2_RC_FAILSAVE_ACTIVE 0x04
Dispatcher.Invoke((Action)(() => FC2_4.Background = ((FCSTATUSFLAGS2 & 8) == 8) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS2_OUT1_ACTIVE 0x08
Dispatcher.Invoke((Action)(() => FC2_5.Background = ((FCSTATUSFLAGS2 & 16) == 16) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS2_OUT2_ACTIVE 0x10
Dispatcher.Invoke((Action)(() => FC2_6.Background = ((FCSTATUSFLAGS2 & 32) == 32) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS2_WAIT_FOR_TAKEOFF 0x20 // Motor Running, but still on the ground
Dispatcher.Invoke((Action)(() => FC2_7.Background = ((FCSTATUSFLAGS2 & 64) == 64) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS2_AUTO_STARTING 0x40
Dispatcher.Invoke((Action)(() => FC2_8.Background = ((FCSTATUSFLAGS2 & 128) == 128) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS2_AUTO_LANDING 0x80
 
//Sidebar StatusSymbols
Dispatcher.Invoke((Action)(() => tbSideBarStatusMotors.Background = ((FCSTATUSFLAGS1 & 1) == 1) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS_MOTOR_RUN 0x01
Dispatcher.Invoke((Action)(() => tbSideBarStatusMotors.Foreground = ((FCSTATUSFLAGS1 & 1) == 1) ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Color.FromArgb(255, 211, 210, 210))));// FC_STATUS_MOTOR_RUN 0x01
Dispatcher.Invoke((Action)(() => tbSideBarStatusMotors.BorderBrush = ((FCSTATUSFLAGS1 & 1) == 1) ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Color.FromArgb(255, 211, 210, 210))));// FC_STATUS_MOTOR_RUN 0x01
 
Dispatcher.Invoke((Action)(() => tbSideBarStatusCF.Background = ((FCSTATUSFLAGS2 & 1) == 1) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS2_CAREFREE 0x01
Dispatcher.Invoke((Action)(() => tbSideBarStatusCF.Foreground = ((FCSTATUSFLAGS2 & 1) == 1) ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Color.FromArgb(255, 211, 210, 210))));// FC_STATUS2_CAREFREE 0x01
Dispatcher.Invoke((Action)(() => tbSideBarStatusCF.BorderBrush = ((FCSTATUSFLAGS2 & 1) == 1) ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Color.FromArgb(255, 211, 210, 210))));// FC_STATUS2_CAREFREE 0x01
 
Dispatcher.Invoke((Action)(() => tbSideBarStatusEmergencyLanding.Background = ((FCSTATUSFLAGS1 & 16) == 16) ? new SolidColorBrush(Colors.LightCoral) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS_EMERGENCY_LANDING 0x10
Dispatcher.Invoke((Action)(() => tbSideBarStatusEmergencyLanding.Foreground = ((FCSTATUSFLAGS1 & 16) == 16) ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Color.FromArgb(255, 211, 210, 210))));// FC_STATUS_EMERGENCY_LANDING 0x10
Dispatcher.Invoke((Action)(() => tbSideBarStatusEmergencyLanding.BorderBrush = ((FCSTATUSFLAGS1 & 16) == 16) ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Color.FromArgb(255, 211, 210, 210))));// FC_STATUS_EMERGENCY_LANDING 0x10
 
Dispatcher.Invoke((Action)(() => tbSideBarStatusAC.Background = ((FCSTATUSFLAGS2 & 2) == 2) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS2_ALTITUDE_CONTROL 0x02
Dispatcher.Invoke((Action)(() => tbSideBarStatusAC.Foreground = ((FCSTATUSFLAGS2 & 2) == 2) ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Color.FromArgb(255, 211, 210, 210))));// FC_STATUS2_ALTITUDE_CONTROL 0x02
Dispatcher.Invoke((Action)(() => tbSideBarStatusAC.BorderBrush = ((FCSTATUSFLAGS2 & 2) == 2) ? new SolidColorBrush(Colors.White) : new SolidColorBrush(Color.FromArgb(255, 211, 210, 210))));// FC_STATUS2_ALTITUDE_CONTROL 0x02
 
_bAirborne = (FCSTATUSFLAGS1 & 2) == 2 ? true : false;
 
 
}
public class OSD_Base_Data_t
{
byte[] data;
 
public OSD_Base_Data_t(byte [] _data)
{
data = _data;
}
 
public PointLatLng Pos()
{
PointLatLng p = new PointLatLng();
int i_32, iVal;
double d;
 
i_32 = data[4];
iVal = i_32 << 24;
i_32 = data[3];
iVal += i_32 << 16;
i_32 = data[2];
iVal += i_32 << 8;
iVal += data[1];
d = (double)iVal / Math.Pow(10, 7);
p.Lng = d;
 
i_32 = data[8];
iVal = i_32 << 24;
i_32 = data[7];
iVal += i_32 << 16;
i_32 = data[6];
iVal += i_32 << 8;
iVal += data[5];
d = (double)iVal / Math.Pow(10, 7);
p.Lat = d;
 
return p;
 
}
 
public int Height()
{
int i_32, iVal;
i_32 = data[10];
iVal = i_32 << 8;
iVal += data[9];
 
return iVal;
}
 
public double Speed()
{
return (double)data[11]/10;
}
 
public byte OSDSTATUSFLAGS1()
{
return data[12];
}
public byte OSDSTATUSFLAGS2()
{
return data[13];
}
}
void _processNCData(byte[] data)
{
int i_32, i_16, iVal;
double d;
 
//----------------------------POSITION------------------------------------
i_32 = data[4];
iVal = i_32 << 24;
i_32 = data[3];
1849,6 → 2253,7
Dispatcher.Invoke(() => { drGPX[4] = DateTime.UtcNow.ToString("u", System.Globalization.CultureInfo.InvariantCulture); }); //2011-01-14T01:59:01Z });
p.Lat = d;
 
//---------------------------SATS-------------------------------------------------
if (data[50] > 4)//if more than 4 sats in use . otherwise the map would jump and scroll insane at beginning
{
_bSatFix = true; _iSatsJitter = 0; _bVoiceSatFixActive = false;
1911,7 → 2316,7
}
}
 
//Distance to next WP
//--------------------------Distance to next WP--------------------------------
i_16 = data[28];
i_16 = (Int16)(i_16 << 8);
iVal = data[27] + i_16;
1919,13 → 2324,14
Dispatcher.Invoke((Action)(() => lblWPRouteDistanceWP.Content = ((double)iVal / (double)10).ToString("0.0 m")));
Dispatcher.Invoke((Action)(() => tbWPStatusDistanceWP.Text = ((double)iVal / (double)10).ToString("0.0 m")));
 
//-------------------------Distance to HP set by GPS on----------------------------------
i_16 = data[45];
i_16 = (Int16)(i_16 << 8);
iVal = data[44] + i_16;
// Dispatcher.Invoke((Action)(() => tbTopDistanceHP.Text = ((double)iVal / (double)10).ToString("0.0 m"))); //Distance to HP set by GPS on
Dispatcher.Invoke((Action)(() => tbHP.Text = ((double)iVal / (double)10).ToString("0.0 m"))); //Distance to HP set by GPS on
Dispatcher.Invoke((Action)(() => tbHP.Text = ((double)iVal / (double)10).ToString("0.0 m")));
 
Dispatcher.Invoke((Action)(() => tbWPIndex.Text = data[48].ToString())); //Waypoint index
//--------------------------------Waypoint index------------------------------------
Dispatcher.Invoke((Action)(() => tbWPIndex.Text = data[48].ToString()));
Dispatcher.Invoke((Action)(() => lblWPIndexNC.Content = data[48].ToString()));
Dispatcher.Invoke((Action)(() => lblWPStatusIndexNC.Content = data[48].ToString()));
if(data[48] > 0 && _wpIndex != data[48] -1 && wpList.Count >= data[48] -1)
1971,12 → 2377,13
 
}
}
 
//----------------Waypoints count----------------------
Dispatcher.Invoke((Action)(() => tbWPCount.Text = data[49].ToString())); //Waypoints count
Dispatcher.Invoke((Action)(() => lblWPCountNC.Content = data[49].ToString())); //Waypoints count
Dispatcher.Invoke((Action)(() => lblWPStatusCountNC.Content = data[49].ToString())); //Waypoints count
_wpCount = data[49];
Dispatcher.Invoke((Action)(() => tbTopSats.Text = data[50].ToString())); //Satellites
//-------------------Satellites----------------------------------
Dispatcher.Invoke((Action)(() => tbTopSats.Text = data[50].ToString()));
 
//--------------- Capacity used ------------------------
i_16 = data[81];
2052,7 → 2459,7
}
}
 
//Waypoint max range (by license)
//-------------------------Waypoint max range (by license)------------------------------
if(dWPMaxRange != (double)data[70])
{
dWPMaxRange = (double)data[70];
2073,7 → 2480,7
}
Dispatcher.Invoke((Action)(() => tbWPMaxRange.Text = data[70].ToString() + " m"));
}
//Target hold time
//---------------------------------Target hold time------------------------------
Dispatcher.Invoke((Action)(() => lblWPHoldTime.Content = data[73].ToString()+ " s"));
Dispatcher.Invoke((Action)(() => tbWPStatusHoldTime.Text = data[73].ToString()+ " s"));
 
2086,7 → 2493,9
//else
// if (_bErrorLog) _clearErrorLog("NC Error");
 
//-------------FC / NC Status Flags
//--------------------------------------------------------------------------------
//-----------------------------FC / NC Status Flags-------------------------------
//--------------------------------------------------------------------------------
Dispatcher.Invoke((Action)(() => FC1_1.Background = ((data[67] & 1) ==1) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS_MOTOR_RUN 0x01
Dispatcher.Invoke((Action)(() => FC1_2.Background = ((data[67] & 2) ==2) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS_FLY 0x02
Dispatcher.Invoke((Action)(() => FC1_3.Background = ((data[67] & 4) ==4) ? new SolidColorBrush(Colors.LightSeaGreen) : new SolidColorBrush(Colors.Transparent)));// FC_STATUS_CALIBRATE 0x04
2376,7 → 2785,8
private void _readNavData(bool auto)
{
byte interval = auto ? navctrlInterval : (byte)0;
_sendControllerMessage('o', 2, new byte[1] { interval });
// _sendControllerMessage('o', 2, new byte[1] { interval });
_sendControllerMessage('o', 2, new byte[3] { interval,4,0 });
}
/// <summary>
/// request the license info
3752,6 → 4162,7
}
 
}
 
/// <summary>
/// find the index of of a wp from datatable in the waypointlist wpList
/// </summary>
3950,6 → 4361,7
MainMap.Markers.Remove(mRouteWP);
}
}
 
private void btnLoadWPLFile_Click(object sender, RoutedEventArgs e)
{
_readWPLFile();
4093,6 → 4505,7
rectSimulate.Visibility = lblSimu.Visibility = _Simulate ? Visibility.Visible : Visibility.Hidden;
}
}
 
private void dgvWP_MouseUp(object sender, MouseButtonEventArgs e)
{
_dgvWPselectEditRow();
4214,123 → 4627,6
tbWPEditOut1.Text = iVal.ToString();
 
}
private void btnWPEditmoveUp_Click(object sender, RoutedEventArgs e)
{
if (dgvWP.SelectedIndex > 0 && dgvWP.SelectedIndex < dtWaypoints.Rows.Count)
{
int index = dgvWP.SelectedIndex;
if (((int)dtWaypoints.Rows[index][1] == 0 | (int)dtWaypoints.Rows[index][1] == 3) && ((int)dtWaypoints.Rows[index - 1][1] == 0 | (int)dtWaypoints.Rows[index - 1][1] == 3))// && wpList.Count > index)
{
PointLatLng x = new PointLatLng((double)dtWaypoints.Rows[index][3], (double)dtWaypoints.Rows[index][4]);
int wpListIndex = wpList.IndexOf(x);
if (wpListIndex > 0)
{
wpList.RemoveAt(wpListIndex);
wpList.Insert(wpListIndex - 1, x);
MainMap.Markers.Remove(mRouteWP);
_routeUpdate();
}
}
DataRow dr = dtWaypoints.Rows[index];
DataRow newRow = dtWaypoints.NewRow();
newRow.ItemArray = dr.ItemArray;
dtWaypoints.Rows.Remove(dr);
dtWaypoints.Rows.InsertAt(newRow, index - 1);
dtWaypoints.Rows[index][0] = 100;
dtWaypoints.Rows[index - 1][0] = index;
GMapMarker m1 = _findWPMarker(dtWaypoints.Rows[index - 1][2].ToString());
GMapMarker m2 = _findWPMarker(dtWaypoints.Rows[index][2].ToString());
dtWaypoints.Rows[index - 1][2] = dtWaypoints.Rows[index - 1][2].ToString().Substring(0, 1) + index.ToString();
((CustomMarkerWP)m1.Shape).text.Text = dtWaypoints.Rows[index - 1][2].ToString();
dtWaypoints.Rows[index][0] = index + 1;
dtWaypoints.Rows[index][2] = dtWaypoints.Rows[index][2].ToString().Substring(0, 1) + (index+1).ToString();
((CustomMarkerWP)m2.Shape).text.Text = dtWaypoints.Rows[index][2].ToString();
dgvWP.Items.Refresh();
dgvWP.SelectedIndex = index - 1;
_dgvWPselectEditRow();
if (wpOffset.Contains(index)) // calculating offset for wpList (index is 0-based - offset starts with index 1)
{
int iOffset = wpOffset.IndexOf(index);
if (iOffset > 0) // if not first element
{
if (wpOffset[iOffset - 1] < index-1) //if previous element is not immediately before actual offset
wpOffset[iOffset] = index-1; //then decrease offset value by one
}
else
wpOffset[iOffset] = index-1; //if first element, decrease offset by one
}
else //selected line is POI
{
if (wpOffset.Contains(index - 1)) // if next point is WP
{
int iOffset = wpOffset.IndexOf(index - 1);
wpOffset[iOffset] = index; //decrease linenumber of following WP
}
}
 
}
}
 
private void btnWPEditmoveDown_Click(object sender, RoutedEventArgs e)
{
if (dgvWP.SelectedIndex > -1 && dgvWP.SelectedIndex < dtWaypoints.Rows.Count - 1)
{
int index = dgvWP.SelectedIndex;
if (((int)dtWaypoints.Rows[index][1] == 0 | (int)dtWaypoints.Rows[index][1] == 3) && ((int)dtWaypoints.Rows[index+1][1] == 0 | (int)dtWaypoints.Rows[index+1][1] == 3))// && wpList.Count > index)
{
PointLatLng x = new PointLatLng((double)dtWaypoints.Rows[index][3], (double)dtWaypoints.Rows[index][4]);
int wpListIndex = wpList.IndexOf(x);
if (wpListIndex > -1)
{
wpList.RemoveAt(wpListIndex);
if (wpList.Count > wpListIndex)
wpList.Insert(wpListIndex + 1, x);
else
wpList.Add(x);
MainMap.Markers.Remove(mRouteWP);
_routeUpdate();
}
}
DataRow dr = dtWaypoints.Rows[index];
DataRow newRow = dtWaypoints.NewRow();
newRow.ItemArray = dr.ItemArray;
dtWaypoints.Rows.Remove(dr);
dtWaypoints.Rows.InsertAt(newRow, index + 1);
dtWaypoints.Rows[index][0] = 100;
dtWaypoints.Rows[index + 1][0] = index + 2;
GMapMarker m1 = _findWPMarker(dtWaypoints.Rows[index + 1][2].ToString());
GMapMarker m2 = _findWPMarker(dtWaypoints.Rows[index][2].ToString());
dtWaypoints.Rows[index + 1][2] = dtWaypoints.Rows[index + 1][2].ToString().Substring(0, 1) + (index+2).ToString();
((CustomMarkerWP)m1.Shape).text.Text = dtWaypoints.Rows[index + 1][2].ToString();
dtWaypoints.Rows[index][0] = index + 1;
dtWaypoints.Rows[index][2] = dtWaypoints.Rows[index][2].ToString().Substring(0, 1) + (index+1).ToString();
((CustomMarkerWP)m2.Shape).text.Text = dtWaypoints.Rows[index][2].ToString();
dgvWP.Items.Refresh();
dgvWP.SelectedIndex = index + 1;
_dgvWPselectEditRow();
if(wpOffset.Contains(index)) // If selected line is WP
{
int iOffset = wpOffset.IndexOf(index);
if(iOffset < wpOffset.Count -1) // if not last element
{
if (wpOffset[iOffset + 1] > index + 1) //if next element is not immediately after actual offset
wpOffset[iOffset] = index + 1; //then increase offset value by one
}
else
wpOffset[iOffset] = index + 1; //if last element increase offset by one
}
else //selected line is POI
{
if (wpOffset.Contains(index + 1)) // if next point is WP
{
int iOffset = wpOffset.IndexOf(index + 1);
wpOffset[iOffset] = index; //decrease linenumber of following WP
}
}
}
 
}
 
private void btnEditWPSave_Click(object sender, RoutedEventArgs e)
{
if(dgvWP.SelectedIndex > -1 && dgvWP.SelectedIndex < dtWaypoints.Rows.Count)
4632,6 → 4928,123
_dgvWPselectEditRow();
});
}
 
private void btnWPEditmoveUp_Click(object sender, RoutedEventArgs e)
{
if (dgvWP.SelectedIndex > 0 && dgvWP.SelectedIndex < dtWaypoints.Rows.Count)
{
int index = dgvWP.SelectedIndex;
if (((int)dtWaypoints.Rows[index][1] == 0 | (int)dtWaypoints.Rows[index][1] == 3) && ((int)dtWaypoints.Rows[index - 1][1] == 0 | (int)dtWaypoints.Rows[index - 1][1] == 3))// && wpList.Count > index)
{
PointLatLng x = new PointLatLng((double)dtWaypoints.Rows[index][3], (double)dtWaypoints.Rows[index][4]);
int wpListIndex = wpList.IndexOf(x);
if (wpListIndex > 0)
{
wpList.RemoveAt(wpListIndex);
wpList.Insert(wpListIndex - 1, x);
MainMap.Markers.Remove(mRouteWP);
_routeUpdate();
}
}
DataRow dr = dtWaypoints.Rows[index];
DataRow newRow = dtWaypoints.NewRow();
newRow.ItemArray = dr.ItemArray;
dtWaypoints.Rows.Remove(dr);
dtWaypoints.Rows.InsertAt(newRow, index - 1);
dtWaypoints.Rows[index][0] = 100;
dtWaypoints.Rows[index - 1][0] = index;
GMapMarker m1 = _findWPMarker(dtWaypoints.Rows[index - 1][2].ToString());
GMapMarker m2 = _findWPMarker(dtWaypoints.Rows[index][2].ToString());
dtWaypoints.Rows[index - 1][2] = dtWaypoints.Rows[index - 1][2].ToString().Substring(0, 1) + index.ToString();
((CustomMarkerWP)m1.Shape).text.Text = dtWaypoints.Rows[index - 1][2].ToString();
dtWaypoints.Rows[index][0] = index + 1;
dtWaypoints.Rows[index][2] = dtWaypoints.Rows[index][2].ToString().Substring(0, 1) + (index+1).ToString();
((CustomMarkerWP)m2.Shape).text.Text = dtWaypoints.Rows[index][2].ToString();
dgvWP.Items.Refresh();
dgvWP.SelectedIndex = index - 1;
_dgvWPselectEditRow();
if (wpOffset.Contains(index)) // calculating offset for wpList (index is 0-based - offset starts with index 1)
{
int iOffset = wpOffset.IndexOf(index);
if (iOffset > 0) // if not first element
{
if (wpOffset[iOffset - 1] < index-1) //if previous element is not immediately before actual offset
wpOffset[iOffset] = index-1; //then decrease offset value by one
}
else
wpOffset[iOffset] = index-1; //if first element, decrease offset by one
}
else //selected line is POI
{
if (wpOffset.Contains(index - 1)) // if next point is WP
{
int iOffset = wpOffset.IndexOf(index - 1);
wpOffset[iOffset] = index; //decrease linenumber of following WP
}
}
 
}
}
private void btnWPEditmoveDown_Click(object sender, RoutedEventArgs e)
{
if (dgvWP.SelectedIndex > -1 && dgvWP.SelectedIndex < dtWaypoints.Rows.Count - 1)
{
int index = dgvWP.SelectedIndex;
if (((int)dtWaypoints.Rows[index][1] == 0 | (int)dtWaypoints.Rows[index][1] == 3) && ((int)dtWaypoints.Rows[index+1][1] == 0 | (int)dtWaypoints.Rows[index+1][1] == 3))// && wpList.Count > index)
{
PointLatLng x = new PointLatLng((double)dtWaypoints.Rows[index][3], (double)dtWaypoints.Rows[index][4]);
int wpListIndex = wpList.IndexOf(x);
if (wpListIndex > -1)
{
wpList.RemoveAt(wpListIndex);
if (wpList.Count > wpListIndex)
wpList.Insert(wpListIndex + 1, x);
else
wpList.Add(x);
MainMap.Markers.Remove(mRouteWP);
_routeUpdate();
}
}
DataRow dr = dtWaypoints.Rows[index];
DataRow newRow = dtWaypoints.NewRow();
newRow.ItemArray = dr.ItemArray;
dtWaypoints.Rows.Remove(dr);
dtWaypoints.Rows.InsertAt(newRow, index + 1);
dtWaypoints.Rows[index][0] = 100;
dtWaypoints.Rows[index + 1][0] = index + 2;
GMapMarker m1 = _findWPMarker(dtWaypoints.Rows[index + 1][2].ToString());
GMapMarker m2 = _findWPMarker(dtWaypoints.Rows[index][2].ToString());
dtWaypoints.Rows[index + 1][2] = dtWaypoints.Rows[index + 1][2].ToString().Substring(0, 1) + (index+2).ToString();
((CustomMarkerWP)m1.Shape).text.Text = dtWaypoints.Rows[index + 1][2].ToString();
dtWaypoints.Rows[index][0] = index + 1;
dtWaypoints.Rows[index][2] = dtWaypoints.Rows[index][2].ToString().Substring(0, 1) + (index+1).ToString();
((CustomMarkerWP)m2.Shape).text.Text = dtWaypoints.Rows[index][2].ToString();
dgvWP.Items.Refresh();
dgvWP.SelectedIndex = index + 1;
_dgvWPselectEditRow();
if(wpOffset.Contains(index)) // If selected line is WP
{
int iOffset = wpOffset.IndexOf(index);
if(iOffset < wpOffset.Count -1) // if not last element
{
if (wpOffset[iOffset + 1] > index + 1) //if next element is not immediately after actual offset
wpOffset[iOffset] = index + 1; //then increase offset value by one
}
else
wpOffset[iOffset] = index + 1; //if last element increase offset by one
}
else //selected line is POI
{
if (wpOffset.Contains(index + 1)) // if next point is WP
{
int iOffset = wpOffset.IndexOf(index + 1);
wpOffset[iOffset] = index; //decrease linenumber of following WP
}
}
}
 
}
 
private void checkBoxShowWPStatus_Click(object sender, RoutedEventArgs e)
{
if (WPStatus.Visibility == Visibility.Visible)