コード例 #1
0
ファイル: SimpleParser.cs プロジェクト: dotnet/iot
 private static void UsingNetwork()
 {
     try
     {
         // using (TcpClient client = new TcpClient("192.168.1.43", 10110))
         using (TcpClient client = new TcpClient("127.0.0.1", 10110))
         {
             Console.WriteLine("Connected!");
             var  stream = client.GetStream();
             bool closed = false;
             using (NmeaParser parser = new NmeaParser("Test", stream, stream))
             {
                 parser.OnParserError += (source, msg, error) =>
                 {
                     Console.WriteLine($"Error while parsing message '{msg}': {error}");
                     if (error == NmeaError.PortClosed)
                     {
                         closed = true;
                     }
                 };
                 parser.OnNewSequence += ParserOnNewSequence;
                 parser.StartDecode();
                 while (!Console.KeyAvailable && !closed)
                 {
                     Thread.Sleep(1000);
                 }
             }
         }
     }
     catch (SocketException x)
     {
         Console.WriteLine($"Error connecting to host: {x}");
     }
 }
コード例 #2
0
        public Gps(string gpsDeviceName, BaudRate baudRate)
        {
            this.GpsDeviceName = gpsDeviceName;
            NmeaParser         = new NmeaParser();
            this.State         = new GpsState();

            GpsDevice = new SerialDevice(gpsDeviceName, baudRate);

            GpsDevice.DataReceived += (sender, bytes) =>
            {
                var nmeas = DeserializeMessages(bytes);

                nmeas.SetGpsState(ref State);

                var position = nmeas?.GetPosition();
                if (position == null)
                {
                    return;
                }
                Position = position;

                var args = new GpsUpdateEventArgs(Position, State, GpsDevice);
                OnGpsUpdate(this, args);
            };
        }
コード例 #3
0
ファイル: NmeaSimulator.cs プロジェクト: dotnet/iot
 public ParserData(TcpClient tcpClient, NmeaParser parser, Thread thread)
 {
     TcpClient       = tcpClient;
     Parser          = parser;
     Thread          = thread;
     TerminateThread = false;
 }
コード例 #4
0
		private void device_MessageReceived(object sender, NmeaParser.NmeaMessageReceivedEventArgs args)
		{
			Dispatcher.BeginInvoke((Action) delegate()
			{
				messages.Enqueue(args.Message.MessageType + ": " + args.Message.ToString());
				if (messages.Count > 100) messages.Dequeue(); //Keep message queue at 100
				output.Text = string.Join("\n", messages.ToArray());
				output.Select(output.Text.Length - 1, 0); //scroll to bottom

				if(args.Message is NmeaParser.Nmea.Gps.Gpgsv)
				{
					var gpgsv = (NmeaParser.Nmea.Gps.Gpgsv)args.Message;
					if(args.IsMultipart && args.MessageParts != null)
						satView.GpgsvMessages = args.MessageParts.OfType<NmeaParser.Nmea.Gps.Gpgsv>();
				}
				if (args.Message is NmeaParser.Nmea.Gps.Gprmc)
					gprmcView.Message = args.Message as NmeaParser.Nmea.Gps.Gprmc;
				else if (args.Message is NmeaParser.Nmea.Gps.Gpgga)
					gpggaView.Message = args.Message as NmeaParser.Nmea.Gps.Gpgga;
				else if (args.Message is NmeaParser.Nmea.Gps.Gpgsa)
					gpgsaView.Message = args.Message as NmeaParser.Nmea.Gps.Gpgsa;
				else if (args.Message is NmeaParser.Nmea.Gps.Gpgll)
					gpgllView.Message = args.Message as NmeaParser.Nmea.Gps.Gpgll;
				else if (args.Message is NmeaParser.Nmea.Gps.Garmin.Pgrme)
					pgrmeView.Message = args.Message as NmeaParser.Nmea.Gps.Garmin.Pgrme;
			});
		}
コード例 #5
0
ファイル: gpgga.cs プロジェクト: andrewminerd/netduino_gps
        private bool parseSentence(NmeaParser parser)
        {
            // ignore non-GPGGA sentences
            if (parser.offset < 5
                || parser.cmd[0] != 'G'
                || parser.cmd[1] != 'P'
                || parser.cmd[2] != 'G'
                || parser.cmd[3] != 'G'
                || parser.cmd[4] != 'A'
                || parser.cmd[5] != ',')
            {
                return false;
            }

            status = parser.getInt(5);
            fix = (status > 0);

            if (!fix)
            {
                // valid sentence, but no GPS fix
                return false;
            }

            sat = parser.getInt(6);
            lat = parser.getInt(1);
            lon = parser.getInt(3);
            return true;
        }
