OSDN Git Service

境界チェック不具合修正,UBX特化の座標コンストラクタ廃止,パケット実装の拡充と修正
[yubeshi/yubeshi.git] / Yubeshi / Ubx / NavSvInfo.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 class NavSvInfo : Packet\r
15     {\r
16         #region type definitions\r
17 \r
18         public enum ChipGeneration : byte\r
19         {\r
20             Antaris = 0,\r
21             Ublox5 = 1,\r
22             Ublox6 = 2,\r
23         }\r
24 \r
25         public struct SvInfo\r
26         { \r
27 \r
28             [Flags]\r
29             public enum Status : byte\r
30             {\r
31                 SvUsed = 0x01,\r
32                 DifferentialCorrection = 0x02,\r
33                 OrbitInformation = 0x04,\r
34                 Ephemeris = 0x08,\r
35                 Unhealthy = 0x10,\r
36                 AlmanacPlus = 0x20,\r
37                 AutonomousOrbitPrediction = 0x40,\r
38             }\r
39 \r
40             private byte[] Raw;\r
41 \r
42             public int Channel\r
43             {\r
44                 get \r
45                 { \r
46                     return Raw[0];\r
47                 }\r
48             }\r
49 \r
50             public int SatelliteID\r
51             {\r
52                 get\r
53                 {\r
54                     return Raw[1];\r
55                 }\r
56             }\r
57 \r
58             public Status StatusFlags\r
59             {\r
60                 get\r
61                 {\r
62                     return (Status)Raw[2];\r
63                 }\r
64             }\r
65 \r
66             public int Quality\r
67             {\r
68                 get\r
69                 {\r
70                     return Raw[3] & 0x0F;\r
71                 }\r
72             }\r
73 \r
74             public int SignalStrength\r
75             {\r
76                 get\r
77                 {\r
78                     return Raw[4];\r
79                 }\r
80             }\r
81 \r
82             public Degree Elevation\r
83             {\r
84                 get\r
85                 {\r
86                     return (sbyte)(Raw[5]);\r
87                 }\r
88             }\r
89 \r
90             public Degree Azimuth\r
91             {\r
92                 get\r
93                 {\r
94                     return BitConverter.ToInt16(Raw, 6);\r
95                 }\r
96             }\r
97 \r
98             public double PseudoRangeResidual\r
99             {\r
100                 get\r
101                 {\r
102                     return BitConverter.ToInt32(Raw, 8) * 0.01;\r
103                 }\r
104             }\r
105 \r
106             public void Set(byte[] raw)\r
107             {\r
108                 Raw = raw;\r
109             }\r
110         }\r
111         #endregion\r
112 \r
113         #region constructors\r
114 \r
115         public NavSvInfo(byte[] sentence, int length)\r
116             : base(sentence, length)\r
117         {\r
118             SvInformation = new SvInfo[NumberOfChannels];\r
119             for (int i = 0; i < NumberOfChannels; ++i)\r
120             {\r
121                 SvInformation[i].Set(\r
122                                 OctetString.Substring(Raw, 14 + 12 * i, 12));\r
123             }\r
124         }\r
125 \r
126         #endregion\r
127 \r
128         #region properties\r
129 \r
130         public decimal TimeOfWeek\r
131         {\r
132             get\r
133             {\r
134                 return BitConverter.ToUInt32(Raw, 6 + 0) * 1e-3m;\r
135             }\r
136         }\r
137 \r
138         public int NumberOfChannels\r
139         {\r
140             get\r
141             {\r
142                 return Raw[6 + 4];\r
143             }\r
144         }\r
145 \r
146         public ChipGeneration Chip\r
147         {\r
148             get\r
149             {\r
150                 return (ChipGeneration)(Raw[6 + 5] & 0x7);\r
151             }\r
152         }\r
153 \r
154         public SvInfo[] SvInformation\r
155         {\r
156             get;\r
157             private set;\r
158         }\r
159 \r
160         #endregion\r
161 \r
162         #region public methods\r
163 \r
164         public static bool TryParse(byte[] sentence, out UnknownPacket packet)\r
165         {\r
166             packet = null;\r
167             if (sentence.Length < 16)\r
168             {\r
169                 return false;\r
170             }\r
171             int length = 8 + 12 * sentence[6 + 4];\r
172             return TryParse(sentence, out packet, \r
173                                         MessageID.NavSvInfo, length, Build);\r
174         }\r
175 \r
176         #endregion\r
177 \r
178         #region private methods\r
179 \r
180         private static Packet Build(byte[] sentence, int length)\r
181         {\r
182             return new NavSvInfo(sentence, length);\r
183         }\r
184 \r
185         #endregion\r
186     }\r
187 }\r