gpParsers["GRS"] = GpGrs.TryParse;\r
gpParsers["GSA"] = GpGsa.TryParse;\r
}\r
+\r
#endregion\r
\r
#region public method\r
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
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
--- /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 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
\r
public enum MessageID : ushort\r
{\r
+ Unknown = 0x0000,\r
NavPosEcef = 0x0101,\r
NavPosLlh = 0x0102,\r
NavStatus = 0x0103,\r
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
--- /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 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
--- /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 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
<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
--- /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
+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
<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