OSDN Git Service

境界チェック不具合修正,UBX特化の座標コンストラクタ廃止,パケット実装の拡充と修正
[yubeshi/yubeshi.git] / Yubeshi / Ubx / RxmRaw.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 RxmRaw : Packet\r
15     {\r
16         #region type definitions\r
17         public struct MeasurementData\r
18         { \r
19             public byte[] Raw\r
20             {\r
21                 get;\r
22                 private set;\r
23             }\r
24 \r
25             public double CarrierPhase\r
26             {\r
27                 get\r
28                 {\r
29                     return BitConverter.ToDouble(Raw, 0);\r
30                 }\r
31             }\r
32 \r
33             public double Pseudorange\r
34             {\r
35                 get\r
36                 {\r
37                     return BitConverter.ToDouble(Raw, 8);\r
38                 }\r
39             }\r
40 \r
41             public double Doppler\r
42             {\r
43                 get\r
44                 {\r
45                     return BitConverter.ToSingle(Raw, 16);\r
46                 }\r
47             }\r
48 \r
49             public uint SpaceVehicleNumber\r
50             {\r
51                 get\r
52                 {\r
53                     return Raw[20];\r
54                 }\r
55             }\r
56 \r
57             public int QualityIndicator\r
58             {\r
59                 get\r
60                 {\r
61                     return (sbyte)Raw[21];\r
62                 }\r
63             }\r
64 \r
65             public int SignalStrength\r
66             {\r
67                 get\r
68                 {\r
69                     return (sbyte)Raw[22];\r
70                 }\r
71             }\r
72 \r
73             public int LossOfLockIndicator\r
74             {\r
75                 get\r
76                 {\r
77                     return Raw[23];\r
78                 }\r
79             }\r
80 \r
81 \r
82             public void Set(byte[] raw)\r
83             {\r
84                 Raw = raw;\r
85             }\r
86         }\r
87         #endregion\r
88 \r
89         #region constructors\r
90 \r
91         public RxmRaw(byte[] sentence, int length)\r
92             : base(sentence, length)\r
93         {\r
94             Data = new MeasurementData[NumberOfSatelites];\r
95             for (int i = 0; i < Data.Length; ++i)\r
96             {\r
97                 Data[i].Set(OctetString.Substring(Raw, 8 + 24 * i, 24));\r
98             }\r
99         }\r
100 \r
101         #endregion\r
102 \r
103         #region properties\r
104 \r
105         public GpsTime GpsTime\r
106         {\r
107             get\r
108             {\r
109                 return new GpsTime(Week, TimeOfWeek);\r
110             }\r
111         }\r
112 \r
113         public decimal TimeOfWeek\r
114         {\r
115             get\r
116             {\r
117                 return BitConverter.ToUInt32(Raw, 6 + 0) * 1e-3m;\r
118             }\r
119         }\r
120 \r
121         public int Week\r
122         {\r
123             get\r
124             {\r
125                 return BitConverter.ToInt16(Raw, 6 + 4);\r
126             }\r
127         }\r
128 \r
129         public int NumberOfSatelites\r
130         {\r
131             get\r
132             {\r
133                 return Raw[6 + 6];\r
134             }\r
135         }\r
136 \r
137         public MeasurementData[] Data\r
138         {\r
139             get;\r
140             private set;\r
141         }\r
142 \r
143         #endregion\r
144 \r
145         #region public methods\r
146 \r
147         public static bool TryParse(byte[] sentence, out UnknownPacket packet)\r
148         {\r
149             packet = null;\r
150             if (sentence.Length < 16)\r
151             {\r
152                 return false;\r
153             }\r
154             int length = 8 + 24 * sentence[6 + 6];\r
155             return TryParse(sentence, out packet, \r
156                                         MessageID.RxmRaw, length, Build);\r
157         }\r
158 \r
159         #endregion\r
160 \r
161         #region private methods\r
162 \r
163         private static Packet Build(byte[] sentence, int length)\r
164         {\r
165             return new RxmRaw(sentence, length);\r
166         }\r
167 \r
168         #endregion\r
169     }\r
170 }\r