first commit
This commit is contained in:
commit
0ff9e48e2e
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
.vs
|
||||||
|
GPSDLib/bin
|
||||||
|
GPSDLib/obj
|
||||||
31
GPSDLib.sln
Normal file
31
GPSDLib.sln
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 16
|
||||||
|
VisualStudioVersion = 16.0.31112.23
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GPSDLib", "GPSDLib\GPSDLib.csproj", "{570367E6-EA1B-4558-B414-D8C2537283F9}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "litjson", "..\litjson\litjson\litjson.csproj", "{1CCC9A15-799A-4FFD-8030-4B9EEA881F13}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{570367E6-EA1B-4558-B414-D8C2537283F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{570367E6-EA1B-4558-B414-D8C2537283F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{570367E6-EA1B-4558-B414-D8C2537283F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{570367E6-EA1B-4558-B414-D8C2537283F9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{1CCC9A15-799A-4FFD-8030-4B9EEA881F13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{1CCC9A15-799A-4FFD-8030-4B9EEA881F13}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{1CCC9A15-799A-4FFD-8030-4B9EEA881F13}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{1CCC9A15-799A-4FFD-8030-4B9EEA881F13}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {C0D8961F-6017-4E9E-B98C-CDE6D67C47B9}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
9
GPSDLib/Exception/ConnectionLostException.cs
Normal file
9
GPSDLib/Exception/ConnectionLostException.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Ghostware.GPSDLib.Exceptions {
|
||||||
|
public class ConnectionLostException : Exception {
|
||||||
|
public ConnectionLostException() : base("The connection is lost.") {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
GPSDLib/Exception/NotConnectedException.cs
Normal file
9
GPSDLib/Exception/NotConnectedException.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Ghostware.GPSDLib.Exceptions {
|
||||||
|
public class NotConnectedException : Exception {
|
||||||
|
public NotConnectedException() : base("The connection is not open. Plz connect first!") {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
GPSDLib/Exception/UnknownTypeException.cs
Normal file
9
GPSDLib/Exception/UnknownTypeException.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Ghostware.GPSDLib.Exceptions {
|
||||||
|
public class UnknownTypeException : Exception {
|
||||||
|
public UnknownTypeException() : base("Unknown Class Type") {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
GPSDLib/GPSDLib.csproj
Normal file
11
GPSDLib/GPSDLib.csproj
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\litjson\litjson\litjson.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
11
GPSDLib/GpsdConstants.cs
Normal file
11
GPSDLib/GpsdConstants.cs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
using Ghostware.GPSDLib.Models;
|
||||||
|
|
||||||
|
namespace Ghostware.GPSDLib {
|
||||||
|
public static class GpsdConstants {
|
||||||
|
public static GpsdOptions DefaultGpsdOptions = new GpsdOptions(true, true);
|
||||||
|
public const String DisableCommand = "?WATCH={\"enable\":false}";
|
||||||
|
public const String PollCommand = "?POLL;";
|
||||||
|
}
|
||||||
|
}
|
||||||
30
GPSDLib/GpsdDataParser.cs
Normal file
30
GPSDLib/GpsdDataParser.cs
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
using Ghostware.GPSDLib.Models;
|
||||||
|
|
||||||
|
|
||||||
|
using LitJson;
|
||||||
|
|
||||||
|
namespace Ghostware.GPSDLib {
|
||||||
|
public class GpsdDataParser {
|
||||||
|
public Object GetGpsData(String gpsData) {
|
||||||
|
try {
|
||||||
|
JsonData json = JsonMapper.ToObject(gpsData);
|
||||||
|
if(json.ContainsKey("class") && json["class"].IsString) {
|
||||||
|
return json["class"].ToString() switch {
|
||||||
|
"VERSION" => new GpsdVersion(json),
|
||||||
|
"DEVICES" => new GpsDevices(json),
|
||||||
|
"DEVICE" => new GpsDevice(json),
|
||||||
|
"WATCH" => new GpsdOptions(json),
|
||||||
|
"TPV" => new GpsLocation(json),
|
||||||
|
"SKY" => new GpsSky(json),
|
||||||
|
_ => null,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} catch(Exception e) {
|
||||||
|
Console.WriteLine(e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
261
GPSDLib/GpsdService.cs
Normal file
261
GPSDLib/GpsdService.cs
Normal file
@ -0,0 +1,261 @@
|
|||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Security;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
using Ghostware.GPSDLib.Exceptions;
|
||||||
|
using Ghostware.GPSDLib.Models;
|
||||||
|
|
||||||
|
namespace Ghostware.GPSDLib {
|
||||||
|
public class GpsdService : IDisposable {
|
||||||
|
#region Private Properties
|
||||||
|
|
||||||
|
private TcpClient _client;
|
||||||
|
private StreamReader _streamReader;
|
||||||
|
private StreamWriter _streamWriter;
|
||||||
|
|
||||||
|
private GpsdDataParser _gpsdDataParser;
|
||||||
|
|
||||||
|
private readonly String _serverAddress;
|
||||||
|
private readonly Int32 _serverPort;
|
||||||
|
|
||||||
|
private Boolean _proxyEnabled;
|
||||||
|
private String _proxyAddress;
|
||||||
|
private Int32 _proxyPort;
|
||||||
|
private Boolean _proxyAuthenticationEnabled;
|
||||||
|
private String _proxyUsername;
|
||||||
|
private SecureString _proxyPassword;
|
||||||
|
|
||||||
|
private GpsLocation _previousGpsLocation;
|
||||||
|
private GpsSky _lastSky;
|
||||||
|
|
||||||
|
|
||||||
|
private Int32 _retryReadCount;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Properties
|
||||||
|
|
||||||
|
public Boolean IsRunning {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
public Int32 ReadFrequenty { get; set; } = 1000;
|
||||||
|
public Int32 RetryRead { get; set; } = 3;
|
||||||
|
|
||||||
|
public GpsdOptions GpsOptions {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Events
|
||||||
|
|
||||||
|
public delegate void VersionEventHandler(Object source, GpsdVersion e);
|
||||||
|
public delegate void LocationEventHandler(Object source, Tuple<GpsLocation, GpsSky> e);
|
||||||
|
public delegate void RawLocationEventHandler(Object source, String rawLocation);
|
||||||
|
public event VersionEventHandler OnGpsdVersionChanged;
|
||||||
|
public event LocationEventHandler OnLocationChanged;
|
||||||
|
public event RawLocationEventHandler OnRawLocationChanged;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Constructors
|
||||||
|
|
||||||
|
public GpsdService(String serverAddress, Int32 serverPort) {
|
||||||
|
this._serverAddress = serverAddress;
|
||||||
|
this._serverPort = serverPort;
|
||||||
|
this.GpsOptions = GpsdConstants.DefaultGpsdOptions;
|
||||||
|
this.IsRunning = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GpsdService(String serverAddress, Int32 serverPort, GpsdOptions gpsOptions = null) : this(serverAddress, serverPort) => this.GpsOptions = gpsOptions ?? GpsdConstants.DefaultGpsdOptions;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Connection Functionality
|
||||||
|
|
||||||
|
public Boolean Connect() {
|
||||||
|
this._client = this._proxyEnabled ? this.ConnectViaHttpProxy() : new TcpClient(this._serverAddress, this._serverPort);
|
||||||
|
this._streamReader = new StreamReader(this._client.GetStream());
|
||||||
|
this._streamWriter = new StreamWriter(this._client.GetStream());
|
||||||
|
|
||||||
|
this._gpsdDataParser = new GpsdDataParser();
|
||||||
|
|
||||||
|
String gpsData = this._streamReader.ReadLine();
|
||||||
|
Object message = this._gpsdDataParser.GetGpsData(gpsData);
|
||||||
|
if(!(message is GpsdVersion version)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
OnGpsdVersionChanged?.Invoke(this, version);
|
||||||
|
this.ExecuteGpsdCommand(this.GpsOptions.GetCommand());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean Disconnect() {
|
||||||
|
this.StopGpsReading();
|
||||||
|
this.Dispose();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Gps Reading Functionality
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This task reads the gps. This task will run in a loop, so keep in mind to run it in a thread.
|
||||||
|
/// </summary>
|
||||||
|
/// <exception cref="NotConnectedException">Exception when client is not connected or streamreader is null. Plz call connect!</exception>
|
||||||
|
/// <exception cref="ConnectionLostException">Exception when the connection is lost.</exception>
|
||||||
|
public void StartGpsReading() {
|
||||||
|
if(this._streamReader == null || !this._client.Connected) {
|
||||||
|
throw new NotConnectedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
this._retryReadCount = this.RetryRead;
|
||||||
|
this.IsRunning = true;
|
||||||
|
while(this.IsRunning) {
|
||||||
|
if(!this._client.Connected) {
|
||||||
|
throw new ConnectionLostException();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
String gpsData = this._streamReader.ReadLine();
|
||||||
|
OnRawLocationChanged?.Invoke(this, gpsData);
|
||||||
|
if(gpsData == null) {
|
||||||
|
if(this._retryReadCount == 0) {
|
||||||
|
throw new ConnectionLostException();
|
||||||
|
}
|
||||||
|
this._retryReadCount--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object message = this._gpsdDataParser.GetGpsData(gpsData);
|
||||||
|
if(message is GpsSky sky) {
|
||||||
|
this._lastSky = sky;
|
||||||
|
}
|
||||||
|
if(!(message is GpsLocation gpsLocation) || this._previousGpsLocation != null && gpsLocation.Time.Subtract(new TimeSpan(0, 0, 0, 0, this.ReadFrequenty)) <= this._previousGpsLocation.Time) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
OnLocationChanged?.Invoke(this, new Tuple<GpsLocation, GpsSky>(gpsLocation,this._lastSky));
|
||||||
|
this._previousGpsLocation = gpsLocation;
|
||||||
|
} catch(IOException) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task StartGpsReadingAsync() => new Task(this.StartGpsReading);
|
||||||
|
|
||||||
|
|
||||||
|
public void StopGpsReading() {
|
||||||
|
if(!this.IsRunning) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.IsRunning = false;
|
||||||
|
this.ExecuteGpsdCommand(GpsdConstants.DisableCommand);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Helper Functions
|
||||||
|
|
||||||
|
private void ExecuteGpsdCommand(String command) {
|
||||||
|
if(this._streamWriter == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._streamWriter.WriteLine(command);
|
||||||
|
this._streamWriter.Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Proxies
|
||||||
|
|
||||||
|
public void SetProxy(String proxyAddress, Int32 proxyPort) {
|
||||||
|
this._proxyEnabled = true;
|
||||||
|
this._proxyAddress = proxyAddress;
|
||||||
|
this._proxyPort = proxyPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetProxyAuthentication(String username, String password) {
|
||||||
|
this._proxyAuthenticationEnabled = true;
|
||||||
|
this._proxyUsername = username;
|
||||||
|
|
||||||
|
SecureString securePass = new SecureString();
|
||||||
|
foreach(Char passwordChar in password) {
|
||||||
|
securePass.AppendChar(passwordChar);
|
||||||
|
}
|
||||||
|
this._proxyPassword = securePass;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetProxyAuthentication(String username, SecureString password) {
|
||||||
|
this._proxyAuthenticationEnabled = true;
|
||||||
|
this._proxyUsername = username;
|
||||||
|
this._proxyPassword = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DisableProxy() => this._proxyEnabled = false;
|
||||||
|
|
||||||
|
private TcpClient ConnectViaHttpProxy() {
|
||||||
|
UriBuilder uriBuilder = new UriBuilder {
|
||||||
|
Scheme = Uri.UriSchemeHttp,
|
||||||
|
Host = _proxyAddress,
|
||||||
|
Port = _proxyPort
|
||||||
|
};
|
||||||
|
|
||||||
|
Uri proxyUri = uriBuilder.Uri;
|
||||||
|
WebRequest request = WebRequest.Create("http://" + this._serverAddress + ":" + this._serverPort);
|
||||||
|
WebProxy webProxy = new WebProxy(proxyUri);
|
||||||
|
|
||||||
|
request.Proxy = webProxy;
|
||||||
|
request.Method = "CONNECT";
|
||||||
|
|
||||||
|
if(this._proxyAuthenticationEnabled) {
|
||||||
|
webProxy.Credentials = new NetworkCredential(this._proxyUsername, this._proxyPassword);
|
||||||
|
} else {
|
||||||
|
webProxy.UseDefaultCredentials = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
WebResponse response = request.GetResponse();
|
||||||
|
Stream responseStream = response.GetResponseStream();
|
||||||
|
Debug.Assert(responseStream != null);
|
||||||
|
|
||||||
|
const BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
|
||||||
|
|
||||||
|
Type rsType = responseStream.GetType();
|
||||||
|
PropertyInfo connectionProperty = rsType.GetProperty("Connection", flags);
|
||||||
|
|
||||||
|
Object connection = connectionProperty.GetValue(responseStream, null);
|
||||||
|
Type connectionType = connection.GetType();
|
||||||
|
PropertyInfo networkStreamProperty = connectionType.GetProperty("NetworkStream", flags);
|
||||||
|
|
||||||
|
Object networkStream = networkStreamProperty.GetValue(connection, null);
|
||||||
|
Type nsType = networkStream.GetType();
|
||||||
|
PropertyInfo socketProperty = nsType.GetProperty("Socket", flags);
|
||||||
|
Socket socket = (Socket)socketProperty.GetValue(networkStream, null);
|
||||||
|
|
||||||
|
return new TcpClient { Client = socket };
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Dispose
|
||||||
|
|
||||||
|
public void Dispose() {
|
||||||
|
this._streamReader?.Close();
|
||||||
|
this._streamWriter?.Close();
|
||||||
|
this._client?.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
59
GPSDLib/Models/GpsDevice.cs
Normal file
59
GPSDLib/Models/GpsDevice.cs
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
using LitJson;
|
||||||
|
|
||||||
|
namespace Ghostware.GPSDLib.Models {
|
||||||
|
public class GpsDevice {
|
||||||
|
public GpsDevice(JsonData json) {
|
||||||
|
this.Path = json["path"].ToString();
|
||||||
|
if(json.ContainsKey("driver")) {
|
||||||
|
this.Driver = json["driver"].ToString();
|
||||||
|
}
|
||||||
|
this.Activated = DateTime.Parse(json["activated"].ToString(), new System.Globalization.CultureInfo("en-US", false));
|
||||||
|
this.Flags = Double.Parse(json["flags"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
this.Native = Double.Parse(json["native"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
this.Bps = Double.Parse(json["bps"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
this.Parity = json["parity"].ToString();
|
||||||
|
this.Stopbits = Double.Parse(json["stopbits"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
this.Cycle = Double.Parse(json["cycle"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String Path {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String Driver {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DateTime Activated {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Flags {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Native {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Bps {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String Parity {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Stopbits {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Cycle {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override String ToString() => $"Path: {this.Path} - Driver: {this.Driver} - Activated: {this.Activated} - Flags: {this.Flags} - Native: {this.Native} - Bps: {this.Bps} - Parity: {this.Parity} - Stopbits: {this.Stopbits} - Cycle: {this.Cycle}";
|
||||||
|
}
|
||||||
|
}
|
||||||
18
GPSDLib/Models/GpsDevices.cs
Normal file
18
GPSDLib/Models/GpsDevices.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
using LitJson;
|
||||||
|
|
||||||
|
namespace Ghostware.GPSDLib.Models {
|
||||||
|
public class GpsDevices {
|
||||||
|
public GpsDevices(JsonData json) {
|
||||||
|
this.Devices = new List<GpsDevice>();
|
||||||
|
foreach(JsonData item in json["devices"]) {
|
||||||
|
this.Devices.Add(new GpsDevice(item));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<GpsDevice> Devices {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
73
GPSDLib/Models/GpsLocation.cs
Normal file
73
GPSDLib/Models/GpsLocation.cs
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
using LitJson;
|
||||||
|
|
||||||
|
namespace Ghostware.GPSDLib.Models {
|
||||||
|
public class GpsLocation {
|
||||||
|
public GpsLocation(JsonData json) {
|
||||||
|
this.Device = json["device"].ToString();
|
||||||
|
this.Mode = Double.Parse(json["mode"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
if(json.ContainsKey("time")) {
|
||||||
|
this.Time = DateTime.Parse(json["time"].ToString(), new System.Globalization.CultureInfo("en-US", false));
|
||||||
|
}
|
||||||
|
if(json.ContainsKey("ept")) {
|
||||||
|
this.Ept = Double.Parse(json["ept"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
if(json.ContainsKey("alt")) {
|
||||||
|
this.Altitute = Double.Parse(json["alt"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
if(json.ContainsKey("lat")) {
|
||||||
|
this.Latitude = Double.Parse(json["lat"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
if(json.ContainsKey("lon")) {
|
||||||
|
this.Longitude = Double.Parse(json["lon"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
if(json.ContainsKey("track")) {
|
||||||
|
this.Track = Double.Parse(json["track"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
if(json.ContainsKey("speed")) {
|
||||||
|
this.SpeedKnots = Double.Parse(json["speed"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String Device {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Mode {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DateTime Time {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Ept {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Altitute {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Latitude {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Longitude {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Track {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double SpeedKnots {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Speed => this.SpeedKnots * 1.852;
|
||||||
|
|
||||||
|
public override String ToString() => $"Device: {this.Device} - Mode: {this.Mode} - Time: {this.Time} - Latitude: {this.Latitude} - Longitude: {this.Longitude} - Altitute: {this.Altitute} - Track: {this.Track} - Speed: {this.Speed}";
|
||||||
|
}
|
||||||
|
}
|
||||||
41
GPSDLib/Models/GpsSatelites.cs
Normal file
41
GPSDLib/Models/GpsSatelites.cs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
using LitJson;
|
||||||
|
|
||||||
|
namespace Ghostware.GPSDLib.Models {
|
||||||
|
public class GpsSatelites {
|
||||||
|
|
||||||
|
public GpsSatelites(JsonData json) {
|
||||||
|
this.PRN = Double.Parse(json["PRN"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
if(json.ContainsKey("el")) {
|
||||||
|
this.El = Double.Parse(json["el"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
this.Az = Double.Parse(json["az"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
this.Ss = Double.Parse(json["ss"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
this.Used = Boolean.Parse(json["used"].ToString());
|
||||||
|
this.Gnssid = Double.Parse(json["gnssid"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
this.Svid = Double.Parse(json["svid"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
public Double PRN {
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
public Double El {
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
public Double Az {
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
public Double Ss {
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
public Boolean Used {
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
public Double Gnssid {
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
public Double Svid {
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
47
GPSDLib/Models/GpsSky.cs
Normal file
47
GPSDLib/Models/GpsSky.cs
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
using LitJson;
|
||||||
|
|
||||||
|
namespace Ghostware.GPSDLib.Models {
|
||||||
|
public class GpsSky {
|
||||||
|
public GpsSky(JsonData json) {
|
||||||
|
this.Vdop = Double.Parse(json["vdop"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
this.Hdop = Double.Parse(json["hdop"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
this.Pdop = Double.Parse(json["pdop"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
if(json.ContainsKey("nSat")) {
|
||||||
|
this.Sat = Double.Parse(json["nSat"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
if(json.ContainsKey("uSat") && this.Sat == 0) {
|
||||||
|
this.Sat = Double.Parse(json["uSat"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
if(json.ContainsKey("satellites")) {
|
||||||
|
this.Satelites = new List<GpsSatelites>();
|
||||||
|
foreach(JsonData item in json["satellites"]) {
|
||||||
|
this.Satelites.Add(new GpsSatelites(item));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Vdop {
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Hdop {
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Pdop {
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Sat {
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
public List<GpsSatelites> Satelites {
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override String ToString() => $"Vdop: {this.Vdop} - Hdop: {this.Hdop} - Ndop: {this.Pdop} - Satelites: {this.Sat}";
|
||||||
|
}
|
||||||
|
}
|
||||||
60
GPSDLib/Models/GpsdOptions.cs
Normal file
60
GPSDLib/Models/GpsdOptions.cs
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
|
||||||
|
using LitJson;
|
||||||
|
|
||||||
|
namespace Ghostware.GPSDLib.Models {
|
||||||
|
public class GpsdOptions {
|
||||||
|
public GpsdOptions(JsonData json) {
|
||||||
|
this.Enable = Boolean.Parse(json["enable"].ToString());
|
||||||
|
this.Json = Boolean.Parse(json["json"].ToString());
|
||||||
|
this.Nmea = Boolean.Parse(json["nmea"].ToString());
|
||||||
|
this.Raw = Double.Parse(json["raw"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
this.Scaled = Boolean.Parse(json["scaled"].ToString());
|
||||||
|
this.Timing = Boolean.Parse(json["timing"].ToString());
|
||||||
|
this.Split24 = Boolean.Parse(json["split24"].ToString());
|
||||||
|
this.Pps = Boolean.Parse(json["pps"].ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public GpsdOptions(Boolean enable, Boolean json) {
|
||||||
|
this.Enable = enable;
|
||||||
|
this.Json = json;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean Enable {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean Json {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean Nmea {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Raw {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean Scaled {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean Timing {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean Split24 {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean Pps {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String GetCommand() => $"?WATCH={JsonMapper.ToJson(new Dictionary<String, Object>() { { "enable", this.Enable }, { "json", this.Json }, { "nmea", this.Nmea }, { "raw", this.Raw }, { "scaled", this.Scaled }, { "timing", this.Timing }, { "split24", this.Split24 }, { "pps", this.Pps } })}";
|
||||||
|
}
|
||||||
|
}
|
||||||
33
GPSDLib/Models/GpsdVersion.cs
Normal file
33
GPSDLib/Models/GpsdVersion.cs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
|
||||||
|
using LitJson;
|
||||||
|
|
||||||
|
namespace Ghostware.GPSDLib.Models {
|
||||||
|
public class GpsdVersion {
|
||||||
|
public GpsdVersion(JsonData json) {
|
||||||
|
this.Release = Double.Parse(json["release"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
this.Rev = Double.Parse(json["rev"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
this.ProtoMajor = Double.Parse(json["proto_major"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
this.ProtoMinor = Double.Parse(json["proto_minor"].ToString().Replace(',', '.'), System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Release {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double Rev {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double ProtoMajor {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double ProtoMinor {
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override String ToString() => $"Release: {this.Release} - Revision: {this.Rev} - ProtoMajor: {this.ProtoMajor} - ProtoMinor: {this.ProtoMinor}";
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user