OSDN Git Service

パーサの機能追加とその準備
authorkimikage <kimikage_ceo@hotmail.com>
Mon, 27 Dec 2010 03:04:52 +0000 (12:04 +0900)
committerkimikage <kimikage_ceo@hotmail.com>
Mon, 27 Dec 2010 03:04:52 +0000 (12:04 +0900)
Yubeshi/Nmea/Parser.cs
Yubeshi/Parser.cs
Yubeshi/Ubx/NavStatus.cs [new file with mode: 0755]
Yubeshi/Ubx/Packet.cs
Yubeshi/Ubx/Parser.cs [new file with mode: 0755]
Yubeshi/Ubx/Unknown.cs [new file with mode: 0755]
Yubeshi/Yubeshi.csproj
YubeshiTest/Ubx/ParserTest.cs [new file with mode: 0755]
YubeshiTest/YubeshiTest.csproj

index 013f853..1749479 100755 (executable)
@@ -35,6 +35,7 @@ namespace Yubeshi.Nmea
             gpParsers["GRS"] = GpGrs.TryParse;\r
             gpParsers["GSA"] = GpGsa.TryParse;\r
         }\r
+\r
         #endregion\r
 \r
         #region public method\r
@@ -63,6 +64,18 @@ namespace Yubeshi.Nmea
             return false;\r
         }\r
 \r
+        public static int SearchSyncFrom(byte[] input)\r
+        {\r
+            for (int i = 0; i < input.Length; ++i)\r
+            {\r
+                if (input[i] == '$')\r
+                {\r
+                    return i;\r
+                }\r
+            }\r
+            return -1;\r
+        }\r
+\r
         #endregion\r
     }\r
 }\r
index 2beb51c..1897200 100755 (executable)
@@ -8,10 +8,77 @@
 using System;\r
 using System.Collections.Generic;\r
 using System.Text;\r
+using System.IO;\r
 \r
 namespace Yubeshi\r
 {\r
     public class Parser\r
     {\r
+        #region fields\r
+        private MemoryStream unknown;\r
+        private MemoryStream buffer;\r
+        private List<UnknownPacket> packets;\r
+        #endregion\r
+\r
+        #region constructors\r
+        public Parser()\r
+        {\r
+            unknown = new MemoryStream();\r
+            buffer = new MemoryStream();\r
+            packets = new List<UnknownPacket>();\r
+        }\r
+        #endregion\r
+\r
+        #region public methods\r
+\r
+        public void Push(byte[] fragment)\r
+        {\r
+            buffer.Write(fragment, 0, fragment.Length);\r
+        }\r
+        public UnknownPacket Peek()\r
+        {\r
+            UnknownPacket packet = null;\r
+            const long workLength = 1024;\r
+            long i = 0;\r
+            while (i < buffer.Length)\r
+            {\r
+                /*\r
+                int length = (int)Math.Min(buffer.Length - i, workLength);\r
+                byte[] work = new byte[length];\r
+                if (buffer.Read(work, 0, length) != 0)\r
+                { \r
+                    throw new Exception();\r
+                }\r
+                int indexOfSync = Nmea.Parser.SearchSyncFrom(work);\r
+                if (indexOfSync > 0)\r
+                {\r
+                    byte[] synced = new byte[length - indexOfSync];\r
+                    Array.Copy(work, indexOfSync, synced, 0, synced.Length);\r
+                    if (Nmea.Parser.TryParse(synced, out packet))\r
+                    {\r
+                    }\r
+\r
+                }\r
+                */\r
+                i += workLength;\r
+            }\r
+            \r
+            return packet;\r
+        }\r
+\r
+        public static bool TryParse(byte[] sentence, out UnknownPacket packet)\r
+        {\r
+            if (Nmea.Parser.TryParse(sentence, out packet))\r
+            {\r
+                return true;\r
+            }\r
+            if (Ubx.Parser.TryParse(sentence, out packet))\r
+            {\r
+                return true;\r
+            }\r
+            packet = null;\r
+            return false;\r
+        }\r
+        #endregion\r
     }\r
 }\r
