Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 2290 → Rev 2291

/MKLiveView/v1.0/Source/MainWindow.xaml.cs
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