From: kimikage Date: Fri, 8 Jun 2012 12:31:10 +0000 (+0900) Subject: NMEAパケットの部分実装(GPDTM, GPGBS, GPGLL) X-Git-Url: http://git.sourceforge.jp/view?p=yubeshi%2Fyubeshi.git;a=commitdiff_plain;ds=sidebyside NMEAパケットの部分実装(GPDTM, GPGBS, GPGLL) --- diff --git a/Yubeshi/Nmea/GpDtm.cs b/Yubeshi/Nmea/GpDtm.cs index bc9a846..006f0e9 100755 --- a/Yubeshi/Nmea/GpDtm.cs +++ b/Yubeshi/Nmea/GpDtm.cs @@ -58,8 +58,14 @@ namespace Yubeshi.Nmea : base(sentence, elements.PacketLength) { string[] v = elements.Values; - LocalDatumCode = codes[v[0]]; - //Offset = new GeodeticCoordinate(); + LocalDatumCode = GetDatumCode(v[0]); + LocalDatumSubCode = v[1]; + Offset = new GeodeticCoordinate( + Degree.FromNmeaFormat(v[2], v[3]), + Degree.FromNmeaFormat(v[4], v[5]), + Double.Parse(v[6])); + ReferenceDatumCode = GetDatumCode(v[7]); + CheckSum = elements.CheckSum; } #endregion @@ -71,13 +77,19 @@ namespace Yubeshi.Nmea private set; } + public string LocalDatumSubCode + { + get; + private set; + } + public GeodeticCoordinate Offset { get; private set; } - public Code ReferenceDetumCode + public Code ReferenceDatumCode { get; private set; @@ -100,6 +112,16 @@ namespace Yubeshi.Nmea return new GpDtm(sentence, elements); } + private Code GetDatumCode(string datumCode) + { + Code c; + if (codes.TryGetValue(datumCode, out c)) + { + return c; + } + return Code.Unknown; + } #endregion + } } diff --git a/Yubeshi/Nmea/GpGbs.cs b/Yubeshi/Nmea/GpGbs.cs index d431f59..1d9b281 100755 --- a/Yubeshi/Nmea/GpGbs.cs +++ b/Yubeshi/Nmea/GpGbs.cs @@ -16,5 +16,111 @@ namespace Yubeshi.Nmea /// public class GpGbs : Packet { + #region fields + private static readonly byte[] header; + private const int elementNum = 8; + + #endregion + + #region constructors + + static GpGbs() + { + header = Encoding.ASCII.GetBytes("$GPGBS,"); + } + + public GpGbs() + { + } + + public GpGbs(byte[] sentence) + : this(sentence, GetElements(sentence, elementNum)) + { + } + + private GpGbs(byte[] sentence, Elements elements) + : base(sentence, elements.PacketLength) + { + string[] v = elements.Values; + Utc = ParseTime(v[0]); + LatitudeError = ParseDouble(v[1]); + LongitudeError = ParseDouble(v[2]); + AltitudeError = ParseDouble(v[3]); + FailedSatellite = ParseInt(v[4], -1); + ProbabilityOfMissedDetection = ParseDouble(v[5]); + Bias = ParseDouble(v[6]); + StandardDeviationOfBias = ParseDouble(v[7]); + CheckSum = elements.CheckSum; + } + + #endregion + + #region properties + public TimeSpan Utc + { + get; + private set; + } + + public double LatitudeError + { + get; + private set; + } + + public double LongitudeError + { + get; + private set; + } + + public double AltitudeError + { + get; + private set; + } + + public int FailedSatellite + { + get; + private set; + } + + public double ProbabilityOfMissedDetection + { + get; + private set; + } + + public double Bias + { + get; + private set; + } + + public double StandardDeviationOfBias + { + get; + private set; + } + #endregion + + #region public method + + public static bool TryParse(byte[] sentence, out UnknownPacket packet) + { + return TryParse(sentence, out packet, header, elementNum, Build); + } + + #endregion + + #region private method + + private static Packet Build(byte[] sentence, Elements elements) + { + return new GpGbs(sentence, elements); + } + + #endregion } } \ No newline at end of file diff --git a/Yubeshi/Nmea/GpGll.cs b/Yubeshi/Nmea/GpGll.cs index 52ba95c..258ae83 100755 --- a/Yubeshi/Nmea/GpGll.cs +++ b/Yubeshi/Nmea/GpGll.cs @@ -16,10 +16,22 @@ namespace Yubeshi.Nmea /// public class GpGll : Packet { - #region fields + #region type definitions + public enum Mode + { + Unknown = -1, + None, + Autonomous, + Differential, + DeadReckoning, + } + #endregion + #region fields + private static Dictionary modes; private static readonly byte[] header; - private const int elementNum = 7; + private const int elementNum = -1; // 6 or 7 + #endregion @@ -28,6 +40,12 @@ namespace Yubeshi.Nmea static GpGll() { header = Encoding.ASCII.GetBytes("$GPGLL,"); + + modes = new Dictionary(); + modes["N"] = Mode.None; + modes["A"] = Mode.Autonomous; + modes["D"] = Mode.Differential; + modes["E"] = Mode.DeadReckoning; } public GpGll() @@ -40,8 +58,48 @@ namespace Yubeshi.Nmea } private GpGll(byte[] sentence, Elements elements) - { + { + string[] v = elements.Values; + if (v.Length < 6 || v.Length > 7) + { + throw new ArgumentException(); + } + Position = new GeodeticCoordinate( + Degree.FromNmeaFormat(v[0], v[1]), + Degree.FromNmeaFormat(v[2], v[3])); + CurrentTime = ParseTime(v[4]); + DataStatus = ParseStatus(v[5]); + PositioningMode = (v.Length == 7) ? + GetPositioningMode(v[6]): Mode.Unknown; + CheckSum = elements.CheckSum; + } + + #endregion + + #region properties + public GeodeticCoordinate Position + { + get; + private set; + } + + public TimeSpan CurrentTime + { + get; + private set; + } + + public Status DataStatus + { + get; + private set; + } + + public Mode PositioningMode + { + get; + private set; } #endregion @@ -62,6 +120,15 @@ namespace Yubeshi.Nmea return new GpGll(sentence, elements); } + private Mode GetPositioningMode(string mode) + { + Mode m; + if (modes.TryGetValue(mode, out m)) + { + return m; + } + return Mode.Unknown; + } #endregion } } \ No newline at end of file diff --git a/YubeshiTest/NmeaTest/PacketTest.cs b/YubeshiTest/NmeaTest/PacketTest.cs index 2ed8497..72aa445 100755 --- a/YubeshiTest/NmeaTest/PacketTest.cs +++ b/YubeshiTest/NmeaTest/PacketTest.cs @@ -24,7 +24,31 @@ namespace YubeshiTest.NmeaTest { UnknownPacket packet; Assert.IsTrue(GpDtm.TryParse(P.GpDtm, out packet)); - GpGga p = packet as GpGga; + GpDtm p = packet as GpDtm; + Assert.AreEqual(GpDtm.Code.Wgs84, p.LocalDatumCode); + Assert.AreEqual("", p.LocalDatumSubCode); + Assert.AreEqual(0.0, (double)p.Offset.Latitude); + Assert.AreEqual(0.0, (double)p.Offset.Longitude); + Assert.AreEqual(0.0, (double)p.Offset.Altitude); + Assert.AreEqual(GpDtm.Code.Wgs84, p.ReferenceDatumCode); + Assert.AreEqual(0x6F, p.CheckSum); + } + + [Test] + public void GpGbsTest() + { + UnknownPacket packet; + Assert.IsTrue(GpGbs.TryParse(P.GpGbs, out packet)); + GpGbs p = packet as GpGbs; + Assert.AreEqual(new TimeSpan(23, 55, 03), p.Utc); + Assert.AreEqual(1.6, (double)p.LatitudeError); + Assert.AreEqual(1.4, (double)p.LongitudeError); + Assert.AreEqual(3.2, (double)p.AltitudeError); + Assert.AreEqual(-1, p.FailedSatellite); + Assert.True(Double.IsNaN(p.ProbabilityOfMissedDetection)); + Assert.True(Double.IsNaN(p.Bias)); + Assert.True(Double.IsNaN(p.StandardDeviationOfBias)); + Assert.AreEqual(0x40, p.CheckSum); } [Test] @@ -36,6 +60,31 @@ namespace YubeshiTest.NmeaTest Assert.AreEqual(new TimeSpan(0, 9, 27, 25, 0), p.TimeOfFix); Assert.AreEqual(2837.11399, p.Position.Latitude * 60.0); Assert.AreEqual(513.9159, p.Position.Longitude * 60.0); + Assert.AreEqual(GpGga.FixQualityClass.Gps, p.FixQuality); + Assert.AreEqual(8, p.TrackedSatellites); + Assert.AreEqual(1.01, p.HorizontalDop); + Assert.AreEqual(499.6, (double)p.MslAltitude); + Assert.True(p.MslAltitude.IsAltitude); + Assert.AreEqual(48.0, (double)p.GeoidSeparation); + Assert.AreEqual(Height.Base.Wgs84Ellipsoid, + p.GeoidSeparation.BaseLevel); + Assert.Less(p.AgeOfDgpsCorrections.TotalSeconds, 0.0); + Assert.AreEqual(0, p.DgpsStation); + Assert.AreEqual(0x5B, p.CheckSum); + } + + [Test] + public void GpGllTest() + { + UnknownPacket packet; + Assert.IsTrue(GpGll.TryParse(P.GpGll, out packet)); + GpGll p = packet as GpGll; + Assert.AreEqual(2837.11364, p.Position.Latitude * 60.0); + Assert.AreEqual(513.91565, p.Position.Longitude * 60.0); + Assert.AreEqual(new TimeSpan(0, 9, 23, 21, 0), p.CurrentTime); + Assert.AreEqual(GpGll.Status.Valid, p.DataStatus); + Assert.AreEqual(GpGll.Mode.Autonomous, p.PositioningMode); + Assert.AreEqual(0x60, p.CheckSum); } } } diff --git a/YubeshiTest/NmeaTest/SamplePackets.cs b/YubeshiTest/NmeaTest/SamplePackets.cs index e0ffe45..f67c887 100755 --- a/YubeshiTest/NmeaTest/SamplePackets.cs +++ b/YubeshiTest/NmeaTest/SamplePackets.cs @@ -23,7 +23,9 @@ namespace YubeshiTest.NmeaTest public static readonly byte[] GpGst; public static readonly byte[] GpGsv; public static readonly byte[] GpRmc; - + public static readonly byte[] GpTxt; + public static readonly byte[] GpVtg; + public static readonly byte[] GpZda; static SamplePackets() { @@ -33,11 +35,17 @@ namespace YubeshiTest.NmeaTest // from u-blox document GpDtm = ascii.GetBytes("$GPDTM,W84,,0.000000,N,0.000000,E,0.0,W84*6F\r\n"); + GpGbs = ascii.GetBytes("$GPGBS,235503.00,1.6,1.4,3.2,,,,*40\r\n"); 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"); GpGll = ascii.GetBytes("$GPGLL,4717.11364,N,00833.91565,E,092321.00,A,A*60\r\n"); 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"); GpGsa = ascii.GetBytes("$GPGSA,A,3,23,29,07,08,09,18,26,28,,,,,1.94,1.18,1.54*0D\r\n"); - + GpGst = ascii.GetBytes("$GPGST,082356.00,1.8,,,,1.7,1.3,2.2*7E\r\n"); + 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"); + GpRmc = ascii.GetBytes("$GPRMC,083559.00,A,4717.11437,N,00833.91522,E,0.004,77.52,091202,,,A*57\r\n"); + GpTxt = ascii.GetBytes("$GPTXT,01,01,02,u-blox ag - www.u-blox.com*50\r\n"); + GpVtg = ascii.GetBytes("$GPVTG,77.52,T,,M,0.004,N,0.008,K,A*06\r\n"); + GpZda = ascii.GetBytes("$GPZDA,082710.00,16,09,2002,00,00*64\r\n"); } } }