コード例 #6
0
		/// <summary>
		/// Unloads the current device, and opens the next device
		/// </summary>
		/// <param name="device"></param>
		private void StartDevice(NmeaParser.NmeaDevice device)
		{
			//Clean up old device
			if (currentDevice != null)
			{
				currentDevice.MessageReceived -= device_MessageReceived;
				currentDevice.Dispose();
			}
			output.Text = "";
			messages.Clear();
			gprmcView.Message = null;
			gpggaView.Message = null;
			gpgsaView.Message = null;
			gpgllView.Message = null;
			pgrmeView.Message = null;
			satView.GpgsvMessages = null;
			//Start new device
			currentDevice = device;
			currentDevice.MessageReceived += device_MessageReceived;
			var _ = currentDevice.OpenAsync();
			if (device is NmeaParser.NmeaFileDevice)
				currentDeviceInfo.Text = string.Format("NmeaFileDevice( file={0} )", ((NmeaParser.NmeaFileDevice)device).FileName);
			else if (device is NmeaParser.SerialPortDevice)
			{
				currentDeviceInfo.Text = string.Format("SerialPortDevice( port={0}, baud={1} )",
					((NmeaParser.SerialPortDevice)device).Port.PortName,
					((NmeaParser.SerialPortDevice)device).Port.BaudRate);
			}
		}
コード例 #7
0
		public void AddMessage(NmeaParser.Nmea.NmeaMessage message)
		{
			messages.Enqueue(message.MessageType + ": " + message.ToString());
			if (messages.Count > 100) messages.Dequeue(); //Keep message queue at 100
			output.Text = string.Join("\n", messages.ToArray());
			output.Select(output.Text.Length - 1, 0); //scroll to bottom
		}
コード例 #8
0
ファイル: NmeaTests.cs プロジェクト: janmariu/ais
        public void Parse_InvalidNmeaString()
        {
            //The norwegian costal authority seems to send garbled messages these days.
            NmeaMessage msg = NmeaParser.Parse("\\s:2573315,c:1606586568*09\\!BSVDM,1,1,,B,13nP7p?PAfPMiF2SmT=S4ROP0<1q,0*3E");

            Assert.AreEqual("!BSVDM", msg.MessageType);
            Assert.AreEqual("0*3E", msg.Checksum);
        }
コード例 #9
0
		private void device_MessageReceived(object sender, NmeaParser.NmeaMessageReceivedEventArgs args)
		{
			var _ = Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
			{
				messages.Enqueue(args.Message.MessageType + ": " + args.Message.ToString());
				if (messages.Count > 100) messages.Dequeue(); //Keep message queue at 100
				output.Text = string.Join("\n", messages.ToArray());
			});
		}
コード例 #10
0
ファイル: GpsSensor.cs プロジェクト: gandy92/MrGibbs
        private double _minimumSpeed = 0.3;//knots

        public GpsSensor(ILogger logger, GpsPlugin plugin, string serialPort, int baud)
        {
            _numberCulture = System.Globalization.CultureInfo.GetCultureInfo("en-us");
            _plugin        = plugin;
            _logger        = logger;
            _portName      = serialPort;
            _parser        = new NmeaParser();
            _baud          = baud;
        }
コード例 #11
0
        public ParseActivity(FileReader file, AisStore store, NmeaParser parseNmea, Counters counters, Tracking tracking, ILogger <ParseActivity> logger)
        {
            _logger = logger.VerifyNotNull(nameof(logger));

            _fileReader = file.VerifyNotNull(nameof(file));
            _parseNmea  = parseNmea.VerifyNotNull(nameof(parseNmea));
            _store      = store.VerifyNotNull(nameof(store));
            _counters   = counters.VerifyNotNull(nameof(counters));
            _tracking   = tracking.VerifyNotNull(nameof(tracking));
        }
コード例 #12
0
ファイル: NmeaTests.cs プロジェクト: janmariu/ais
        public void Parse_NonMultipartNmea()
        {
            NmeaMessage msg = NmeaParser.Parse("!AIVDM,1,1,,A,14eG;o@034o8sd<L9i:a;WF>062D,0*7D");

            Assert.AreEqual("!AIVDM", msg.MessageType);
            Assert.AreEqual(1, msg.NumberOfSentences);
            Assert.AreEqual(1, msg.SentenceNumber);
            Assert.AreEqual(null, msg.SequentialMessageId);
            Assert.AreEqual("A", msg.Channel);
            Assert.AreEqual("14eG;o@034o8sd<L9i:a;WF>062D", msg.EncodedPayload);
            Assert.AreEqual("0*7D", msg.Checksum);
        }
コード例 #13
0
        public void VtgMessageTest2()
        {
            var parser = new NmeaParser();
            var result = parser.Parse(VtgMessage2);

            Assert.IsInstanceOfType(result, typeof(GpvtgMessage));
            var message = (GpvtgMessage)result;

            Assert.AreEqual(141.92f, message.TrackDegrees);
            Assert.AreEqual(float.NaN, message.MagneticTrack);
            Assert.AreEqual(0.89f, message.GroundSpeetKnots);
            Assert.AreEqual(1.64f, message.GroundSpeed);
        }
コード例 #14
0
        public void VtgMessageTest1()
        {
            var parser = new NmeaParser();
            var result = parser.Parse(VtgMessage1);

            Assert.IsInstanceOfType(result, typeof(GpvtgMessage));
            var message = (GpvtgMessage)result;

            Assert.AreEqual(054.7f, message.TrackDegrees);
            Assert.AreEqual(034.4f, message.MagneticTrack);
            Assert.AreEqual(005.5f, message.GroundSpeetKnots);
            Assert.AreEqual(010.2f, message.GroundSpeed);
        }
