OSDN Git Service

Ubxパケットの部分的実装
[yubeshi/yubeshi.git] / Yubeshi / Ubx / Packet.cs
1 /*\r
2  *      Yubeshi GPS Parser\r
3  *\r
4  *      This software is distributed under a zlib-style license.\r
5  *      See license.txt for more information.\r
6  */\r
7 \r
8 using System;\r
9 using System.Collections.Generic;\r
10 using System.Text;\r
11 \r
12 namespace Yubeshi.Ubx\r
13 {\r
14     public abstract class Packet : UnknownPacket\r
15     {\r
16         #region type definitions\r
17 \r
18         protected delegate Packet PacketBuilder(byte[] sentence, int length);\r
19 \r
20         public enum MessageClass\r
21         { \r
22             /// <summary>\r
23             ///     Navigation\r
24             /// </summary>\r
25             Nav = 0x01,\r
26             /// <summary>\r
27             ///     Reciever Manager\r
28             /// </summary>\r
29             Rxm = 0x02,\r
30             Inf = 0x04,\r
31             Ack = 0x05,\r
32             Cfg = 0x06,\r
33             Mon = 0x0A,\r
34             Aid = 0x0B,\r
35             Tim = 0x0D,\r
36         }\r
37 \r
38         public enum MessageID\r
39         {\r
40             NavPosEcef = 0x0101,\r
41             NavPosLlh = 0x0102,\r
42             NavStatus = 0x0103,\r
43             NavDop = 0x0104,\r
44             NavSol = 0x0105,\r
45             NavVelEcef = 0x0111,\r
46             NavVelNed = 0x0112,\r
47             NavTimeGps = 0x0120,\r
48             NavTimeUtc = 0x0121,\r
49             NavClock = 0x0122,\r
50             NavSvInfo = 0x0130,\r
51             NavSbas = 0x0132,\r
52         }\r
53         \r
54         #endregion\r
55 \r
56         \r
57         #region constructors\r
58         \r
59         #endregion\r
60 \r
61         #region properties\r
62 \r
63         public MessageClass Class\r
64         {\r
65             get;\r
66             protected set;\r
67         }\r
68 \r
69         public MessageID ID\r
70         {\r
71             get;\r
72             protected set;\r
73         }\r
74 \r
75         public int CheckSum\r
76         {\r
77             get;\r
78             protected set;\r
79         }\r
80         \r
81         #endregion\r
82 \r
83         #region protected methods\r
84 \r
85         protected static bool TryParse(byte[] sentence, out Packet packet,\r
86                         MessageID id, int fixedLength, PacketBuilder builder)\r
87         {\r
88             packet = null;\r
89             if (sentence.Length < 8)\r
90             {\r
91                 return false;\r
92             }\r
93             if (sentence[0] != 0xB5 || sentence[1] != 0x62)\r
94             {\r
95                 return false;\r
96             }\r
97             int messageId = sentence[2] << 8 | sentence[3];\r
98             if ((int)id != messageId)\r
99             {\r
100                 return false;\r
101             }\r
102             int length = sentence[5] << 8 | sentence[4];\r
103             if (length > 0 && fixedLength != length)\r
104             {\r
105                 return false;\r
106             }\r
107             if (sentence.Length < length + 8)\r
108             {\r
109                 return false;\r
110             }\r
111             try\r
112             {\r
113                 packet = builder(sentence, length);\r
114             }\r
115             catch\r
116             {\r
117                 packet = null;\r
118                 return false;\r
119             }\r
120             return true;\r
121         }\r
122 \r
123         \r
124         #endregion\r
125 \r
126 \r
127     }\r
128 }\r