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