diff --git a/Yubeshi/Ubx/NavStatus.cs b/Yubeshi/Ubx/NavStatus.cs
new file mode 100755 (executable)
index 0000000..ff89678
--- /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 NavStatus : Packet\r
+    {\r
+        #region type definition\r
+        [Flags]\r
+        public enum NavigationStatus : byte\r
+        {\r
+            \r
+        }\r
+        #endregion\r
+\r
+        #region fields\r
+        \r
+        private NavigationStatus flags;\r
+\r
+        #endregion\r
+        \r
+        #region constructors\r
+\r
+        public NavStatus(byte[] sentence, int length)\r
+            : base(sentence, length)\r
+        {\r
+            ID = MessageID.NavStatus;\r
+            \r
+        }\r
+\r
+        #endregion\r
+\r
+        #region properties\r
+\r
+        public GpsFixType PositionFixType\r
+        {\r
+            get;\r
+            private set;\r
+        }\r
+\r
+        #endregion\r
+\r
+        #region public methods\r
+\r
+        public static bool TryParse(byte[] sentence, out Packet packet)\r
+        {\r
+            return TryParse(sentence, out packet, MessageID.NavSol, 52, Build);\r
+        }\r
+\r
+        #endregion\r
+\r
+        #region private methods\r
+\r
+        private static Packet Build(byte[] sentence, int length)\r
+        {\r
+            return new NavSol(sentence, length);\r
+        }\r
+\r
+        #endregion\r
+    }\r
+}\r
index f620d45..3a68967 100755 (executable)
@@ -37,6 +37,7 @@ namespace Yubeshi.Ubx
 \r
         public enum MessageID : ushort\r
         {\r
+            Unknown = 0x0000,\r
             NavPosEcef = 0x0101,\r
             NavPosLlh = 0x0102,\r
             NavStatus = 0x0103,\r
@@ -122,7 +123,7 @@ namespace Yubeshi.Ubx
                 return false;\r
             }\r
             int messageId = sentence[2] << 8 | sentence[3];\r
-            if ((int)id != messageId)\r
+            if ((int)id != messageId && id != MessageID.Unknown)\r
             {\r
                 return false;\r
             }\r
