Files
GpsClient2/WindowsLocationApiGpsClient.cs

83 lines
2.7 KiB
C#

using GpsClient2.EventArguments;
using GpsClient2.Model;
using System;
using System.Device.Location;
namespace GpsClient2 {
public class WindowsLocationApiGpsClient : BaseGpsClient {
#region Private Properties
private GeoCoordinateWatcher _watcher;
private DateTimeOffset? _previousReadTime;
#endregion
#region Constructors
public WindowsLocationApiGpsClient(WindowsLocationApiInfo connectionData) : base(GpsType.WindowsLocationApi, connectionData) {
}
public WindowsLocationApiGpsClient(BaseGpsInfo connectionData) : base(GpsType.WindowsLocationApi, connectionData) {
}
#endregion
#region Connect and Disconnect
public override bool Connect() {
var data = (WindowsLocationApiInfo)GpsInfo;
IsRunning = true;
OnGpsStatusChanged(GpsStatus.Connecting);
_watcher = new GeoCoordinateWatcher();
_watcher.PositionChanged += WatcherOnPositionChanged;
_watcher.StatusChanged += WatcherOnStatusChanged;
bool result;
try {
result = _watcher.TryStart(false, TimeSpan.FromMilliseconds(data.Timeout));
} catch {
Disconnect();
throw;
}
return result;
}
private void WatcherOnStatusChanged(object sender, GeoPositionStatusChangedEventArgs e) {
switch (e.Status) {
case GeoPositionStatus.Ready:
OnGpsStatusChanged(GpsStatus.Connected);
break;
case GeoPositionStatus.Initializing:
OnGpsStatusChanged(GpsStatus.Connecting);
break;
case GeoPositionStatus.NoData:
OnGpsStatusChanged(GpsStatus.Connecting);
break;
case GeoPositionStatus.Disabled:
OnGpsStatusChanged(GpsStatus.Disabled);
break;
}
}
private void WatcherOnPositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) {
if (_previousReadTime != null && GpsInfo.ReadFrequency != 0 && e.Position.Timestamp.Subtract(new TimeSpan(0, 0, 0, 0, GpsInfo.ReadFrequency)) <= _previousReadTime) return;
OnGpsDataReceived(new GpsDataEventArgs(e.Position.Location));
_previousReadTime = e.Position.Timestamp;
}
public override bool Disconnect() {
IsRunning = false;
_watcher.Stop();
_watcher.Dispose();
OnGpsStatusChanged(GpsStatus.Disabled);
return true;
}
#endregion
}
}