コード例 #1
0
        //=======================================================================
        #region -= static methods =-

        /// <summary>
        /// must be in the format 239.02,E
        /// </summary>
        /// <param name="inputString"></param>
        /// <returns></returns>
        public static MagneticVariation Parse(string inputString)
        {
            //---- declare vars
            MagneticVariation magVar = new MagneticVariation();

            string[] halves = inputString.Split(',');

            if (halves.Length < 2)
            {
                throw new FormatException("Input string must be in the format of 33.02,E");
            }

            if (string.IsNullOrEmpty(halves[0]))
            {
                magVar.Degrees = 0.0M;
            }
            else
            {
                magVar.Degrees = decimal.Parse(halves[0]);
            }
            magVar.Direction = DirectionUtil.Parse(halves[1]);

            //---- return
            return(magVar);
        }
コード例 #2
0
 /// <summary>
 /// must be in the format 239.02,E
 /// </summary>
 /// <param name="inputString"></param>
 /// <returns></returns>
 public static bool TryParse(string inputString, out MagneticVariation magneticVariation)
 {
     try
     {
         magneticVariation = Parse(inputString);
         return(true);
     }
     catch (Exception e)
     {
         magneticVariation = null;
         return(false);
     }
 }
コード例 #3
0
        //=======================================================================

        //=======================================================================
        #region -= constructors =-

        #endregion
        //=======================================================================

        //=======================================================================
        #region -= public methods =-

        #endregion
        //=======================================================================

        //=======================================================================
        #region -= static methods =-

        public static RmcData Parse(string inputString)
        {
            //---- declare vars
            RmcData rmcData    = new RmcData();
            string  dataString = inputString.Substring(0, inputString.IndexOf('*'));            // strip off the checksum

            string[] values = dataString.Split(',');

            //---- if we don't have 12 (header + 11), it's no good
            if (values.Length < 12)
            {
                return(rmcData);
            }

            //---- Status
            if (values[2].ToUpper() == "A")
            {
                rmcData.Status = Status.Valid;
            }
            else
            {
                rmcData.Status = Status.Invalid;
            }

            //---- if the date and time both are six digits
            if (values[1].Length >= 6 && values[9].Length == 6)
            {
                //---- make sure that they're actually numbers
                int temp;
                if (int.TryParse(values[1].Substring(0, 6), out temp) && int.TryParse(values[9], out temp))
                {
                    //---- should add more validation here
                    int day   = int.Parse(values[9].Substring(0, 2));
                    int month = int.Parse(values[9].Substring(2, 2));

                    // assume same century
                    int year = int.Parse(values[9].Substring(4, 2)) + (DateTime.Now.Year / 100) * 100;

                    // Fix for timestamps from previous century
                    // RMC format does not allow us to detect older than 100 years though
                    if (year > DateTime.Now.Year)
                    {
                        year -= 100;
                    }

                    int hour   = int.Parse(values[1].Substring(0, 2));
                    int minute = int.Parse(values[1].Substring(2, 2));
                    int second = int.Parse(values[1].Substring(4, 2));
                    rmcData.UtcDateTime = new DateTime(year, month, day, hour, minute, second);

                    // Timestamp may have higher granularity than seconds, this fix handles that.
                    if (values[1].Length > 7)
                    {
                        int extraDigits = values[1].Length - 7;
                        int partSeconds = int.Parse(values[1].Substring(7));
                        rmcData.UtcDateTime.Add(TimeSpan.FromSeconds((double)partSeconds / System.Math.Pow(10, extraDigits)));
                    }
                }
            }
            else if (values[1].Length >= 9)
            {
                //---- should add more validation here
                int hour        = int.Parse(values[1].Substring(0, 2));
                int minute      = int.Parse(values[1].Substring(2, 2));
                int second      = int.Parse(values[1].Substring(4, 2));
                int millisecond = 0;
                if (values[1].Length >= 9)
                {
                    millisecond = Convert.ToInt32(double.Parse(values[1].Substring(6, 3)) * 1000);
                }
                rmcData.UtcDateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, hour, minute, second, millisecond);
            }

            //---- lat/long position
            rmcData.Position = Position.Parse(values[3] + "," + values[4] + ";" + values[5] + "," + values[6]);

            //一节也是1.852公里/小时
            //---- speed in km
            rmcData.GroundSpeed = Decimal.Parse(values[7]) * 1.852m;
            ////---- speed in knots
            //rmcData.GroundSpeed = Decimal.Parse(values[7]);

            //---- true course
            rmcData.Heading = values[8].Length == 0 ? 0 : Decimal.Parse(values[8]);

            //---- magnetic declination
            MagneticVariation mag = null;

            MagneticVariation.TryParse(values[10] + "," + values[11], out mag);
            rmcData.MagneticVariation = mag;
            //---- return
            return(rmcData);

            //1   220516     Time Stamp
            //2   A          validity - A-ok, V-invalid
            //3   5133.82    current Latitude
            //4   N          North/South
            //5   00042.24   current Longitude
            //6   W          East/West
            //7   173.8      Speed in knots
            //8   231.8      True course
            //9   130694     Date Stamp
            //10  004.2      Variation
            //11  W          East/West
            //12  *70        checksum
        }