diff --git a/Yubeshi/Ubx/Parser.cs b/Yubeshi/Ubx/Parser.cs
new file mode 100755 (executable)
index 0000000..fcb85b4
--- /dev/null
@@ -0,0 +1,81 @@
+/*\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 Parser : Yubeshi.Parser\r
+    {\r
+        #region type definitions\r
+        delegate bool TrialParser(byte[] sentence, out Packet packet);\r
+        #endregion\r
+\r
+        #region fields\r
+\r
+        private static Dictionary<Packet.MessageID, TrialParser> parsers;\r
+        private static Encoding ascii = Encoding.ASCII;\r
+\r
+        #endregion\r
+\r
+        #region constructors\r
+        static Parser()\r
+        {\r
+            parsers = new Dictionary<Packet.MessageID, TrialParser>();\r
+            parsers[Packet.MessageID.NavClock] = NavClock.TryParse;\r
+            parsers[Packet.MessageID.NavPosEcef] = NavPosEcef.TryParse;\r
+            parsers[Packet.MessageID.NavSol] = NavSol.TryParse;\r
+            parsers[Packet.MessageID.NavStatus] = NavStatus.TryParse;\r
+        }\r
+        #endregion\r
+\r
+        #region public method\r
+\r
+        public static bool TryParse(byte[] sentence, out Packet packet)\r
+        {\r
+            packet = null;\r
+            if (sentence.Length < 8)\r
+            {\r
+                return false;\r
+            }\r
+            if (sentence[0] != 0xB5 || sentence[1] != 0x62)\r
+            {\r
+                return false;\r
+            }\r
+            Packet.MessageID messageId = \r
+                            (Packet.MessageID)(sentence[2] << 8 | sentence[3]);\r
+            if (parsers.ContainsKey(messageId))\r
+            {\r
+                return parsers[messageId](sentence, out packet);\r
+            }\r
+            return Unknown.TryParse(sentence, out packet);\r
+        }\r
+\r
+        public static int SearchSyncFrom(byte[] input)\r
+        {\r
+            for (int i = 0; i < input.Length; ++i)\r
+            {\r
+                if (input[i] == 0xB5)\r
+                {\r
+                    if (i + 1 == input.Length)\r
+                    {\r
+                        return i;\r
+                    }\r
+                    if (input[i + 1] == 0x62)\r
+                    {\r
+                        return i;\r
+                    }\r
+                }\r
+            }\r
+            return -1;\r
+        }\r
+\r
+        #endregion\r
+    }\r
+}\r
diff --git a/Yubeshi/Ubx/Unknown.cs b/Yubeshi/Ubx/Unknown.cs
new file mode 100755 (executable)
index 0000000..e767598
--- /dev/null
@@ -0,0 +1,48 @@
+/*\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 Unknown : Packet\r
+    {\r
+        #region constructors\r
+\r
+        public Unknown(byte[] sentence, int length)\r
+            : base(sentence, length)\r
+        {\r
+            ID = (MessageID)(sentence[2] << 8 | sentence[3]);\r
+        }\r
+\r
+        #endregion\r
+\r
+        #region properties\r
+\r
+        #endregion\r
+\r
+        #region public methods\r
+\r
+        public static bool TryParse(byte[] sentence, out Packet packet)\r
+        {\r
+            return TryParse(sentence, out packet, MessageID.Unknown, 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 Unknown(sentence, length);\r
+        }\r
+\r
+        #endregion\r
+    }\r
+}\r
index 6844559..abb535a 100755 (executable)
@@ -57,6 +57,9 @@
     <Compile Include="Ubx\Packet.cs" />\r
     <Compile Include="Ubx\NavSol.cs" />\r
     <Compile Include="Ubx\NavClock.cs" />\r
+    <Compile Include="Ubx\Parser.cs" />\r
+    <Compile Include="Ubx\Unknown.cs" />\r
+    <Compile Include="Ubx\NavStatus.cs" />\r
     <Compile Include="UnknownPacket.cs" />\r
   </ItemGroup>\r
   <ItemGroup>\r
diff --git a/YubeshiTest/Ubx/ParserTest.cs b/YubeshiTest/Ubx/ParserTest.cs
new file mode 100755 (executable)
index 0000000..a1429cc
--- /dev/null
@@ -0,0 +1,39 @@
+/*\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
+using NUnit.Framework;\r
+using Yubeshi.Ubx;\r
+using P = YubeshiTest.Ubx.SamplePackets;\r
+\r
+namespace YubeshiTest.Ubx\r
+{\r
+\r
+    class ParserTest\r
+    {\r
+        [Test]\r
+        public void TryParse()\r
+        { \r
+            Packet p;\r
+\r
+            Assert.AreEqual(false, Parser.TryParse(P.Dummy, out p));\r
+            Assert.AreEqual(null, p);\r
+\r
+            Assert.AreEqual(true, Parser.TryParse(P.NavClock, out p));\r
+            Assert.AreEqual(typeof(NavClock), p.GetType());\r
+\r
+            Assert.AreEqual(true, Parser.TryParse(P.NavPosEcef, out p));\r
+            Assert.AreEqual(typeof(NavPosEcef), p.GetType());\r
+\r
+            Assert.AreEqual(true, Parser.TryParse(P.NavSol, out p));\r
+            Assert.AreEqual(typeof(NavSol), p.GetType());\r
+\r
+        }\r
+    }\r
+}\r
index 4c8cfc6..cce69be 100755 (executable)
@@ -51,6 +51,7 @@
     <Compile Include="ParserTest.cs" />\r
     <Compile Include="Properties\AssemblyInfo.cs" />\r
     <Compile Include="Ubx\NavPacketTest.cs" />\r
+    <Compile Include="Ubx\ParserTest.cs" />\r
     <Compile Include="Ubx\SamplePackets.cs" />\r
   </ItemGroup>\r
   <ItemGroup>\r