167,6 → 167,30 |
int _iLifeCounter = 0; |
int crcError = 0; |
|
bool _bSatFix = false; |
Storyboard stbSatFixLostAnim; |
bool _bAnimSatFixActive = false; |
bool _bVoiceSatFixActive = false; |
bool _bVoiceSatFixPlay = false; |
int _iSatsLast = 0; |
int _iSatsJitter = 0; |
|
bool _bMagneticFieldOK = false; |
Storyboard stbMagneticFieldAnim; |
bool _bAnimMagneticFieldActive = false; |
bool _bVoiceMagneticFieldActive = false; |
bool _bVoiceMagneticFieldPlay = false; |
int _iMagneticFieldLast = 0; |
int _iMagneticFieldJitter = 0; |
|
bool _bRCLevelOK = false; |
Storyboard stbRCLevelAnim; |
bool _bAnimRCLevelActive = false; |
bool _bVoiceRCLevelActive = false; |
bool _bVoiceRCLevelPlay = false; |
int _iRCLevelLast = 0; |
int _iRCLevelJitter = 0; |
|
int _iMotors = 4; |
int _LipoCells = 4; |
|
177,11 → 201,24 |
Storyboard stbVoltageCritAnim; |
bool _bCritAnimVoltActive = false; |
bool _bCritVoiceVoltActive = false; |
bool _bCWarnVoiceVoltActive = false; |
bool _bWarnVoiceVoltActive = false; |
bool _bVoiceVoltPlay = false; |
double _dVoltLast = 0; |
int _iVoltJitter = 0; |
|
double _dThresholdDistanceWarn = 100; |
Storyboard stbDistanceWarnAnim; |
bool _bAnimDistanceActive = false; |
bool _bVoiceDistanceActive = false; |
bool _bVoiceDistancePlay = false; |
double _dDistanceLast = 0; |
int _iDistanceJitter = 0; |
|
double _dThresholdDistanceMax = 1000; |
int _iThresholdRC = 160; |
int _iThresholdMagField = 15; |
|
|
double _dTopHeight = 36; |
|
int[] serChan = new int[12] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; |
271,7 → 308,14 |
sliderThresholdVoltageWarn.Value = _dThresholdVoltageWarn; |
sliderThresholdVoltageCrit.Value = _dThresholdVoltageCrit; |
checkBoxThresholdVoltageVoice.IsChecked = _bVoiceVoltPlay; |
checkBoxSatfixLost.IsChecked = _bVoiceSatFixPlay; |
checkBoxMagneticField.IsChecked = _bVoiceMagneticFieldPlay; |
checkBoxThresholdDistanceVoice.IsChecked = _bVoiceDistancePlay; |
sliderThresholdDistanceWarn.Value = _dThresholdDistanceWarn; |
checkBoxRClevel.IsChecked = _bVoiceRCLevelPlay; |
|
sliderThresholdDistanceWarn.Maximum = _dThresholdDistanceMax; |
|
cBoxMotors.ItemsSource = iMotors; |
cBoxMotors.SelectedItem = _iMotors; |
|
507,6 → 551,7 |
_bSaveWinStateFull = (bool)chkBoxSaveFullScreenState.IsChecked; |
} |
|
#region thresholds |
private void sliderThresholdVoltageWarn_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) |
{ |
if(!_init) |
521,6 → 566,31 |
{ |
_bVoiceVoltPlay = (bool)checkBoxThresholdVoltageVoice.IsChecked; |
} |
|
private void sliderThresholdDistanceWarn_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) |
{ |
if(!_init) |
_dThresholdDistanceWarn = sliderThresholdDistanceWarn.Value; |
} |
private void checkBoxThresholdDistanceVoice_Click(object sender, RoutedEventArgs e) |
{ |
_bVoiceDistancePlay = (bool)checkBoxThresholdDistanceVoice.IsChecked; |
} |
|
private void checkBoxSatfixLost_Click(object sender, RoutedEventArgs e) |
{ |
_bVoiceSatFixPlay = (bool)checkBoxSatfixLost.IsChecked; |
} |
private void checkBoxMagneticField_Click(object sender, RoutedEventArgs e) |
{ |
_bVoiceMagneticFieldPlay = (bool)checkBoxMagneticField.IsChecked; |
} |
private void checkBoxRClevel_Click(object sender, RoutedEventArgs e) |
{ |
_bVoiceRCLevelPlay = (bool)checkBoxRClevel.IsChecked; |
} |
#endregion thresholds |
|
private void buttonSwitchNC_Click(object sender, RoutedEventArgs e) |
{ |
_switchToNC(); |
529,6 → 599,10 |
private void Window_Loaded(object sender, RoutedEventArgs e) |
{ |
stbVoltageCritAnim = TryFindResource("VoltageCritAnim") as Storyboard; |
stbSatFixLostAnim = TryFindResource("SatFixLostAnim") as Storyboard; |
stbMagneticFieldAnim = TryFindResource("MagneticFieldCritAnim") as Storyboard; |
stbDistanceWarnAnim = TryFindResource("DistanceCritAnim") as Storyboard; |
stbRCLevelAnim = TryFindResource("RCCritAnim") as Storyboard; |
_setMotorGridSize(); |
} |
#endregion events |
718,6 → 792,52 |
Dispatcher.Invoke(() => ArtHor.rotateHome = GMapProviders.EmptyProvider.Projection.GetBearing(copter.Position, home.Position)); |
double d = GMapProviders.EmptyProvider.Projection.GetDistance(home.Position, copter.Position); |
Dispatcher.Invoke(() => tbTopDistanceHP.Text = (d * 1000).ToString("0.0 m")); |
|
if(d*1000 < _dThresholdDistanceWarn) |
{ |
_iDistanceJitter = 0; _bVoiceDistanceActive = false; |
if (stbDistanceWarnAnim != null && _bAnimDistanceActive) |
{ |
Dispatcher.Invoke(() => stbDistanceWarnAnim.Stop()); |
_bAnimDistanceActive = false; |
} |
} |
else |
{ |
//if (d * 1000 == _dDistanceLast) |
//{ |
// if (_iDistanceJitter < 20) |
// { _iDistanceJitter++; } |
//} |
//else |
//{ |
// _iDistanceJitter = 0; |
// _dDistanceLast = d * 1000; |
//} |
if (_iDistanceJitter < 20) |
{ _iDistanceJitter++; } |
if (_iDistanceJitter == 20) |
{ |
if (stbDistanceWarnAnim != null && !_bAnimDistanceActive) |
{ |
Dispatcher.Invoke(() => stbDistanceWarnAnim.Begin()); |
_bAnimDistanceActive = true; |
} |
if (_bVoiceDistancePlay && !_bVoiceDistanceActive) |
{ |
if (File.Exists("Voice\\Distance.mp3")) |
{ |
|
MediaPlayer.MediaPlayer mp = new MediaPlayer.MediaPlayer(); |
mp.Open("Voice\\Distance.mp3"); |
mp.Play(); |
} |
_bVoiceDistanceActive = true; |
} |
_iDistanceJitter++; |
} |
} |
|
} |
} |
|
1245,7 → 1365,7 |
} |
_bCritVoiceVoltActive = false; |
|
if (_bVoiceVoltPlay && !_bCWarnVoiceVoltActive) |
if (_bVoiceVoltPlay && !_bWarnVoiceVoltActive) |
{ |
if (File.Exists("Voice\\LowBattery.mp3")) |
{ |
1254,7 → 1374,7 |
mp.Open("Voice\\LowBattery.mp3"); |
mp.Play(); |
} |
_bCWarnVoiceVoltActive = true; |
_bWarnVoiceVoltActive = true; |
} |
} |
} |
1268,7 → 1388,7 |
_bCritAnimVoltActive = false; |
} |
_bCritVoiceVoltActive = false; |
_bCWarnVoiceVoltActive = false; |
_bWarnVoiceVoltActive = false; |
_iVoltJitter = 0; |
} |
break; |
1277,27 → 1397,69 |
Dispatcher.Invoke(() => tbTopCurrent.Text = ((double)iAnalogData[index] / (double)10).ToString("0.0 A")); |
break; |
case 10: //heading |
Dispatcher.Invoke((Action)(() => tbHeading.Text = sAnalogData[index] + "°")); |
Dispatcher.Invoke((Action)(() => tbHeading.Text = sAnalogData[index] + "°")); |
Dispatcher.Invoke(() => ArtHor.rotate = iAnalogData[index]); |
break; |
case 12: // SPI error |
Dispatcher.Invoke((Action)(() => tbSPI.Text = sAnalogData[index])); |
Dispatcher.Invoke((Action)(() => tbSPI.Text = sAnalogData[index])); |
break; |
case 14: //i2c error |
Dispatcher.Invoke((Action)(() => tbI2C.Text = sAnalogData[index])); |
Dispatcher.Invoke((Action)(() => tbI2C.Text = sAnalogData[index])); |
break; |
case 20: //Earthmagnet field |
Dispatcher.Invoke((Action)(() => tbMagF.Text = sAnalogData[index] + "%")); |
Dispatcher.Invoke((Action)(() => tbTopEarthMag.Text = sAnalogData[index] + "%")); |
if(iAnalogData[index] > 115 | iAnalogData[index] < 85) |
Dispatcher.Invoke(() => imageEarthMag.Source = new BitmapImage(new Uri("Images/EarthMag_R.png", UriKind.Relative))); |
else |
Dispatcher.Invoke(() => imageEarthMag.Source = new BitmapImage(new Uri("Images/EarthMag.png", UriKind.Relative))); |
Dispatcher.Invoke((Action)(() => tbMagF.Text = sAnalogData[index] + "%")); |
Dispatcher.Invoke((Action)(() => tbTopEarthMag.Text = sAnalogData[index] + "%")); |
|
if (Math.Abs(100 - iAnalogData[index]) < _iThresholdMagField) |
{ |
Dispatcher.Invoke(() => imageEarthMag.Source = new BitmapImage(new Uri("Images/EarthMag.png", UriKind.Relative))); |
_iMagneticFieldJitter = 0; _bVoiceMagneticFieldActive = false; |
if (stbMagneticFieldAnim != null && _bAnimMagneticFieldActive) |
{ |
Dispatcher.Invoke(() => stbMagneticFieldAnim.Stop()); |
_bAnimMagneticFieldActive = false; |
} |
} |
else |
{ |
Dispatcher.Invoke(() => imageEarthMag.Source = new BitmapImage(new Uri("Images/EarthMag_R.png", UriKind.Relative))); |
if(_iMagneticFieldLast >= Math.Abs(100 - iAnalogData[index])) |
{ |
if (_iMagneticFieldJitter < 20) |
_iMagneticFieldJitter++; |
} |
else |
{ |
_iMagneticFieldJitter = 0; |
_iMagneticFieldLast = Math.Abs(100 - iAnalogData[index]); |
} |
if(_iMagneticFieldJitter == 20) |
{ |
if (stbMagneticFieldAnim != null && !_bAnimMagneticFieldActive) |
{ |
Dispatcher.Invoke(() => stbMagneticFieldAnim.Begin()); |
_bAnimMagneticFieldActive = true; |
} |
if (_bVoiceMagneticFieldPlay && !_bVoiceMagneticFieldActive) |
{ |
if (File.Exists("Voice\\MagneticField.mp3")) |
{ |
|
MediaPlayer.MediaPlayer mp = new MediaPlayer.MediaPlayer(); |
mp.Open("Voice\\MagneticField.mp3"); |
mp.Play(); |
} |
_bVoiceMagneticFieldActive = true; |
} |
} |
} |
break; |
case 21: //GroundSpeed |
Dispatcher.Invoke((Action)(() => tbSpeed.Text = ((double)iAnalogData[index] / (double)100).ToString("0.00 m/s"))); |
Dispatcher.Invoke((Action)(() => tbTopSpeed.Text = ((double)iAnalogData[index] / (double)100).ToString("0.00 m/s"))); |
break; |
|
///********** needs testing --> not sure what position this is *************** |
case 28: //Distance East from saved home position -> calculate distance with distance N + height |
dTemp = Math.Pow((double)iAnalogData[index], 2) + Math.Pow((double)iAnalogData[index - 1], 2); |
dTemp = Math.Sqrt(dTemp) / (double)10; //'flat' distance from HP with N/E |
1307,6 → 1469,7 |
// Dispatcher.Invoke((Action)(() => tbTopDistanceHP.Text = dTemp.ToString("0.0 m"))); |
Dispatcher.Invoke((Action)(() => tbHP1.Text = dTemp.ToString("0.0 m"))); |
break; |
|
case 31: //Sats used |
Dispatcher.Invoke((Action)(() => tbSats.Text = sAnalogData[index])); |
// Dispatcher.Invoke((Action)(() => tbTopSats.Text = sAnalogData[index])); |
1313,45 → 1476,6 |
break; |
} |
} |
//if (adr == 1) //FC |
//{ |
// switch (index) |
// { |
// case 0: //pitch (German: nick) |
// artificialHorizon1.Invoke((Action)(() => artificialHorizon1.pitch_angle = ((double)iAnalogData[index] / (double)10))); |
// lblNCPitch.Invoke((Action)(() => lblNCPitch.Text = ((double)iAnalogData[index] / (double)10).ToString("0.0°"))); |
// break; |
// case 1: //roll |
// artificialHorizon1.Invoke((Action)(() => artificialHorizon1.roll_angle = ((double)iAnalogData[index] / (double)10))); |
// lblNCRoll.Invoke((Action)(() => lblNCRoll.Text = ((double)iAnalogData[index] / (double)10).ToString("0.0°"))); |
// break; |
// case 5: //altitude |
// lblNCAlt.Invoke((Action)(() => lblNCAlt.Text = ((double)iAnalogData[index] / (double)10).ToString("0.0 m"))); |
// break; |
// case 8: //heading |
// lblNCCompass.Invoke((Action)(() => lblNCCompass.Text = sAnalogData[index] + "°")); |
// headingIndicator1.Invoke((Action)(() => headingIndicator1.SetHeadingIndicatorParameters(iAnalogData[index]))); |
// break; |
// case 9: //Voltage |
// lblNCVolt.Invoke((Action)(() => lblNCVolt.Text = ((double)iAnalogData[index] / (double)10).ToString("0.0 V"))); |
// break; |
// case 10: //Receiver quality |
// lblNCRC.Invoke((Action)(() => lblNCRC.Text = sAnalogData[index])); |
// break; |
// case 22: // Current |
// lblNCCur.Invoke((Action)(() => lblNCCur.Text = ((double)iAnalogData[index] / (double)10).ToString("0.0 A"))); |
// break; |
// case 23: //capacity used |
// lblNCCap.Invoke((Action)(() => lblNCCap.Text = (iAnalogData[index]).ToString("0 mAh"))); |
// break; |
// case 27: // SPI error |
// lblNCSPI.Invoke((Action)(() => lblNCSPI.Text = sAnalogData[index])); |
// break; |
// case 28: //i2c error |
// lblNCI2C.Invoke((Action)(() => lblNCI2C.Text = sAnalogData[index])); |
// break; |
// } |
//} |
index++; |
} |
} |
1479,19 → 1603,62 |
iVal += data[5]; |
d = (double)iVal / Math.Pow(10, 7); |
p.Lat = d; |
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; |
if (stbSatFixLostAnim != null && _bAnimSatFixActive) |
{ |
Dispatcher.Invoke(() => stbSatFixLostAnim.Stop()); |
_bAnimSatFixActive = false; |
} |
if (!_bFollowCopter) |
{ |
_setCopterData(p); |
if (!MainMap.ViewArea.Contains(p)) |
Dispatcher.Invoke(() => MainMap.Position = p); |
|
if (!_bFollowCopter && data[50] > 4) //if more than 4 sats in use . otherwise the map would jump and scroll insane |
{ |
_setCopterData(p); |
if(!MainMap.ViewArea.Contains(p)) |
} |
else |
Dispatcher.Invoke(() => MainMap.Position = p); |
|
} |
else |
if(data[50] > 4) //if more than 4 sats in use . otherwise the map would jump and scroll insane |
Dispatcher.Invoke(() => MainMap.Position = p); |
{ |
if(_bSatFix) |
{ |
if (data[50] == _iSatsLast) |
{ |
if (_iSatsJitter < 20) _iSatsJitter++; |
} |
else |
{ |
_iSatsJitter = 0; |
_iSatsLast = data[50]; |
} |
|
if (_iSatsJitter == 20) |
{ |
if (stbSatFixLostAnim != null && !_bAnimSatFixActive) |
{ |
Dispatcher.Invoke(() => stbSatFixLostAnim.Begin()); |
_bAnimSatFixActive = true; |
} |
if (_bVoiceSatFixPlay && !_bVoiceSatFixActive) |
{ |
if (File.Exists("Voice\\CriticalBattery.mp3")) |
{ |
|
MediaPlayer.MediaPlayer mp = new MediaPlayer.MediaPlayer(); |
mp.Open("Voice\\CriticalBattery.mp3"); |
mp.Play(); |
} |
_bVoiceSatFixActive = true; |
} |
|
_bSatFix = false; |
} |
} |
} |
|
// lblNCGPSLat.Invoke((Action)(() => lblNCGPSLat.Text = d.ToString("0.######°"))); //GPS-Position: Latitude in decimal degree |
//lblNCGPSLat.Invoke((Action)(() => lblNCGPSLat.Text = _convertDegree(d))); //GPS-Position: Latitude in minutes, seconds |
|
1532,7 → 1699,40 |
Dispatcher.Invoke((Action)(() => tbRCQ.Text = data[66].ToString())); |
Dispatcher.Invoke((Action)(() => tbTopRC.Text = data[66].ToString())); |
|
if(data[66] > _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) |
{ |
if (File.Exists("Voice\\RCLevel.mp3")) |
{ |
|
MediaPlayer.MediaPlayer mp = new MediaPlayer.MediaPlayer(); |
mp.Open("Voice\\RCLevel.mp3"); |
mp.Play(); |
} |
_bVoiceRCLevelActive = true; |
} |
_iRCLevelJitter++; |
} |
} |
|
//--------------- NC Error ------------------------ |
Dispatcher.Invoke((Action)(() => tbNCErr.Text = data[69].ToString())); //NC Errornumber |
if (data[69] > 0) |
2135,11 → 2335,28 |
if(sVal != "") _dThresholdVoltageWarn = Convert.ToDouble(sVal); |
sVal = ini.IniReadValue("threshold", "VoltageCritical"); |
if(sVal != "") _dThresholdVoltageCrit = Convert.ToDouble(sVal); |
sVal = ini.IniReadValue("threshold", "VoiceEnable"); |
sVal = ini.IniReadValue("threshold", "VoiceVoltageEnable"); |
if(sVal != "") _bVoiceVoltPlay = Convert.ToBoolean(sVal); |
sVal = ini.IniReadValue("threshold", "VoiceSatFixEnable"); |
if(sVal != "") _bVoiceSatFixPlay = Convert.ToBoolean(sVal); |
sVal = ini.IniReadValue("threshold", "VoiceMagFieldEnable"); |
if(sVal != "") _bVoiceMagneticFieldPlay = Convert.ToBoolean(sVal); |
sVal = ini.IniReadValue("threshold", "DistanceWarning"); |
if(sVal != "") _dThresholdDistanceWarn = Convert.ToDouble(sVal); |
sVal = ini.IniReadValue("threshold", "VoiceDistanceWarnEnable"); |
if(sVal != "") _bVoiceDistancePlay = Convert.ToBoolean(sVal); |
sVal = ini.IniReadValue("threshold", "VoiceRCLevelWarnEnable"); |
if(sVal != "") _bVoiceRCLevelPlay = Convert.ToBoolean(sVal); |
sVal = ini.IniReadValue("threshold", "MaxDistance"); |
if(sVal != "") _dThresholdDistanceMax = Convert.ToDouble(sVal); |
sVal = ini.IniReadValue("threshold", "RCThreshold"); |
if(sVal != "") _iThresholdRC = Convert.ToInt32(sVal); |
sVal = ini.IniReadValue("threshold", "MagFieldThreshold"); |
if(sVal != "") _iThresholdMagField = Convert.ToInt32(sVal); |
|
} |
|
|
/// <summary> |
/// save settings to ini-file |
/// </summary> |
2196,8 → 2413,15 |
|
ini.IniWriteValue("threshold", "VoltageWarning", _dThresholdVoltageWarn.ToString()); |
ini.IniWriteValue("threshold", "VoltageCritical", _dThresholdVoltageCrit.ToString()); |
ini.IniWriteValue("threshold", "VoiceEnable", _bVoiceVoltPlay.ToString()); |
|
ini.IniWriteValue("threshold", "VoiceVoltageEnable", _bVoiceVoltPlay.ToString()); |
ini.IniWriteValue("threshold", "VoiceSatFixEnable", _bVoiceSatFixPlay.ToString()); |
ini.IniWriteValue("threshold", "VoiceMagFieldEnable", _bVoiceMagneticFieldPlay.ToString()); |
ini.IniWriteValue("threshold", "VoiceDistanceWarnEnable", _bVoiceDistancePlay.ToString()); |
ini.IniWriteValue("threshold", "VoiceRCLevelWarnEnable", _bVoiceRCLevelPlay.ToString()); |
ini.IniWriteValue("threshold", "DistanceWarning", _dThresholdDistanceWarn.ToString()); |
ini.IniWriteValue("threshold", "MaxDistance", _dThresholdDistanceMax.ToString()); |
ini.IniWriteValue("threshold", "RCThreshold", _iThresholdRC.ToString()); |
ini.IniWriteValue("threshold", "MagFieldThreshold", _iThresholdMagField.ToString()); |
} |
#endregion functions |
|