mirror of https://github.com/ArduPilot/ardupilot
218 lines
6.3 KiB
C#
218 lines
6.3 KiB
C#
|
using System;
|
||
|
using System.ComponentModel;
|
||
|
using System.Drawing;
|
||
|
using System.Globalization;
|
||
|
using System.IO;
|
||
|
using System.Net;
|
||
|
|
||
|
namespace ArducopterConfigurator.PresentationModels
|
||
|
{
|
||
|
public class GpsStatusVm : NotifyProperyChangedBase, IPresentationModel
|
||
|
{
|
||
|
private const string SEND_GPS_DATA = "4";
|
||
|
private const string STOP_UPDATES = "X";
|
||
|
|
||
|
public ICommand GetMapCommand { get; private set; }
|
||
|
|
||
|
private BackgroundWorker bg;
|
||
|
|
||
|
public GpsStatusVm()
|
||
|
{
|
||
|
bg = new BackgroundWorker();
|
||
|
bg.DoWork += DownloadGoogleMap;
|
||
|
bg.RunWorkerCompleted += DownloadGoogleMapComplete;
|
||
|
|
||
|
GetMapCommand = new DelegateCommand(_ => GetMap(), _=> HasFix && !bg.IsBusy);
|
||
|
}
|
||
|
|
||
|
private void GetMap()
|
||
|
{
|
||
|
var urlTemplate =
|
||
|
"http://maps.google.com/maps/api/staticmap?&markers=color:blue|label:A|{0:0.00000},{1:0.00000}&zoom=13&size=250x200&maptype=roadmap&sensor=false";
|
||
|
|
||
|
var url = string.Format(CultureInfo.InvariantCulture, urlTemplate, GpsLatitude, GpsLongitude);
|
||
|
|
||
|
bg.RunWorkerAsync(url);
|
||
|
}
|
||
|
|
||
|
private void DownloadGoogleMapComplete(object sender, RunWorkerCompletedEventArgs e)
|
||
|
{
|
||
|
MapImage = e.Result as Image;
|
||
|
}
|
||
|
|
||
|
private void DownloadGoogleMap(object sender, DoWorkEventArgs e)
|
||
|
{
|
||
|
var url = e.Argument as string;
|
||
|
var Client = new WebClient();
|
||
|
using (var strm = Client.OpenRead(url))
|
||
|
{
|
||
|
var png = Image.FromStream(strm);
|
||
|
e.Result = png;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void sendString(string str)
|
||
|
{
|
||
|
if (sendTextToApm != null)
|
||
|
sendTextToApm(this, new sendTextToApmEventArgs(str));
|
||
|
}
|
||
|
|
||
|
public void Activate()
|
||
|
{
|
||
|
sendString(SEND_GPS_DATA);
|
||
|
}
|
||
|
|
||
|
public void DeActivate()
|
||
|
{
|
||
|
sendString(STOP_UPDATES);
|
||
|
}
|
||
|
|
||
|
public event EventHandler updatedByApm;
|
||
|
|
||
|
|
||
|
public string Name
|
||
|
{
|
||
|
get { return "GPS Status"; }
|
||
|
}
|
||
|
|
||
|
public void handleLineOfText(string strRx)
|
||
|
{
|
||
|
// We don't bother with the automatic property population, as the received string is
|
||
|
// tab delimeted and the values have crazy scale factors anyway.
|
||
|
|
||
|
// hack for testing with no GPS
|
||
|
// strRx = "73410000\t407021470\t-740157940\t9242\t0\t19831\t1";
|
||
|
|
||
|
var parts = strRx.Split('\t');
|
||
|
try
|
||
|
{
|
||
|
GpsTime = int.Parse(parts[0].Trim(), CultureInfo.InvariantCulture);
|
||
|
GpsLatitude = (float)(int.Parse(parts[1].Trim(), CultureInfo.InvariantCulture)) / 10000000;
|
||
|
GpsLongitude = (float)(int.Parse(parts[2].Trim(), CultureInfo.InvariantCulture)) / 10000000;
|
||
|
GpsAltitude = int.Parse(parts[3].Trim(), CultureInfo.InvariantCulture) / 100;
|
||
|
GpsGroundSpeed = (float)(int.Parse(parts[4].Trim(), CultureInfo.InvariantCulture)) / 100;
|
||
|
GpsGroundCourse = int.Parse(parts[5].Trim(), CultureInfo.InvariantCulture) / 100;
|
||
|
HasFix = parts[6].Trim() == "1";
|
||
|
|
||
|
// Todo: the number of sats is actually a raw char, not an ascii char like '3'
|
||
|
}
|
||
|
catch (FormatException)
|
||
|
{
|
||
|
Console.WriteLine("Format Exception in GPS VM, string: " + strRx);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
public event EventHandler<sendTextToApmEventArgs> sendTextToApm;
|
||
|
|
||
|
#region bindables
|
||
|
|
||
|
private Image _mapImage;
|
||
|
|
||
|
public Image MapImage
|
||
|
{
|
||
|
get { return _mapImage; }
|
||
|
set
|
||
|
{
|
||
|
if (_mapImage == value) return;
|
||
|
_mapImage = value;
|
||
|
FirePropertyChanged("MapImage");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
private int _gpsTime;
|
||
|
|
||
|
public int GpsTime
|
||
|
{
|
||
|
get { return _gpsTime; }
|
||
|
set
|
||
|
{
|
||
|
if (_gpsTime == value) return;
|
||
|
_gpsTime = value;
|
||
|
FirePropertyChanged("GpsTime");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private float _gpsLatitude;
|
||
|
|
||
|
public float GpsLatitude
|
||
|
{
|
||
|
get { return _gpsLatitude; }
|
||
|
set
|
||
|
{
|
||
|
if (_gpsLatitude == value) return;
|
||
|
_gpsLatitude = value;
|
||
|
FirePropertyChanged("GpsLatitude");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private float _gpsLongitude;
|
||
|
|
||
|
public float GpsLongitude
|
||
|
{
|
||
|
get { return _gpsLongitude; }
|
||
|
set
|
||
|
{
|
||
|
if (_gpsLongitude == value) return;
|
||
|
_gpsLongitude = value;
|
||
|
FirePropertyChanged("GpsLongitude");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private float _gpsGroundSpeed;
|
||
|
|
||
|
public float GpsGroundSpeed
|
||
|
{
|
||
|
get { return _gpsGroundSpeed; }
|
||
|
set
|
||
|
{
|
||
|
if (_gpsGroundSpeed == value) return;
|
||
|
_gpsGroundSpeed = value;
|
||
|
FirePropertyChanged("GpsGroundSpeed");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private int _gpsGroundCourse;
|
||
|
|
||
|
public int GpsGroundCourse
|
||
|
{
|
||
|
get { return _gpsGroundCourse; }
|
||
|
set
|
||
|
{
|
||
|
if (_gpsGroundCourse == value) return;
|
||
|
_gpsGroundCourse = value;
|
||
|
FirePropertyChanged("GpsGroundCourse");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private int _gpsAltitude;
|
||
|
|
||
|
public int GpsAltitude
|
||
|
{
|
||
|
get { return _gpsAltitude; }
|
||
|
set
|
||
|
{
|
||
|
if (_gpsAltitude == value) return;
|
||
|
_gpsAltitude = value;
|
||
|
FirePropertyChanged("GpsAltitude");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private bool _hasFix;
|
||
|
|
||
|
public bool HasFix
|
||
|
{
|
||
|
get { return _hasFix; }
|
||
|
set
|
||
|
{
|
||
|
if (_hasFix == value) return;
|
||
|
_hasFix = value;
|
||
|
FirePropertyChanged("HasFix");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endregion
|
||
|
}
|
||
|
}
|