OSDN Git Service

NMEAパケットの部分実装(GPDTM, GPGBS, GPGLL) master
authorkimikage <kimikage_ceo@hotmail.com>
Fri, 8 Jun 2012 12:31:10 +0000 (21:31 +0900)
committerkimikage <kimikage_ceo@hotmail.com>
Fri, 8 Jun 2012 12:31:10 +0000 (21:31 +0900)
Yubeshi/Nmea/GpDtm.cs
Yubeshi/Nmea/GpGbs.cs
Yubeshi/Nmea/GpGll.cs
YubeshiTest/NmeaTest/PacketTest.cs
YubeshiTest/NmeaTest/SamplePackets.cs

index bc9a846..006f0e9 100755 (executable)
@@ -58,8 +58,14 @@ namespace Yubeshi.Nmea
             : 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
@@ -71,13 +77,19 @@ namespace Yubeshi.Nmea
             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
@@ -100,6 +112,16 @@ namespace Yubeshi.Nmea
             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
index d431f59..1d9b281 100755 (executable)
@@ -16,5 +16,111 @@ namespace Yubeshi.Nmea
     /// </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
index 52ba95c..258ae83 100755 (executable)
@@ -16,10 +16,22 @@ namespace Yubeshi.Nmea
     /// </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
@@ -28,6 +40,12 @@ namespace Yubeshi.Nmea
         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
@@ -40,8 +58,48 @@ namespace Yubeshi.Nmea
         }\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
@@ -62,6 +120,15 @@ namespace Yubeshi.Nmea
             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
index 2ed8497..72aa445 100755 (executable)
@@ -24,7 +24,31 @@ namespace YubeshiTest.NmeaTest
         {\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
@@ -36,6 +60,31 @@ namespace YubeshiTest.NmeaTest
             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
index e0ffe45..f67c887 100755 (executable)
@@ -23,7 +23,9 @@ namespace YubeshiTest.NmeaTest
         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
@@ -33,11 +35,17 @@ namespace YubeshiTest.NmeaTest
 \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