/// <summary>\r
/// \r
/// </summary>\r
- /// <param name="x">ECEF X velocity in cm/s</param>\r
- /// <param name="y">ECEF Y velocity in cm/s</param>\r
- /// <param name="z">ECEF Z velocity in cm/s</param>\r
+ /// <param name="e">ENU E velocity in m/s</param>\r
+ /// <param name="n">ENU N velocity in m/s</param>\r
+ /// <param name="u">ENU U velocity in m/s</param>\r
+ /// <param name="accuracy">Speed Accuracy Estimate in m/s</param>\r
+ public EcefVelocity(double e, double n, double u, double accuracy)\r
+ {\r
+ E = e;\r
+ N = n;\r
+ U = u;\r
+ Accuracy = accuracy;\r
+ }\r
+\r
+ /// <summary>\r
+ /// \r
+ /// </summary>\r
+ /// <param name="e">ENU E velocity in cm/s</param>\r
+ /// <param name="n">ENU N velocity in cm/s</param>\r
+ /// <param name="u">ENU U velocity in cm/s</param>\r
/// <param name="accuracy">Speed Accuracy Estimate in cm/s</param>\r
- public EcefVelocity(int x, int y, int z, uint accuracy)\r
+ public EcefVelocity(int e, int n, int u, uint accuracy)\r
+ : this(e * 0.01, n * 0.01, u * 0.01, accuracy * 0.01)\r
{\r
- X = x * 0.01;\r
- Y = y * 0.01;\r
- Z = z * 0.01;\r
- Accuracy = accuracy * 0.01;\r
}\r
#endregion\r
\r
#region properties\r
- public double X\r
+ public double E\r
{\r
get;\r
set;\r
}\r
\r
- public double Y\r
+ public double N\r
{\r
get;\r
set;\r
}\r
\r
- public double Z\r
+ public double U\r
{\r
get;\r
set;\r
get;\r
set;\r
}\r
+\r
+ public double Speed\r
+ {\r
+ get\r
+ { \r
+ return Math.Sqrt(E * E + N * N + U * U);\r
+ }\r
+ }\r
#endregion\r
}\r
}\r
--- /dev/null
+/*\r
+ * Yubeshi GPS Parser\r
+ *\r
+ * This software is distributed under a zlib-style license.\r
+ * See license.txt for more information.\r
+ */\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+\r
+namespace Yubeshi\r
+{\r
+ public class EnuVelocity\r
+ {\r
+ #region fields\r
+ \r
+ #endregion\r
+\r
+ #region constructors\r
+\r
+ public EnuVelocity(double e, double n, double u)\r
+ {\r
+ E = e;\r
+ N = n;\r
+ U = u;\r
+ Origin = null;\r
+ }\r
+\r
+ public EnuVelocity(int e, int n, int u)\r
+ : this(e * 0.01, n * 0.01, u * 0.01)\r
+ { \r
+ }\r
+\r
+ #endregion\r
+\r
+ #region properties\r
+\r
+ public double E\r
+ {\r
+ get;\r
+ set;\r
+ }\r
+\r
+ public double N\r
+ {\r
+ get;\r
+ set;\r
+ }\r
+\r
+ public double U\r
+ {\r
+ get;\r
+ set;\r
+ }\r
+\r
+ public EcefCoordinate Origin\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+\r
+ #endregion\r
+\r
+ }\r
+}\r
{\r
}\r
\r
- public GeodeticCoordinate(double latitude, double longitude, double altitude)\r
+ public GeodeticCoordinate(\r
+ double latitude, double longitude, double altitude)\r
{\r
Latitude = latitude;\r
Longitude = longitude;\r
: base(sentence, length)\r
{\r
ID = MessageID.NavClock;\r
- \r
- TimeOfWeek = 1e-3m * BitConverter.ToUInt32(sentence, 6 + 0);\r
- ClockBias = 1e-9m * BitConverter.ToInt32(sentence, 6 + 4);\r
- ClockDrift = 1e-9m * BitConverter.ToInt32(sentence, 6 + 8);\r
- TimeAccuracy = 1e-9m * BitConverter.ToUInt32(sentence, 6 + 12);\r
- FrequencyAccuracy = 1e-6m * BitConverter.ToUInt32(sentence, 6 + 16);\r
}\r
\r
#endregion\r
\r
public decimal TimeOfWeek\r
{\r
- get;\r
- private set;\r
+ get\r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 0) * 1e-3m;\r
+ }\r
}\r
\r
public decimal ClockBias\r
{\r
- get;\r
- private set;\r
+ get\r
+ {\r
+ return BitConverter.ToInt32(Raw, 6 + 4) * 1e-9m;\r
+ }\r
}\r
\r
public decimal ClockDrift\r
{\r
- get;\r
- private set;\r
+ get\r
+ {\r
+ return BitConverter.ToInt32(Raw, 6 + 8) * 1e-9m;\r
+ }\r
}\r
\r
public decimal TimeAccuracy\r
{\r
- get;\r
- private set;\r
+ get\r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 12) * 1e-9m;\r
+ }\r
}\r
\r
public decimal FrequencyAccuracy\r
{\r
- get;\r
- private set;\r
+ get\r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 16) * 1e-6m;\r
+ }\r
}\r
\r
#endregion\r
--- /dev/null
+/*\r
+ * Yubeshi GPS Parser\r
+ *\r
+ * This software is distributed under a zlib-style license.\r
+ * See license.txt for more information.\r
+ */\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+\r
+namespace Yubeshi.Ubx\r
+{\r
+ public class NavDop : Packet\r
+ {\r
+ #region constructors\r
+\r
+ public NavDop(byte[] sentence, int length)\r
+ : base(sentence, length)\r
+ {\r
+ ID = MessageID.NavDop;\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region properties\r
+\r
+ public decimal TimeOfWeek\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 0) * 1e-3m;\r
+ }\r
+ }\r
+\r
+ public double Geometric\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt16(Raw, 6 + 4) * 1e-2;\r
+ }\r
+ }\r
+\r
+ public double Position\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt16(Raw, 6 + 6) * 1e-2;\r
+ }\r
+ }\r
+\r
+ public double Time\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt16(Raw, 6 + 8) * 1e-2;\r
+ }\r
+ }\r
+\r
+ public double Vertical\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt16(Raw, 6 + 10) * 1e-2;\r
+ }\r
+ }\r
+\r
+ public double Horizonal\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt16(Raw, 6 + 12) * 1e-2;\r
+ }\r
+ }\r
+\r
+ public double Noarthing\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt16(Raw, 6 + 14) * 1e-2;\r
+ }\r
+ }\r
+\r
+ public double Easting\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt16(Raw, 6 + 16) * 1e-2;\r
+ }\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region public methods\r
+\r
+ public static bool TryParse(byte[] sentence, out UnknownPacket packet)\r
+ {\r
+ return TryParse(sentence, out packet, MessageID.NavDop, 18, Build);\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region private methods\r
+\r
+ private static Packet Build(byte[] sentence, int length)\r
+ {\r
+ return new NavDop(sentence, length);\r
+ }\r
+\r
+ #endregion\r
+ }\r
+}\r
: base(sentence, length)\r
{\r
ID = MessageID.NavPosEcef;\r
- \r
- uint tow = BitConverter.ToUInt32(sentence, 6 + 0);\r
- TimeOfWeek = tow * 1e-3m;\r
- int x = BitConverter.ToInt32(sentence, 6 + 4);\r
- int y = BitConverter.ToInt32(sentence, 6 + 8);\r
- int z = BitConverter.ToInt32(sentence, 6 + 12);\r
- uint acc = BitConverter.ToUInt32(sentence, 6 + 16);\r
- Position = new EcefCoordinate(x, y, z, acc);\r
}\r
\r
#endregion\r
\r
public decimal TimeOfWeek\r
{\r
- get;\r
- private set;\r
+ get\r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 0) * 1e-3m;\r
+ }\r
}\r
\r
public EcefCoordinate Position\r
{\r
- get;\r
- private set;\r
+ get\r
+ {\r
+ int x = BitConverter.ToInt32(Raw, 6 + 4);\r
+ int y = BitConverter.ToInt32(Raw, 6 + 8);\r
+ int z = BitConverter.ToInt32(Raw, 6 + 12);\r
+ uint acc = BitConverter.ToUInt32(Raw, 6 + 16);\r
+ return new EcefCoordinate(x, y, z, acc);\r
+ }\r
}\r
\r
#endregion\r
--- /dev/null
+/*\r
+ * Yubeshi GPS Parser\r
+ *\r
+ * This software is distributed under a zlib-style license.\r
+ * See license.txt for more information.\r
+ */\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+\r
+namespace Yubeshi.Ubx\r
+{\r
+ public class NavPosLlh : Packet\r
+ {\r
+ #region constructors\r
+\r
+ public NavPosLlh(byte[] sentence, int length)\r
+ : base(sentence, length)\r
+ {\r
+ ID = MessageID.NavPosLlh;\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region properties\r
+\r
+ public decimal TimeOfWeek\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 0) * 1e-3m;\r
+ }\r
+ }\r
+\r
+ public GeodeticCoordinate Position\r
+ {\r
+ get\r
+ {\r
+ Degree lon = BitConverter.ToInt32(Raw, 6 + 4) * 1e-7;\r
+ Degree lat = BitConverter.ToInt32(Raw, 6 + 8) * 1e-7;\r
+ double h = BitConverter.ToUInt32(Raw, 6 + 12);\r
+ return new GeodeticCoordinate(lon, lat, h);\r
+ }\r
+ }\r
+\r
+ public double MslHeight\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 16);\r
+ }\r
+ }\r
+\r
+ public double HorizonalAccuracy\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 20) * 1e-3;\r
+ }\r
+ }\r
+\r
+ public double VerticalAccuracy\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 24) * 1e-3;\r
+ }\r
+ }\r
+ #endregion\r
+\r
+ #region public methods\r
+\r
+ public static bool TryParse(byte[] sentence, out UnknownPacket packet)\r
+ {\r
+ return TryParse(sentence, out packet, \r
+ MessageID.NavPosLlh, 28, Build);\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region private methods\r
+\r
+ private static Packet Build(byte[] sentence, int length)\r
+ {\r
+ return new NavPosLlh(sentence, length);\r
+ }\r
+\r
+ #endregion\r
+ }\r
+}\r
--- /dev/null
+/*\r
+ * Yubeshi GPS Parser\r
+ *\r
+ * This software is distributed under a zlib-style license.\r
+ * See license.txt for more information.\r
+ */\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+\r
+namespace Yubeshi.Ubx\r
+{\r
+ public class NavSbas : Packet\r
+ {\r
+ #region type definitions\r
+ public struct SbasStatus\r
+ { \r
+ private byte[] Raw;\r
+ }\r
+ #endregion\r
+\r
+ #region constructors\r
+\r
+ public NavSbas(byte[] sentence, int length)\r
+ : base(sentence, length)\r
+ {\r
+ ID = MessageID.NavSbas;\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region properties\r
+\r
+ public decimal TimeOfWeek\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 0) * 1e-3m;\r
+ }\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region public methods\r
+\r
+ public static bool TryParse(byte[] sentence, out UnknownPacket packet)\r
+ {\r
+ packet = null;\r
+ if (sentence.Length < 12)\r
+ {\r
+ return false;\r
+ }\r
+ int length = 12 + 12 * sentence[6 + 8];\r
+ return TryParse(sentence, out packet, \r
+ MessageID.NavSbas, length, Build);\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region private methods\r
+\r
+ private static Packet Build(byte[] sentence, int length)\r
+ {\r
+ return new NavSbas(sentence, length);\r
+ }\r
+\r
+ #endregion\r
+ }\r
+}\r
: base(sentence, length)\r
{\r
ID = MessageID.NavSol;\r
- \r
- uint tow = BitConverter.ToUInt32(sentence, 6 + 0);\r
- int ftow = BitConverter.ToInt32(sentence, 6 + 4);\r
- TimeOfWeek = tow * 1e-3m + ftow * 1e-9m;\r
- Week = BitConverter.ToInt16(sentence, 6 + 8);\r
- PositionFixType = (GpsFixType)sentence[6 + 10];\r
- FixFlags = (FixStatusFlag)sentence[6 + 11];\r
- int x = BitConverter.ToInt32(sentence, 6 + 12);\r
- int y = BitConverter.ToInt32(sentence, 6 + 16);\r
- int z = BitConverter.ToInt32(sentence, 6 + 20);\r
- uint acc = BitConverter.ToUInt32(sentence, 6 + 24);\r
- Position = new EcefCoordinate(x, y, z, acc);\r
- int vx = BitConverter.ToInt32(sentence, 6 + 28);\r
- int vy = BitConverter.ToInt32(sentence, 6 + 32);\r
- int vz = BitConverter.ToInt32(sentence, 6 + 36);\r
- uint vAcc = BitConverter.ToUInt32(sentence, 6 + 40);\r
- Velocity = new EcefVelocity(vx, vy, vz, vAcc);\r
}\r
\r
#endregion\r
\r
public decimal TimeOfWeek\r
{\r
- get;\r
- private set;\r
+ get\r
+ {\r
+ uint tow = BitConverter.ToUInt32(Raw, 6 + 0);\r
+ int ftow = BitConverter.ToInt32(Raw, 6 + 4);\r
+ return tow * 1e-3m + ftow * 1e-9m;\r
+ }\r
}\r
\r
public int Week\r
{\r
- get;\r
- private set;\r
+ get\r
+ {\r
+ return BitConverter.ToInt16(Raw, 6 + 8);\r
+ }\r
}\r
\r
public GpsFixType PositionFixType\r
{\r
- get;\r
- private set;\r
+ get\r
+ {\r
+ return (GpsFixType)Raw[6 + 10];\r
+ }\r
}\r
\r
public FixStatusFlag FixFlags\r
{\r
- get;\r
- private set;\r
+ get\r
+ {\r
+ return (FixStatusFlag)Raw[6 + 11];\r
+ }\r
}\r
\r
public EcefCoordinate Position\r
{\r
- get;\r
- private set;\r
+ get\r
+ {\r
+ int x = BitConverter.ToInt32(Raw, 6 + 12);\r
+ int y = BitConverter.ToInt32(Raw, 6 + 16);\r
+ int z = BitConverter.ToInt32(Raw, 6 + 20);\r
+ uint acc = BitConverter.ToUInt32(Raw, 6 + 24);\r
+ return new EcefCoordinate(x, y, z, acc);\r
+ }\r
}\r
\r
public EcefVelocity Velocity\r
{\r
- get;\r
- private set;\r
+ get \r
+ {\r
+ int vx = BitConverter.ToInt32(Raw, 6 + 28);\r
+ int vy = BitConverter.ToInt32(Raw, 6 + 32);\r
+ int vz = BitConverter.ToInt32(Raw, 6 + 36);\r
+ uint vAcc = BitConverter.ToUInt32(Raw, 6 + 40);\r
+ return new EcefVelocity(vx, vy, vz, vAcc);\r
+ }\r
}\r
\r
public int SVsUsed\r
: base(sentence, length)\r
{\r
ID = MessageID.NavStatus;\r
- \r
}\r
\r
#endregion\r
--- /dev/null
+/*\r
+ * Yubeshi GPS Parser\r
+ *\r
+ * This software is distributed under a zlib-style license.\r
+ * See license.txt for more information.\r
+ */\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+\r
+namespace Yubeshi.Ubx\r
+{\r
+ public class NavSvInfo : Packet\r
+ {\r
+ #region type definitions\r
+ public struct SvInfo\r
+ { \r
+ private byte[] Raw;\r
+ }\r
+ #endregion\r
+\r
+ #region constructors\r
+\r
+ public NavSvInfo(byte[] sentence, int length)\r
+ : base(sentence, length)\r
+ {\r
+ ID = MessageID.NavSvInfo;\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region properties\r
+\r
+ public decimal TimeOfWeek\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 0) * 1e-3m;\r
+ }\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region public methods\r
+\r
+ public static bool TryParse(byte[] sentence, out UnknownPacket packet)\r
+ {\r
+ packet = null;\r
+ if (sentence.Length < 8)\r
+ {\r
+ return false;\r
+ }\r
+ int length = 8 + 12 * sentence[6 + 4];\r
+ return TryParse(sentence, out packet, \r
+ MessageID.NavSvInfo, length, Build);\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region private methods\r
+\r
+ private static Packet Build(byte[] sentence, int length)\r
+ {\r
+ return new NavSvInfo(sentence, length);\r
+ }\r
+\r
+ #endregion\r
+ }\r
+}\r
--- /dev/null
+/*\r
+ * Yubeshi GPS Parser\r
+ *\r
+ * This software is distributed under a zlib-style license.\r
+ * See license.txt for more information.\r
+ */\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+\r
+namespace Yubeshi.Ubx\r
+{\r
+ public class NavTimeGps : Packet\r
+ {\r
+ #region constructors\r
+\r
+ public NavTimeGps(byte[] sentence, int length)\r
+ : base(sentence, length)\r
+ {\r
+ ID = MessageID.NavTimeGps;\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region properties\r
+\r
+ public decimal TimeOfWeek\r
+ {\r
+ get\r
+ {\r
+ uint tow = BitConverter.ToUInt32(Raw, 6 + 0);\r
+ int ftow = BitConverter.ToInt32(Raw, 6 + 4);\r
+ return tow * 1e-3m + ftow * 1e-9m;\r
+ }\r
+ }\r
+\r
+ public int Week\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToInt16(Raw, 6 + 8);\r
+ }\r
+ }\r
+\r
+ public int LeapSecond\r
+ {\r
+ get\r
+ {\r
+ return (sbyte)(Raw[6 + 10]);\r
+ }\r
+ }\r
+\r
+ public decimal Accuracy\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 12) * 1e-9m;\r
+ }\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region public methods\r
+\r
+ public static bool TryParse(byte[] sentence, out UnknownPacket packet)\r
+ {\r
+ return TryParse(sentence, out packet, \r
+ MessageID.NavTimeGps, 16, Build);\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region private methods\r
+\r
+ private static Packet Build(byte[] sentence, int length)\r
+ {\r
+ return new NavTimeGps(sentence, length);\r
+ }\r
+\r
+ #endregion\r
+ }\r
+}\r
--- /dev/null
+/*\r
+ * Yubeshi GPS Parser\r
+ *\r
+ * This software is distributed under a zlib-style license.\r
+ * See license.txt for more information.\r
+ */\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+\r
+namespace Yubeshi.Ubx\r
+{\r
+ public class NavTimeUtc : Packet\r
+ {\r
+ #region constructors\r
+\r
+ public NavTimeUtc(byte[] sentence, int length)\r
+ : base(sentence, length)\r
+ {\r
+ ID = MessageID.NavTimeUtc;\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region properties\r
+\r
+ public decimal TimeOfWeek\r
+ {\r
+ get\r
+ {\r
+ uint tow = BitConverter.ToUInt32(Raw, 6 + 0);\r
+ int ftow = BitConverter.ToInt32(Raw, 6 + 4);\r
+ return tow * 1e-3m + ftow * 1e-9m;\r
+ }\r
+\r
+ }\r
+\r
+ public int Week\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToInt16(Raw, 6 + 8);\r
+ }\r
+ }\r
+\r
+ public int LeapSecond\r
+ {\r
+ get\r
+ {\r
+ return (sbyte)(Raw[6 + 10]);\r
+ }\r
+ }\r
+\r
+ public decimal Accuracy\r
+ {\r
+ get \r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 12) * 1e-9m;\r
+ }\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region public methods\r
+\r
+ public static bool TryParse(byte[] sentence, out UnknownPacket packet)\r
+ {\r
+ return TryParse(sentence, out packet, \r
+ MessageID.NavTimeGps, 16, Build);\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region private methods\r
+\r
+ private static Packet Build(byte[] sentence, int length)\r
+ {\r
+ return new NavTimeUtc(sentence, length);\r
+ }\r
+\r
+ #endregion\r
+ }\r
+}\r
--- /dev/null
+/*\r
+ * Yubeshi GPS Parser\r
+ *\r
+ * This software is distributed under a zlib-style license.\r
+ * See license.txt for more information.\r
+ */\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+\r
+namespace Yubeshi.Ubx\r
+{\r
+ public class NavVelEcef : Packet\r
+ {\r
+ #region constructors\r
+\r
+ public NavVelEcef(byte[] sentence, int length)\r
+ : base(sentence, length)\r
+ {\r
+ ID = MessageID.NavPosEcef;\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region properties\r
+\r
+ public decimal TimeOfWeek\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 0) * 1e-3m;\r
+ }\r
+ }\r
+\r
+ public EcefVelocity Velocity\r
+ {\r
+ get\r
+ { \r
+ int x = BitConverter.ToInt32(Raw, 6 + 4);\r
+ int y = BitConverter.ToInt32(Raw, 6 + 8);\r
+ int z = BitConverter.ToInt32(Raw, 6 + 12);\r
+ uint acc = BitConverter.ToUInt32(Raw, 6 + 16);\r
+ return new EcefVelocity(x, y, z, acc);\r
+ }\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region public methods\r
+\r
+ public static bool TryParse(byte[] sentence, out UnknownPacket packet)\r
+ {\r
+ return TryParse(sentence, out packet, \r
+ MessageID.NavVelEcef, 20, Build);\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region private methods\r
+\r
+ private static Packet Build(byte[] sentence, int length)\r
+ {\r
+ return new NavVelEcef(sentence, length);\r
+ }\r
+\r
+ #endregion\r
+ }\r
+}\r
--- /dev/null
+/*\r
+ * Yubeshi GPS Parser\r
+ *\r
+ * This software is distributed under a zlib-style license.\r
+ * See license.txt for more information.\r
+ */\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+\r
+namespace Yubeshi.Ubx\r
+{\r
+ public class NavVelNed : Packet\r
+ {\r
+ #region constructors\r
+\r
+ public NavVelNed(byte[] sentence, int length)\r
+ : base(sentence, length)\r
+ {\r
+ ID = MessageID.NavVelNed;\r
+\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region properties\r
+\r
+ public decimal TimeOfWeek\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 0) * 1e-3m;\r
+ }\r
+ }\r
+\r
+ public EnuVelocity Velocity\r
+ {\r
+ get\r
+ {\r
+ int n = BitConverter.ToInt32(Raw, 6 + 4);\r
+ int e = BitConverter.ToInt32(Raw, 6 + 8);\r
+ int d = -BitConverter.ToInt32(Raw, 6 + 12);\r
+ return new EnuVelocity(e, n, -d);\r
+ }\r
+ }\r
+\r
+ public double Speed\r
+ {\r
+ get\r
+ {\r
+ return BitConverter.ToUInt32(Raw, 6 + 16);\r
+ }\r
+ }\r
+\r
+ public double GroundSpeed\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+\r
+ public Degree Heading\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region public methods\r
+\r
+ public static bool TryParse(byte[] sentence, out UnknownPacket packet)\r
+ {\r
+ return TryParse(sentence, out packet, \r
+ MessageID.NavVelNed, 36, Build);\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region private methods\r
+\r
+ private static Packet Build(byte[] sentence, int length)\r
+ {\r
+ return new NavVelNed(sentence, length);\r
+ }\r
+\r
+ #endregion\r
+ }\r
+}\r
#endregion\r
\r
#region fields\r
+ public static readonly byte[] SyncCharacters = \r
+ new byte[] { 0xB5, 0x62 };\r
public const byte SyncCharacter1 = 0xB5;\r
public const byte SyncCharacter2 = 0x62;\r
#endregion\r
<Compile Include="Ubx\Parser.cs" />\r
<Compile Include="Ubx\Unknown.cs" />\r
<Compile Include="Ubx\NavStatus.cs" />\r
+ <Compile Include="Ubx\NavPosLlh.cs" />\r
+ <Compile Include="Ubx\NavDop.cs" />\r
+ <Compile Include="Ubx\NavVelEcef.cs" />\r
+ <Compile Include="Ubx\NavVelNed.cs" />\r
+ <Compile Include="Ubx\NavTimeGps.cs" />\r
+ <Compile Include="Ubx\NavTimeUtc.cs" />\r
+ <Compile Include="Ubx\NavSvInfo.cs" />\r
+ <Compile Include="Ubx\NavSbas.cs" />\r
<Compile Include="UnknownPacket.cs" />\r
+ <Compile Include="EnuVelocity.cs" />\r
</ItemGroup>\r
<ItemGroup>\r
<None Include="app.config" />\r
\r
namespace YubeshiTest.UbxTest\r
{\r
- class MyPacket : Unknown\r
+ class MyPacket : Packet\r
{\r
#region constructors\r
\r
\r
class NavPacketTest\r
{\r
+ private readonly decimal timeOfWeek = \r
+ new TimeSpan(1, 23, 45, 6, 789).Ticks * 1e-7m;\r
+ private readonly decimal timeOfWeekHD =\r
+ new TimeSpan(1, 23, 45, 6, 789).Ticks * 1e-7m + 012345e-9m;\r
+\r
[Test]\r
public void NavClockTest()\r
{\r
UnknownPacket packet;\r
Assert.IsTrue(NavClock.TryParse(P.NavClock, out packet));\r
NavClock p = packet as NavClock;\r
+ Assert.AreEqual(Packet.MessageID.NavClock, p.ID);\r
+ }\r
+\r
+ [Test]\r
+ public void NavDopTest()\r
+ {\r
+ UnknownPacket packet;\r
+ Assert.IsTrue(NavDop.TryParse(P.NavDop, out packet));\r
+ NavDop p = packet as NavDop;\r
+ Assert.AreEqual(Packet.MessageID.NavDop, p.ID);\r
}\r
\r
[Test]\r
public void NavPosEcefTest()\r
{\r
- UnknownPacket p;\r
- Assert.IsTrue(NavPosEcef.TryParse(P.NavPosEcef, out p));\r
+ UnknownPacket packet;\r
+ Assert.IsTrue(NavPosEcef.TryParse(P.NavPosEcef, out packet));\r
+ NavPosEcef p = packet as NavPosEcef;\r
+ Assert.AreEqual(Packet.MessageID.NavPosEcef, p.ID);\r
}\r
\r
[Test]\r
UnknownPacket packet;\r
Assert.IsTrue(NavSol.TryParse(P.NavSol, out packet));\r
NavSol p = packet as NavSol;\r
+ Assert.AreEqual(Packet.MessageID.NavSol, p.ID);\r
+ Assert.AreEqual(timeOfWeekHD, p.TimeOfWeek);\r
Assert.AreEqual(-3961181.33, p.Position.X);\r
Assert.AreEqual(3346187.67, p.Position.Y);\r
Assert.AreEqual(3702487.20, p.Position.Z);\r
public static readonly byte[] UserDefined;\r
\r
public static readonly byte[] NavClock;\r
+ public static readonly byte[] NavDop;\r
public static readonly byte[] NavPosEcef;\r
public static readonly byte[] NavSol;\r
\r
\r
NavClock = new byte[]{\r
0xB5, 0x62, 0x01, 0x22, 0x14, 0x00, \r
- 0x70, 0xAA, 0xB4, 0x12, \r
+ 0xE5, 0x16, 0x3F, 0x0A, // tow\r
0x3C, 0xDA, 0x06, 0x00, \r
0x48, 0x01, 0x00, 0x00, \r
0x4E, 0x00, 0x00, 0x00, \r
0xFF, 0xFF\r
};\r
\r
+ NavDop = new byte[]{\r
+ 0xB5, 0x62, 0x01, 0x04, 0x12, 0x00, \r
+ 0xE5, 0x16, 0x3F, 0x0A, // tow\r
+ 0x00, 0x00, // geometric\r
+ 0x00, 0x00, // position\r
+ 0x00, 0x00, // time\r
+ 0x00, 0x00, // vertical\r
+ 0x00, 0x00, // horizonal\r
+ 0x00, 0x00, // northing\r
+ 0x00, 0x00, // easting\r
+ 0xFF, 0xFF\r
+ };\r
+\r
NavPosEcef = new byte[]{\r
0xB5, 0x62, 0x01, 0x01, 0x14, 0x00,\r
- 0x70, 0xAA, 0xF1, 0x13, // tow\r
+ 0xE5, 0x16, 0x3F, 0x0A, // tow\r
0x8B, 0xB7, 0x63, 0xE8, // x\r
0x8F, 0xE0, 0xF1, 0x13, // y\r
0x10, 0x8C, 0x11, 0x16, // z\r
\r
NavSol = new byte[]{\r
0xB5, 0x62, 0x01, 0x06, 0x34, 0x00,\r
- 0x70, 0xAA, 0xF1, 0x13, // tow\r
- 0xC2, 0x0B, 0xFD, 0xFF,\r
+ 0xE5, 0x16, 0x3F, 0x0A, // tow\r
+ 0x39, 0x30, 0x00, 0x00, // ftow\r
0x4E, 0x06,\r
0x02,\r
0x5D,\r