コード例 #15
0
		private void device_MessageReceived(object sender, NmeaParser.NmeaMessageReceivedEventArgs args)
		{
			Dispatcher.BeginInvoke((Action) delegate()
			{
				messagesWindow.AddMessage(args.Message);

				if(args.Message is NmeaParser.Nmea.Gps.Gpgsv)
				{
					var gpgsv = (NmeaParser.Nmea.Gps.Gpgsv)args.Message;
					if(args.IsMultipart && args.MessageParts != null)
						skyViewWindow.GpgsvMessages = args.MessageParts.OfType<NmeaParser.Nmea.Gps.Gpgsv>();
				}
			});
		}
コード例 #16
0
ファイル: Program.cs プロジェクト: DaniAsh551/ArDrone2
        static void Main(string[] args)
        {
            var parser = new NmeaParser();

            var dummy = File.ReadAllText("/home/lubuntu/sample.nmea");
            //var dummyBytes = Encoding.UTF8.GetBytes(dummy);
            var nm = parser.Parse(dummy);

            return;

            var portNames = SerialDevice.GetPortNames();

            var serial = new SerialDevice("/dev/ttyACM0", BaudRate.B1152000);

            serial.DataReceived += (o, eventArgs) =>
            {
            };


            serial.Open();

            while (true)
            {
                Thread.Sleep(200);
            }
            return;

            var client = new UdpClient(5554);
            var sender = new UdpClient(5556);

            var ip     = "192.168.100.55";
            var exitBs = Encoding.ASCII.GetBytes("AT*CONFIG=\"general:navdata_demo\",\"TRUE\"\r");
            var ack    = Encoding.ASCII.GetBytes("AT*CTRL=0\r");

            sender.Send(exitBs, exitBs.Length, ip, 5556);
            sender.Send(ack, ack.Length, ip, 5556);
            client.Send(new byte[] { 1 }, 1, ip, 5554);

            var nav = new NavDataRetriever("192.168.100.55", 5554, 2000, client);

            nav.SendMessage = i => client.Send(new byte[] { (byte)i }, 1, ip, 5554);
            nav.Start();
            nav.WaitForFirstMessageToArrive();
            var navData = nav.CurrentNavigationData;

            while (true)
            {
                navData = nav.CurrentNavigationData;
            }
        }
コード例 #17
0
        public void GsaMessageTest1()
        {
            var parser = new NmeaParser();
            var result = parser.Parse(GsaMessage1);

            Assert.IsInstanceOfType(result, typeof(GpgsaMessage));
            var message = (GpgsaMessage)result;

            Assert.AreEqual(true, message.GpsStatusAuto);
            Assert.AreEqual(3, (int)message.SatelliteFix);
            Assert.AreEqual("04,05,,09,12,,,24,,,,,", message.Pnrs);
            Assert.AreEqual(2.5f, message.Pdop);
            Assert.AreEqual(1.3f, message.Hdop);
            Assert.AreEqual(2.1f, message.Vdop);
        }
コード例 #18
0
		private void LoadDevice(NmeaParser.NmeaDevice device)
		{
			if (mapView.LocationDisplay.LocationProvider != null)
				mapView.LocationDisplay.LocationProvider.LocationChanged -= LocationProvider_LocationChanged;
			if (currentNmeaDevice != null)
			{
				currentNmeaDevice.MessageReceived -= device_MessageReceived;
			}

			currentNmeaDevice = device;
			currentNmeaDevice.MessageReceived += device_MessageReceived;
			mapView.LocationDisplay.LocationProvider = new NmeaLocationProvider(currentNmeaDevice);
			mapView.LocationDisplay.IsEnabled = true;
			mapView.LocationDisplay.LocationProvider.LocationChanged += LocationProvider_LocationChanged;
		}
