: base(sentence, elements.PacketLength)\r
{\r
string[] v = elements.Values;\r
- LocalDatumCode = codes[v[0]];\r
- //Offset = new GeodeticCoordinate();\r
+ LocalDatumCode = GetDatumCode(v[0]);\r
+ LocalDatumSubCode = v[1];\r
+ Offset = new GeodeticCoordinate(\r
+ Degree.FromNmeaFormat(v[2], v[3]),\r
+ Degree.FromNmeaFormat(v[4], v[5]),\r
+ Double.Parse(v[6]));\r
+ ReferenceDatumCode = GetDatumCode(v[7]);\r
+ CheckSum = elements.CheckSum;\r
}\r
\r
#endregion\r
private set;\r
}\r
\r
+ public string LocalDatumSubCode\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+\r
public GeodeticCoordinate Offset\r
{\r
get;\r
private set;\r
}\r
\r
- public Code ReferenceDetumCode\r
+ public Code ReferenceDatumCode\r
{\r
get;\r
private set;\r
return new GpDtm(sentence, elements);\r
}\r
\r
+ private Code GetDatumCode(string datumCode)\r
+ {\r
+ Code c;\r
+ if (codes.TryGetValue(datumCode, out c))\r
+ {\r
+ return c;\r
+ }\r
+ return Code.Unknown;\r
+ }\r
#endregion\r
+\r
}\r
}\r
/// </summary>\r
public class GpGbs : Packet\r
{\r
+ #region fields\r
+ private static readonly byte[] header;\r
+ private const int elementNum = 8;\r
+\r
+ #endregion\r
+\r
+ #region constructors\r
+ \r
+ static GpGbs()\r
+ {\r
+ header = Encoding.ASCII.GetBytes("$GPGBS,");\r
+ }\r
+ \r
+ public GpGbs()\r
+ {\r
+ }\r
+\r
+ public GpGbs(byte[] sentence)\r
+ : this(sentence, GetElements(sentence, elementNum))\r
+ {\r
+ }\r
+\r
+ private GpGbs(byte[] sentence, Elements elements)\r
+ : base(sentence, elements.PacketLength)\r
+ {\r
+ string[] v = elements.Values;\r
+ Utc = ParseTime(v[0]);\r
+ LatitudeError = ParseDouble(v[1]);\r
+ LongitudeError = ParseDouble(v[2]);\r
+ AltitudeError = ParseDouble(v[3]);\r
+ FailedSatellite = ParseInt(v[4], -1);\r
+ ProbabilityOfMissedDetection = ParseDouble(v[5]);\r
+ Bias = ParseDouble(v[6]);\r
+ StandardDeviationOfBias = ParseDouble(v[7]);\r
+ CheckSum = elements.CheckSum;\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region properties\r
+ public TimeSpan Utc\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+\r
+ public double LatitudeError\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+\r
+ public double LongitudeError\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+\r
+ public double AltitudeError\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+\r
+ public int FailedSatellite\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+\r
+ public double ProbabilityOfMissedDetection\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+\r
+ public double Bias\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+\r
+ public double StandardDeviationOfBias\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+ #endregion\r
+\r
+ #region public method\r
+\r
+ public static bool TryParse(byte[] sentence, out UnknownPacket packet)\r
+ {\r
+ return TryParse(sentence, out packet, header, elementNum, Build);\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region private method\r
+\r
+ private static Packet Build(byte[] sentence, Elements elements)\r
+ {\r
+ return new GpGbs(sentence, elements);\r
+ }\r
+\r
+ #endregion\r
}\r
}
\ No newline at end of file
/// </summary>\r
public class GpGll : Packet\r
{\r
- #region fields\r
+ #region type definitions\r
+ public enum Mode\r
+ { \r
+ Unknown = -1,\r
+ None,\r
+ Autonomous, \r
+ Differential,\r
+ DeadReckoning,\r
+ }\r
+ #endregion\r
\r
+ #region fields\r
+ private static Dictionary<string, Mode> modes;\r
private static readonly byte[] header;\r
- private const int elementNum = 7;\r
+ private const int elementNum = -1; // 6 or 7\r
+\r
\r
#endregion\r
\r
static GpGll()\r
{\r
header = Encoding.ASCII.GetBytes("$GPGLL,");\r
+\r
+ modes = new Dictionary<string, Mode>();\r
+ modes["N"] = Mode.None;\r
+ modes["A"] = Mode.Autonomous;\r
+ modes["D"] = Mode.Differential;\r
+ modes["E"] = Mode.DeadReckoning;\r
}\r
\r
public GpGll()\r
}\r
\r
private GpGll(byte[] sentence, Elements elements)\r
- { \r
+ {\r
+ string[] v = elements.Values;\r
+ if (v.Length < 6 || v.Length > 7)\r
+ {\r
+ throw new ArgumentException();\r
+ }\r
+ Position = new GeodeticCoordinate(\r
+ Degree.FromNmeaFormat(v[0], v[1]),\r
+ Degree.FromNmeaFormat(v[2], v[3]));\r
+ CurrentTime = ParseTime(v[4]);\r
+ DataStatus = ParseStatus(v[5]);\r
+ PositioningMode = (v.Length == 7) ? \r
+ GetPositioningMode(v[6]): Mode.Unknown;\r
+ CheckSum = elements.CheckSum;\r
+ }\r
+\r
+ #endregion\r
+\r
+ #region properties\r
\r
+ public GeodeticCoordinate Position\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+\r
+ public TimeSpan CurrentTime\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+\r
+ public Status DataStatus\r
+ {\r
+ get;\r
+ private set;\r
+ }\r
+\r
+ public Mode PositioningMode\r
+ {\r
+ get;\r
+ private set;\r
}\r
\r
#endregion\r
return new GpGll(sentence, elements);\r
}\r
\r
+ private Mode GetPositioningMode(string mode)\r
+ {\r
+ Mode m;\r
+ if (modes.TryGetValue(mode, out m))\r
+ {\r
+ return m;\r
+ }\r
+ return Mode.Unknown;\r
+ }\r
#endregion\r
}\r
}
\ No newline at end of file
{\r
UnknownPacket packet;\r
Assert.IsTrue(GpDtm.TryParse(P.GpDtm, out packet));\r
- GpGga p = packet as GpGga;\r
+ GpDtm p = packet as GpDtm;\r
+ Assert.AreEqual(GpDtm.Code.Wgs84, p.LocalDatumCode);\r
+ Assert.AreEqual("", p.LocalDatumSubCode);\r
+ Assert.AreEqual(0.0, (double)p.Offset.Latitude);\r
+ Assert.AreEqual(0.0, (double)p.Offset.Longitude);\r
+ Assert.AreEqual(0.0, (double)p.Offset.Altitude);\r
+ Assert.AreEqual(GpDtm.Code.Wgs84, p.ReferenceDatumCode);\r
+ Assert.AreEqual(0x6F, p.CheckSum);\r
+ }\r
+\r
+ [Test]\r
+ public void GpGbsTest()\r
+ {\r
+ UnknownPacket packet;\r
+ Assert.IsTrue(GpGbs.TryParse(P.GpGbs, out packet));\r
+ GpGbs p = packet as GpGbs;\r
+ Assert.AreEqual(new TimeSpan(23, 55, 03), p.Utc);\r
+ Assert.AreEqual(1.6, (double)p.LatitudeError);\r
+ Assert.AreEqual(1.4, (double)p.LongitudeError);\r
+ Assert.AreEqual(3.2, (double)p.AltitudeError);\r
+ Assert.AreEqual(-1, p.FailedSatellite);\r
+ Assert.True(Double.IsNaN(p.ProbabilityOfMissedDetection));\r
+ Assert.True(Double.IsNaN(p.Bias));\r
+ Assert.True(Double.IsNaN(p.StandardDeviationOfBias));\r
+ Assert.AreEqual(0x40, p.CheckSum);\r
}\r
\r
[Test]\r
Assert.AreEqual(new TimeSpan(0, 9, 27, 25, 0), p.TimeOfFix);\r
Assert.AreEqual(2837.11399, p.Position.Latitude * 60.0);\r
Assert.AreEqual(513.9159, p.Position.Longitude * 60.0);\r
+ Assert.AreEqual(GpGga.FixQualityClass.Gps, p.FixQuality);\r
+ Assert.AreEqual(8, p.TrackedSatellites);\r
+ Assert.AreEqual(1.01, p.HorizontalDop);\r
+ Assert.AreEqual(499.6, (double)p.MslAltitude);\r
+ Assert.True(p.MslAltitude.IsAltitude);\r
+ Assert.AreEqual(48.0, (double)p.GeoidSeparation);\r
+ Assert.AreEqual(Height.Base.Wgs84Ellipsoid,\r
+ p.GeoidSeparation.BaseLevel);\r
+ Assert.Less(p.AgeOfDgpsCorrections.TotalSeconds, 0.0);\r
+ Assert.AreEqual(0, p.DgpsStation);\r
+ Assert.AreEqual(0x5B, p.CheckSum);\r
+ }\r
+\r
+ [Test]\r
+ public void GpGllTest()\r
+ {\r
+ UnknownPacket packet;\r
+ Assert.IsTrue(GpGll.TryParse(P.GpGll, out packet));\r
+ GpGll p = packet as GpGll;\r
+ Assert.AreEqual(2837.11364, p.Position.Latitude * 60.0);\r
+ Assert.AreEqual(513.91565, p.Position.Longitude * 60.0);\r
+ Assert.AreEqual(new TimeSpan(0, 9, 23, 21, 0), p.CurrentTime);\r
+ Assert.AreEqual(GpGll.Status.Valid, p.DataStatus);\r
+ Assert.AreEqual(GpGll.Mode.Autonomous, p.PositioningMode);\r
+ Assert.AreEqual(0x60, p.CheckSum);\r
}\r
}\r
}\r
public static readonly byte[] GpGst;\r
public static readonly byte[] GpGsv;\r
public static readonly byte[] GpRmc;\r
-\r
+ public static readonly byte[] GpTxt;\r
+ public static readonly byte[] GpVtg;\r
+ public static readonly byte[] GpZda;\r
\r
static SamplePackets()\r
{\r
\r
// from u-blox document\r
GpDtm = ascii.GetBytes("$GPDTM,W84,,0.000000,N,0.000000,E,0.0,W84*6F\r\n");\r
+ GpGbs = ascii.GetBytes("$GPGBS,235503.00,1.6,1.4,3.2,,,,*40\r\n");\r
GpGga = ascii.GetBytes("$GPGGA,092725.00,4717.11399,N,00833.91590,E,1,8,1.01,499.6,M,48.0,M,,0*5B\r\n");\r
GpGll = ascii.GetBytes("$GPGLL,4717.11364,N,00833.91565,E,092321.00,A,A*60\r\n");\r
GpGrs = ascii.GetBytes("$GPGRS,082632.00,1,0.54,0.83,1.00,1.02,-2.12,2.64,-0.71,-1.18,0.25,,,*70\r\n");\r
GpGsa = ascii.GetBytes("$GPGSA,A,3,23,29,07,08,09,18,26,28,,,,,1.94,1.18,1.54*0D\r\n");\r
-\r
+ GpGst = ascii.GetBytes("$GPGST,082356.00,1.8,,,,1.7,1.3,2.2*7E\r\n");\r
+ GpGsv = ascii.GetBytes("$GPGSV,3,1,10,23,38,230,44,29,71,156,47,07,29,116,41,08,09,081,36*7F\r\n");\r
+ GpRmc = ascii.GetBytes("$GPRMC,083559.00,A,4717.11437,N,00833.91522,E,0.004,77.52,091202,,,A*57\r\n");\r
+ GpTxt = ascii.GetBytes("$GPTXT,01,01,02,u-blox ag - www.u-blox.com*50\r\n");\r
+ GpVtg = ascii.GetBytes("$GPVTG,77.52,T,,M,0.004,N,0.008,K,A*06\r\n");\r
+ GpZda = ascii.GetBytes("$GPZDA,082710.00,16,09,2002,00,00*64\r\n");\r
}\r
}\r
}\r