OSDN Git Service

7754ddbe8111214ca6bf7d28edaae5672e4f2eb6
[yubeshi/yubeshi.git] / Yubeshi / Nmea / GpGga.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.Nmea\r
13 {\r
14     /// <summary>\r
15     ///     Global Positioning System Fix Data\r
16     /// </summary>\r
17         public class GpGga : Packet\r
18     {\r
19         #region type definitions\r
20         public enum FixQualityClass\r
21         {\r
22             Invalid = 0,\r
23             Gps = 1,\r
24             Dgps = 2,\r
25             Pps = 3,\r
26             Rtk = 4,\r
27             FloatRtk = 5,\r
28             Estimated = 6,\r
29         }\r
30         #endregion\r
31         #region fields\r
32 \r
33         private static readonly byte[] header;\r
34         private const int elementNum = 14;\r
35 \r
36         #endregion\r
37 \r
38         #region constructors\r
39 \r
40         static GpGga()\r
41         {\r
42             header = Encoding.ASCII.GetBytes("$GPGGA,");\r
43         }\r
44 \r
45                 public GpGga()\r
46                 {\r
47                 }\r
48 \r
49                 public GpGga(byte[] sentence)\r
50             : this(sentence, GetElements(sentence, elementNum))\r
51                 {\r
52         }\r
53 \r
54         private GpGga(byte[] sentence, Elements elements)\r
55             : base(sentence, elements.PacketLength)\r
56         {\r
57             string[] v = elements.Values;\r
58             TimeOfFix = ParseTime(v[0]);\r
59             Position = new GeodeticCoordinate(\r
60                                     Degree.FromNmeaFormat(v[1], v[2]),\r
61                                     Degree.FromNmeaFormat(v[3], v[4]));\r
62             FixQuality = (FixQualityClass)Int32.Parse(v[5]);\r
63             TrackedSatellites = Int32.Parse(v[6]);\r
64             HorizontalDop = ParseDouble(v[7]);\r
65             MslAltitude = new Height(GetLength(v[8], v[9]), \r
66                                                     Height.Base.MeanSeaLevel);\r
67             GeoidSeparation = new Height(GetLength(v[10], v[11]),\r
68                                                 Height.Base.Wgs84Ellipsoid);\r
69             double age = ParseDouble(v[12]);\r
70             \r
71             AgeOfDgpsCorrections = Double.IsNaN(age)?\r
72                                 TimeSpan.MinValue :TimeSpan.FromSeconds(age);\r
73             DgpsStation = ParseInt(v[13], -1);\r
74             CheckSum = elements.CheckSum;\r
75         }\r
76 \r
77         #endregion\r
78 \r
79         #region properties\r
80 \r
81         public TimeSpan TimeOfFix\r
82         {\r
83             get;\r
84             private set;\r
85         }\r
86         \r
87         public GeodeticCoordinate Position\r
88         {\r
89             get;\r
90             private set;\r
91         }\r
92 \r
93         public FixQualityClass FixQuality\r
94         {\r
95             get;\r
96             private set;\r
97         }\r
98 \r
99         public int TrackedSatellites\r
100         {\r
101             get;\r
102             private set;\r
103         }\r
104 \r
105         public double HorizontalDop\r
106         {\r
107             get;\r
108             private set;\r
109         }\r
110 \r
111         public Height MslAltitude\r
112         {\r
113             get;\r
114             private set;\r
115         }\r
116 \r
117         public Height GeoidSeparation\r
118         {\r
119             get;\r
120             private set;\r
121         }\r
122 \r
123         public TimeSpan AgeOfDgpsCorrections\r
124         {\r
125             get;\r
126             private set;\r
127         }\r
128 \r
129         public int DgpsStation\r
130         {\r
131             get;\r
132             private set;\r
133         }\r
134         #endregion\r
135 \r
136 \r
137         public static bool TryParse(byte[] sentence, out UnknownPacket packet)\r
138         {\r
139             return TryParse(sentence, out packet, header, elementNum, Build);\r
140         }\r
141 \r
142         private static Packet Build(byte[] sentence, Elements elements)\r
143         {\r
144             return new GpGga(sentence, elements);\r
145         }\r
146 \r
147         }\r
148 }