コード例 #19
0
        static void Main(string[] args)
        {
            if (args.Length != 4)
            {
                Console.WriteLine(@"Please provide an input arguments as follows:
1st - Input file with NMEA data,
2nd - Output JSON file path,
3rd - Time offset in seconds,
4th - Speed multipler constant.");
                return;
            }

            if (!ValidateInputArguments(args))
            {
                return;
            }


            StreamReader       sr       = new StreamReader(inputFile.FullName);
            List <NmeaMessage> messages = new List <NmeaMessage>();

            while (!sr.EndOfStream)
            {
                string line = sr.ReadLine();

                if (line.Contains("$GPGGA") || line.Contains("$GPRMC"))
                {
                    var parser = new NmeaParser();
                    messages.Add(parser.Parse(line));
                }

                if (messages.Count == 2)
                {
                    string message = NmeaSenteceToJson(messages, timeOffset, speedMultiplier);

                    StreamWriter sw = new StreamWriter(outputFile.FullName);
                    sw.WriteLine(message);

                    Console.WriteLine(message);

                    sw.Close();

                    messages.Clear();
                    Thread.Sleep(1000);
                }
            }
            sr.Close();
        }
コード例 #20
0
        public void RmcMessageTest2()
        {
            var parser = new NmeaParser();
            var result = parser.Parse(RmcMessage2);

            Assert.IsInstanceOfType(result, typeof(GprmcMessage));
            var message = (GprmcMessage)result;

            Assert.AreEqual("153007".ToTimeSpan(), message.FixTime);
            Assert.AreEqual(true, message.IsActive);
            Assert.AreEqual("5050.10288".ToCoordinates("N", CoordinateType.Latitude), message.Latitude);
            Assert.AreEqual("00419.91808".ToCoordinates("E", CoordinateType.Longitude), message.Longitude);
            Assert.AreEqual(000.1f, message.Speed);
            Assert.AreEqual(078.9f, message.Course);
            Assert.AreEqual(DateTime.ParseExact("100217", "ddMMyy", CultureInfo.InvariantCulture), message.UpdateDate);
            Assert.AreEqual(float.NaN, message.MagneticVariation);
        }
コード例 #21
0
        public void RmcMessageTest1()
        {
            var parser = new NmeaParser();
            var result = parser.Parse(RmcMessage1);

            Assert.IsInstanceOfType(result, typeof(GprmcMessage));
            var message = (GprmcMessage)result;

            Assert.AreEqual("091317.75".ToTimeSpan(), message.FixTime);
            Assert.AreEqual(true, message.IsActive);
            Assert.AreEqual("5037.0967674".ToCoordinates("N", CoordinateType.Latitude), message.Latitude);
            Assert.AreEqual("00534.6232070".ToCoordinates("E", CoordinateType.Longitude), message.Longitude);
            Assert.AreEqual(0.019f, message.Speed);
            Assert.AreEqual(215.1f, message.Course);
            Assert.AreEqual(DateTime.ParseExact("220816", "ddMMyy", CultureInfo.InvariantCulture), message.UpdateDate);
            Assert.AreEqual(0.0f, message.MagneticVariation);
        }
コード例 #22
0
ファイル: Form1.cs プロジェクト: crazymouse0/jt-gps
        private void Form1_Load(object sender, EventArgs e)
        {
            _parser = new NmeaParser();
            _parser.NmeaSentenceReceived += new NmeaSentenceReceivedEventHandler(_parser_NmeaSentenceReceived);

            string[] ports = SerialPortReader.GetAvailablePorts();
            if (ports != null && ports.Length > 0)
            {
                this._comPorts.Items.AddRange(ports);
                this._comPorts.SelectedIndex = 0;
            }

            string port = this._comPorts.SelectedItem as string;

            _portReader = new SerialPortReader(port);
            _portReader.DataReceived += new GpsDataReceivedEventHandler(_portReader_DataReceived);

            UpdateControls();
        }
コード例 #23
0
ファイル: Form1.cs プロジェクト: crazymouse0/jt-gps
        private void Form1_Load(object sender, EventArgs e)
        {
            _parser = new NmeaParser();
            _parser.NmeaSentenceReceived += new NmeaSentenceReceivedEventHandler(_parser_NmeaSentenceReceived);

            string[] ports = SerialPortReader.GetAvailablePorts();
            if (ports != null && ports.Length > 0)
            {
                this._comPorts.Items.AddRange(ports);
                this._comPorts.SelectedIndex = 0;
            }

            string port = this._comPorts.SelectedItem as string;

            _portReader = new SerialPortReader(port);
            _portReader.DataReceived += new GpsDataReceivedEventHandler(_portReader_DataReceived);

            UpdateControls();
        }
コード例 #24
0
        static void Main(string[] args)
        {
            var parser = new NmeaParser();

            Console.WriteLine($"Parsing GPGGA message: {GgaMessage1}");
            var result = parser.Parse(GgaMessage1);

            Console.WriteLine($"Result: {result}");

            Console.WriteLine($"Parsing GPRMC message: {RmcMessage1}");
            result = parser.Parse(RmcMessage1);
            Console.WriteLine($"Result: {result}");

            Console.WriteLine($"Parsing GPRMC message 2: {RmcMessage2}");
            result = parser.Parse(RmcMessage2);
            Console.WriteLine($"Result: {result}");

            Console.WriteLine("Press enter to continue...");
            Console.ReadKey();
        }
コード例 #25
0
        public void GgaMessageTest1()
        {
            var parser = new NmeaParser();
            var result = parser.Parse(GgaMessage1);

            Assert.IsInstanceOfType(result, typeof(GpggaMessage));
            var message = (GpggaMessage)result;

            Assert.AreEqual("091317.80".ToTimeSpan(), message.FixTime);
            Assert.AreEqual("5037.0968".ToCoordinates("N", CoordinateType.Latitude), message.Latitude);
            Assert.AreEqual("00534.6232".ToCoordinates("E", CoordinateType.Longitude), message.Longitude);
            Assert.AreEqual(9, (int)message.FixQuality);
            Assert.AreEqual(7, message.NumberOfSatellites);
            Assert.AreEqual(1.4f, message.Hdop);
            Assert.AreEqual(73.65f, message.Altitude);
            Assert.AreEqual("M", message.AltitudeUnits);
            Assert.AreEqual(46.60f, message.HeightOfGeoId);
            Assert.AreEqual("M", message.HeightOfGeoIdUnits);
            Assert.AreEqual(5, message.TimeSpanSinceDgpsUpdate);
            Assert.AreEqual(136, message.DgpsStationId);
        }
コード例 #26
0
		void device_MessageReceived(object sender, NmeaParser.NmeaMessageReceivedEventArgs e)
		{
			var message = e.Message;
			if (message is NmeaParser.Nmea.Gps.Garmin.Pgrme)
			{
				m_Accuracy = ((NmeaParser.Nmea.Gps.Garmin.Pgrme)message).HorizontalError;
			}
			else if (message is NmeaParser.Nmea.Gps.Gprmc)
			{
				var rmc = (NmeaParser.Nmea.Gps.Gprmc)message;
				if(rmc.Active && LocationChanged != null)
				{
					LocationChanged(this, new Esri.ArcGISRuntime.Location.LocationInfo()
					{
						Course = rmc.Course,
						Speed = rmc.Speed,
						HorizontalAccuracy = m_Accuracy,
						Location = new Esri.ArcGISRuntime.Geometry.MapPoint(rmc.Longitude, rmc.Latitude, SpatialReferences.Wgs84)
					});
				}
			}
		}
コード例 #27
0
        static void Main(string[] args)
        {
            _LastSent = DateTime.Now;

            var utc      = DateTime.UtcNow;
            var fileName = $"{utc.Year}-{utc.Month}-{utc.Day}={utc.Hour}-{utc.Minute}-{utc.Second}.log";

            _streamWriter = File.AppendText(fileName);

            try
            {
                var connectionString = "HostName=iotc-6e7ea251-71bd-4024-a0a8-a8895ea79b7f.azure-devices.net;DeviceId=GeoTracker1;SharedAccessKey=a99ZyFyYPR0tQl7vWK75y4C3YveuQmK118LYEgsYC5c=";

                _deviceClient = DeviceClient.CreateFromConnectionString(connectionString);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception during IoT connection {ex}");
            }

            Console.WriteLine("Read serial port");

            _parser = new NmeaParser();

            _parser.NmeaMessageParsed += NmeaMessageParsed;

            _SerialReader = new SerialReader();

            _SerialReader.NmeaSentenceReceived += NmeaSentenceReceived;

            _SerialReader.Open();

            Console.WriteLine("Initialized...");

            Console.ReadKey();
        }
コード例 #28
0
        private void Connect(IAsyncResult result)
        {
            if (result.IsCompleted)
            {
                var data = bluetoothClient.GetStream();
                while (true)
                {
                    if (data.CanRead)
                    {
                        GpggaMessage parsedMessage   = new GpggaMessage();
                        var          message         = new byte[256];
                        var          completeMessage = new StringBuilder();

                        do
                        {
                            var numberOfBytesRead = data.Read(message, 0, message.Length);
                            completeMessage.AppendFormat("{0}", Encoding.ASCII.GetString(message, 0, numberOfBytesRead));
                        }while (data.DataAvailable);
                        try
                        {
                            var nmeaParser = new NmeaParser();
                            var messages   = completeMessage.ToString();
                            parsedMessage = (GpggaMessage)nmeaParser.Parse(completeMessage.ToString());
                            if (parsedMessage != null)
                            {
                                ParseCoordinates(completeMessage, parsedMessage);
                            }
                        }
                        catch
                        {
                            ;
                        }
                    }
                }
            }
        }
コード例 #29
0
        public override SensorFile ImportFile(string path, Boat boat)
        {
            int           line = 0;
            StringBuilder log  = new StringBuilder();

            try
            {
                FileInfo   fi   = new FileInfo(path);
                SensorFile file = new SensorFile("nmea", fi.Name, DateTime.Now);
                file.Save();

                StreamReader reader = new StreamReader(path);
                Dictionary <string, Dictionary <string, string> > first = null;
                if (!reader.EndOfStream)
                {
                    while (first == null && !reader.EndOfStream)
                    {
                        try
                        {
                            string lineText = reader.ReadLine();
                            first = NmeaParser.Parse(lineText);
                        }
                        catch (NMEAIgnoredSentenceException) { }
                        catch (NMEAUnkownSentenceException) { }
                        catch (NMEAEmptySentenceException) { }
                        catch (Exception e)
                        {
                            log.Append("Line " + line + ": " + e.Message);
                            log.Append(Environment.NewLine);
                        }
                        line++;
                    }
                    while (!reader.EndOfStream)
                    {
                        try
                        {
                            Dictionary <string, Dictionary <string, string> > current = first;
                            bool      newGroup          = true;
                            double    latitude          = 0;
                            double    longitude         = 0;
                            double    speed             = 0;
                            double    waterTemperature  = 0;
                            double    depth             = 0;
                            double    relativeWindSpeed = 0;
                            double    relativeWindAngle = 0;
                            double    heading           = 0;
                            TimeSpan? time           = null;
                            Exception groupException = null;
                            while (newGroup || (current.Keys.ElementAt(0) != first.Keys.ElementAt(0) && !reader.EndOfStream))
                            {
                                try
                                {
                                    //process current
                                    if (current.Keys.ElementAt(0) == "Global Positioning System Fix Data")
                                    {
                                        //time
                                        string   timestring = current[current.Keys.ElementAt(0)]["Time"];
                                        char[]   splitter   = { '.' };
                                        string[] parts      = timestring.Split(splitter);
                                        if (parts[0].Length == 6)
                                        {
                                            int hour        = int.Parse(parts[0].Substring(0, 2));
                                            int minute      = int.Parse(parts[0].Substring(2, 2));
                                            int second      = int.Parse(parts[0].Substring(4, 2));
                                            int millisecond = 0;
                                            if (parts.Length > 1)
                                            {
                                                millisecond =
                                                    (int)
                                                    (double.Parse("0." + parts[1], _numberCulture.NumberFormat) *
                                                     1000.0);
                                            }
                                            time = new TimeSpan(0, hour, minute, second, millisecond);
                                        }
                                        else
                                        {
                                            throw new Exception("Invalid Time Format");
                                        }

                                        //latitude
                                        string latitudeString          = current[current.Keys.ElementAt(0)]["Latitude"];
                                        string latitudeDirectionString =
                                            current[current.Keys.ElementAt(0)]["Latitude Direction"];
                                        if (latitudeString.Length > 2)
                                        {
                                            int    latdegrees = int.Parse(latitudeString.Substring(0, 2));
                                            double latminute  = double.Parse(latitudeString.Substring(2),
                                                                             _numberCulture.NumberFormat);
                                            latitude = Coordinate.CoordinateToDouble(latdegrees, latminute, 0);
                                            if (latitudeDirectionString.ToLower() == "s")
                                            {
                                                latitude = -latitude;
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception("Invalid Latitude format");
                                        }

                                        //longitude
                                        string longitudeString          = current[current.Keys.ElementAt(0)]["Longitude"];
                                        string longitudeDirectionString =
                                            current[current.Keys.ElementAt(0)]["Longitude Direction"];
                                        if (longitudeString.Length > 2)
                                        {
                                            int    longdegrees = int.Parse(longitudeString.Substring(0, 3));
                                            double longminute  = double.Parse(longitudeString.Substring(3),
                                                                              _numberCulture.NumberFormat);
                                            longitude = Coordinate.CoordinateToDouble(longdegrees, longminute, 0);
                                            if (longitudeDirectionString.ToLower() == "w")
                                            {
                                                longitude = -longitude;
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception("Invalid Longitude format");
                                        }
                                    }
                                    else if (current.Keys.ElementAt(0) == "Recommended Minimum Specific GPS/TRANSIT Data")
                                    {
                                        //time
                                        string   timestring = current[current.Keys.ElementAt(0)]["Time of Fix"];
                                        char[]   splitter   = { '.' };
                                        string[] parts      = timestring.Split(splitter);
                                        if (parts[0].Length == 6)
                                        {
                                            int hour   = int.Parse(parts[0].Substring(0, 2));
                                            int minute = int.Parse(parts[0].Substring(2, 2));
                                            int second = int.Parse(parts[0].Substring(4, 2));
                                            time = new TimeSpan(0, hour, minute, second, 0);
                                        }
                                        else
                                        {
                                            throw new Exception("Invalid Time Format");
                                        }

                                        //latitude
                                        string latitudeString          = current[current.Keys.ElementAt(0)]["Latitude"];
                                        string latitudeDirectionString =
                                            current[current.Keys.ElementAt(0)]["Latitude Direction"];
                                        if (latitudeString.Length > 2)
                                        {
                                            int    latdegrees = int.Parse(latitudeString.Substring(0, 2));
                                            double latminute  = double.Parse(latitudeString.Substring(2),
                                                                             _numberCulture.NumberFormat);
                                            latitude = Coordinate.CoordinateToDouble(latdegrees, latminute, 0);
                                            if (latitudeDirectionString.ToLower() == "s")
                                            {
                                                latitude = -latitude;
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception("Invalid Latitude format");
                                        }

                                        //longitude
                                        string longitudeString          = current[current.Keys.ElementAt(0)]["Longitude"];
                                        string longitudeDirectionString =
                                            current[current.Keys.ElementAt(0)]["Longitude Direction"];
                                        if (longitudeString.Length > 2)
                                        {
                                            int    longdegrees = int.Parse(longitudeString.Substring(0, 3));
                                            double longminute  = double.Parse(longitudeString.Substring(3),
                                                                              _numberCulture.NumberFormat);
                                            longitude = Coordinate.CoordinateToDouble(longdegrees, longminute, 0);
                                            if (longitudeDirectionString.ToLower() == "w")
                                            {
                                                longitude = -longitude;
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception("Invalid Longitude format");
                                        }

                                        string speedString = current[current.Keys.ElementAt(0)]["Speed over ground"];
                                        double.TryParse(speedString, out speed);
                                        //speed = double.Parse(speedString, _numberCulture.NumberFormat);

                                        string datestring = current[current.Keys.ElementAt(0)]["Date of Fix"];
                                        if (datestring.Length == 6)
                                        {
                                            int      day   = int.Parse(datestring.Substring(0, 2));
                                            int      month = int.Parse(datestring.Substring(2, 2));
                                            int      year  = 2000 + int.Parse(datestring.Substring(4, 2));
                                            DateTime dt    = new DateTime(year, month, day);
                                            dt        = ZeroTime(dt);
                                            StartDate = dt;
                                            time      = new TimeSpan(0, time.Value.Hours, time.Value.Minutes,
                                                                     time.Value.Seconds, time.Value.Milliseconds);
                                        }
                                        else
                                        {
                                            throw new Exception("Invalid Time Format");
                                        }
                                    }
                                    else if (current.Keys.ElementAt(0) == "Data and Time")
                                    {
                                        //time
                                        string   timestring = current[current.Keys.ElementAt(0)]["Time"];
                                        char[]   splitter   = { '.' };
                                        string[] parts      = timestring.Split(splitter);
                                        if (parts[0].Length == 6)
                                        {
                                            int hour        = int.Parse(parts[0].Substring(0, 2));
                                            int minute      = int.Parse(parts[0].Substring(2, 2));
                                            int second      = int.Parse(parts[0].Substring(4, 2));
                                            int millisecond =
                                                (int)
                                                (double.Parse("0." + parts[1], _numberCulture.NumberFormat) *
                                                 1000.0);
                                            int      day   = int.Parse(current[current.Keys.ElementAt(0)]["Day"]);
                                            int      month = int.Parse(current[current.Keys.ElementAt(0)]["Month"]);
                                            int      year  = int.Parse(current[current.Keys.ElementAt(0)]["Year"]);
                                            DateTime dt    = new DateTime(year, month, day);
                                            dt        = ZeroTime(dt);
                                            StartDate = dt;
                                            time      = new TimeSpan(0, hour, minute, second, millisecond);
                                        }
                                        else
                                        {
                                            throw new Exception("Invalid Time Format");
                                        }
                                    }
                                    else if (current.Keys.ElementAt(0) == "Water Temperature")
                                    {
                                        string tempString     = current[current.Keys.ElementAt(0)]["Water Temperature"];
                                        string tempUnitString =
                                            current[current.Keys.ElementAt(0)]["Water Temperature Unit"];
                                        waterTemperature = double.Parse(tempString, _numberCulture.NumberFormat);
                                        //convert fahrenheit to celsius
                                        if (tempUnitString.ToLower() == "f")
                                        {
                                            waterTemperature = (5.0 / 9.0) * (waterTemperature - 32.0);
                                        }
                                    }
                                    else if (current.Keys.ElementAt(0) == "Depth")
                                    {
                                        string depthString = current[current.Keys.ElementAt(0)]["Depth"];
                                        depth = double.Parse(depthString, _numberCulture.NumberFormat);
                                    }
                                    else if (current.Keys.ElementAt(0) == "Wind Speed and Angle")
                                    {
                                        string windAngleString     = current[current.Keys.ElementAt(0)]["Wind Angle"];
                                        string windspeedString     = current[current.Keys.ElementAt(0)]["Wind Speed"];
                                        string windspeedUnitString =
                                            current[current.Keys.ElementAt(0)]["Wind Speed Unit"];
                                        relativeWindAngle = double.Parse(windAngleString,
                                                                         _numberCulture.NumberFormat);
                                        relativeWindSpeed =
                                            ConvertValueWithUnit(windspeedString + " " + windspeedUnitString);
                                    }
                                    else if (current.Keys.ElementAt(0) == "NovaSail")
                                    {
                                        string latitudeString  = current[current.Keys.ElementAt(0)]["Latitude"];
                                        string longitudeString = current[current.Keys.ElementAt(0)]["Longitude"];
                                        string headingString   = current[current.Keys.ElementAt(0)]["Heading"];
                                        string speedString     = current[current.Keys.ElementAt(0)]["Speed"];
                                        string rollString      = current[current.Keys.ElementAt(0)]["Roll"];
                                        string dayString       = current[current.Keys.ElementAt(0)]["Day"];
                                        string monthString     = current[current.Keys.ElementAt(0)]["Month"];
                                        string yearString      = current[current.Keys.ElementAt(0)]["Year"];
                                        string hourString      = current[current.Keys.ElementAt(0)]["Hour"];
                                        string minuteString    = current[current.Keys.ElementAt(0)]["Minute"];
                                        string secondString    = current[current.Keys.ElementAt(0)]["Second"];

                                        latitude  = double.Parse(latitudeString, _numberCulture.NumberFormat);
                                        longitude = double.Parse(longitudeString, _numberCulture.NumberFormat);

                                        speed   = double.Parse(speedString, _numberCulture.NumberFormat);
                                        heading = double.Parse(headingString, _numberCulture.NumberFormat);
                                        //roll
                                        DateTime dt = new DateTime(int.Parse(yearString), int.Parse(monthString),
                                                                   int.Parse(dayString));
                                        dt        = ZeroTime(dt);
                                        StartDate = dt;
                                        time      = new TimeSpan(0, int.Parse(hourString), int.Parse(minuteString),
                                                                 int.Parse(secondString), 0);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    groupException = ex;
                                }
                                line++;
                                string lineText = reader.ReadLine();
                                current  = NmeaParser.Parse(lineText);
                                newGroup = false;
                            }
                            if (time != null && groupException == null)
                            {
                                file.AddReading(StartDate + time.Value, latitude, longitude, 0, speed, heading, depth, waterTemperature, 0, relativeWindAngle, relativeWindSpeed, 0, 0);
                            }
                            else
                            {
                                //log something?
                                log.Append("The date and time could not be determined at line " + line);
                                log.Append(Environment.NewLine);
                            }
                            first = current;
                        }
                        catch (NMEAIgnoredSentenceException) {}
                        catch (NMEAUnkownSentenceException) {}
                        catch (NMEAEmptySentenceException) {}
                        catch (Exception e)
                        {
                            log.Append("Line " + line + ": " + e.Message);
                            log.Append(Environment.NewLine);
                        }
                    }

                    boat.AddFile(file);
                    if (log.Length > 0)
                    {
                        if (log.ToString().Length > 1000)
                        {
                            MessageBox.Show(log.ToString().Substring(0, 1000));
                        }
                        else
                        {
                            MessageBox.Show(log.ToString());
                        }
                    }
                    return(file);
                }
                else
                {
                    return(null);
                }
            }
            catch (Exception)
            {
                return(null);
            }
        }
コード例 #30
0
ファイル: AisDecoder.cs プロジェクト: nypan/ais
 public NmeaMessage GetNmeaMessage(string nmea)
 {
     return(NmeaParser.Parse(nmea));
 }
コード例 #31
0
		public NmeaLocationProvider(NmeaParser.NmeaDevice device)
		{
			this.device = device;
			device.MessageReceived += device_MessageReceived;
		}
コード例 #32
0
ファイル: FileGpsClient.cs プロジェクト: sakatuba/GPS.NET
        public override bool Connect()
        {
            var data = (FileGpsInfo)GpsInfo;

            IsRunning = true;
            OnGpsStatusChanged(GpsStatus.Connecting);

            var parser         = new NmeaParser();
            var gpsdDataParser = new GpsdDataParser();

            var headerLine      = true;
            var latColumnIndex  = 0;
            var longColumnIndex = 0;
            var minArraySize    = 0;

            try
            {
                using (var streamReader = File.OpenText(data.FilePath))
                {
                    string line;
                    OnGpsStatusChanged(GpsStatus.Connected);
                    while (IsRunning && (line = streamReader.ReadLine()) != null)
                    {
                        OnRawGpsDataReceived(line);
                        switch (data.FileType)
                        {
                        case FileType.Nmea:
                            var nmeaResult = parser.Parse(line);
                            var result     = nmeaResult as GprmcMessage;
                            if (result == null)
                            {
                                continue;
                            }
                            OnGpsDataReceived(new GpsDataEventArgs(result));
                            break;

                        case FileType.Gpsd:
                            var gpsdResult  = gpsdDataParser.GetGpsData(line);
                            var gpsLocation = gpsdResult as GpsLocation;
                            if (gpsLocation == null)
                            {
                                continue;
                            }
                            OnGpsDataReceived(new GpsDataEventArgs(gpsLocation));
                            break;

                        case FileType.LatitudeLongitude:
                            if (headerLine)
                            {
                                var headers = line.Split(';');

                                for (var i = 0; i < headers.Length; i++)
                                {
                                    if (headers[i] == Properties.Settings.Default.File_Latitude_Header)
                                    {
                                        latColumnIndex = i;
                                    }
                                    if (headers[i] == Properties.Settings.Default.File_Longitude_Header)
                                    {
                                        longColumnIndex = i;
                                    }
                                }
                                minArraySize = Math.Max(latColumnIndex, longColumnIndex);
                                headerLine   = false;
                            }
                            else
                            {
                                var latLongResult = line.Split(';');
                                if (latLongResult.Length < 2)
                                {
                                    throw new InvalidFileFormatException(data.FilePath);
                                }
                                if (latLongResult.Length < minArraySize)
                                {
                                    continue;
                                }

                                double latitude;
                                if (
                                    !double.TryParse(latLongResult[latColumnIndex], NumberStyles.Any,
                                                     CultureInfo.InvariantCulture, out latitude))
                                {
                                    continue;
                                }
                                double longitude;
                                if (
                                    !double.TryParse(latLongResult[longColumnIndex], NumberStyles.Any,
                                                     CultureInfo.InvariantCulture, out longitude))
                                {
                                    continue;
                                }

                                var message = new GpsDataEventArgs(latitude, longitude);
                                OnGpsDataReceived(message);
                            }
                            break;

                        default:
                            throw new ArgumentOutOfRangeException();
                        }
                        Thread.Sleep(data.ReadFrequenty);
                    }
                    Disconnect();
                    return(true);
                }
            }
            catch
            {
                Disconnect();
                throw;
            }
        }
コード例 #33
0
 public static NmeaMessage ParseNmea(string nmea)
 {
     return(NmeaParser.Parse(nmea));
 }