OSDN Git Service

NAVパケットの整理・スタブ作成
authorkimikage <kimikage_ceo@hotmail.com>
Fri, 28 Jan 2011 08:58:25 +0000 (17:58 +0900)
committerkimikage <kimikage_ceo@hotmail.com>
Fri, 28 Jan 2011 08:58:25 +0000 (17:58 +0900)
20 files changed:
Yubeshi/EcefVelocity.cs
Yubeshi/EnuVelocity.cs [new file with mode: 0755]
Yubeshi/GeodeticCoordinate.cs
Yubeshi/Ubx/NavClock.cs
Yubeshi/Ubx/NavDop.cs [new file with mode: 0755]
Yubeshi/Ubx/NavPosEcef.cs
Yubeshi/Ubx/NavPosLlh.cs [new file with mode: 0755]
Yubeshi/Ubx/NavSbas.cs [new file with mode: 0755]
Yubeshi/Ubx/NavSol.cs
Yubeshi/Ubx/NavStatus.cs
Yubeshi/Ubx/NavSvInfo.cs [new file with mode: 0755]
Yubeshi/Ubx/NavTimeGps.cs [new file with mode: 0755]
Yubeshi/Ubx/NavTimeUtc.cs [new file with mode: 0755]
Yubeshi/Ubx/NavVelEcef.cs [new file with mode: 0755]
Yubeshi/Ubx/NavVelNed.cs [new file with mode: 0755]
Yubeshi/Ubx/Packet.cs
Yubeshi/Yubeshi.csproj
YubeshiTest/UbxTest/MyPacket.cs
YubeshiTest/UbxTest/NavPacketTest.cs
YubeshiTest/UbxTest/SamplePackets.cs

index 49cbb00..5f3a7f8 100755 (executable)
@@ -10,33 +10,45 @@ namespace Yubeshi
         /// <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
@@ -47,6 +59,14 @@ namespace Yubeshi
             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
diff --git a/Yubeshi/EnuVelocity.cs b/Yubeshi/EnuVelocity.cs
new file mode 100755 (executable)
index 0000000..8f3330f
--- /dev/null
@@ -0,0 +1,66 @@
+/*\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
index fdd0a1b..7eaabb0 100755 (executable)
@@ -27,7 +27,8 @@ namespace Yubeshi
         {\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
index f577050..333cc3d 100755 (executable)
@@ -19,12 +19,6 @@ namespace Yubeshi.Ubx
             : 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
@@ -33,32 +27,42 @@ namespace Yubeshi.Ubx
 \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
diff --git a/Yubeshi/Ubx/NavDop.cs b/Yubeshi/Ubx/NavDop.cs
new file mode 100755 (executable)
index 0000000..ea65026
--- /dev/null
@@ -0,0 +1,112 @@
+/*\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
index 7111493..333c37a 100755 (executable)
@@ -19,14 +19,6 @@ namespace Yubeshi.Ubx
             : 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
@@ -35,14 +27,22 @@ namespace Yubeshi.Ubx
 \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
diff --git a/Yubeshi/Ubx/NavPosLlh.cs b/Yubeshi/Ubx/NavPosLlh.cs
new file mode 100755 (executable)
index 0000000..ee25cc2
--- /dev/null
@@ -0,0 +1,91 @@
+/*\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
diff --git a/Yubeshi/Ubx/NavSbas.cs b/Yubeshi/Ubx/NavSbas.cs
new file mode 100755 (executable)
index 0000000..6ac7690
--- /dev/null
@@ -0,0 +1,70 @@
+/*\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
index 3f09b39..e61e805 100755 (executable)
@@ -19,23 +19,6 @@ namespace Yubeshi.Ubx
             : 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
@@ -44,38 +27,60 @@ namespace Yubeshi.Ubx
 \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
index cbb30a5..d95e7aa 100755 (executable)
@@ -33,7 +33,6 @@ namespace Yubeshi.Ubx
             : base(sentence, length)\r
         {\r
             ID = MessageID.NavStatus;\r
-            \r
         }\r
 \r
         #endregion\r
diff --git a/Yubeshi/Ubx/NavSvInfo.cs b/Yubeshi/Ubx/NavSvInfo.cs
new file mode 100755 (executable)
index 0000000..b0f0443
--- /dev/null
@@ -0,0 +1,70 @@
+/*\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
diff --git a/Yubeshi/Ubx/NavTimeGps.cs b/Yubeshi/Ubx/NavTimeGps.cs
new file mode 100755 (executable)
index 0000000..b3bfc19
--- /dev/null
@@ -0,0 +1,83 @@
+/*\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
diff --git a/Yubeshi/Ubx/NavTimeUtc.cs b/Yubeshi/Ubx/NavTimeUtc.cs
new file mode 100755 (executable)
index 0000000..8e02e30
--- /dev/null
@@ -0,0 +1,84 @@
+/*\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
diff --git a/Yubeshi/Ubx/NavVelEcef.cs b/Yubeshi/Ubx/NavVelEcef.cs
new file mode 100755 (executable)
index 0000000..ded8091
--- /dev/null
@@ -0,0 +1,69 @@
+/*\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
diff --git a/Yubeshi/Ubx/NavVelNed.cs b/Yubeshi/Ubx/NavVelNed.cs
new file mode 100755 (executable)
index 0000000..cc8b093
--- /dev/null
@@ -0,0 +1,89 @@
+/*\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
index f22f1ae..4418ccd 100755 (executable)
@@ -69,6 +69,8 @@ namespace Yubeshi.Ubx
         #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
index 7dae067..91c888d 100755 (executable)
     <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
index 14a459f..f2c4ee4 100755 (executable)
@@ -13,7 +13,7 @@ using Yubeshi.Ubx;
 \r
 namespace YubeshiTest.UbxTest\r
 {\r
-    class MyPacket : Unknown\r
+    class MyPacket : Packet\r
     {\r
         #region constructors\r
 \r
index 4b66701..333ab8e 100755 (executable)
@@ -18,19 +18,36 @@ namespace YubeshiTest.UbxTest
 \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
@@ -39,6 +56,8 @@ namespace YubeshiTest.UbxTest
             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
index 9740fe8..ca45687 100755 (executable)
@@ -17,6 +17,7 @@ namespace YubeshiTest.UbxTest
         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
@@ -39,7 +40,7 @@ namespace YubeshiTest.UbxTest
 \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
@@ -47,9 +48,22 @@ namespace YubeshiTest.UbxTest
                 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
@@ -59,8 +73,8 @@ namespace YubeshiTest.UbxTest
 \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