public void StartGpsReading(GpsdInfo data) { if (_streamReader == null || !_client.Connected) { throw new NotConnectedException(); } _retryReadCount = data.RetryRead; IsRunning = true; while (IsRunning) { if (!_client.Connected) { throw new ConnectionLostException(); } try { var gpsData = _streamReader.ReadLine(); OnRawGpsDataReceived(gpsData); if (gpsData == null) { if (_retryReadCount == 0) { Disconnect(); throw new ConnectionLostException(); } _retryReadCount--; continue; } var message = _gpsdDataParser.GetGpsData(gpsData); var gpsLocation = message as GpsLocation; if (gpsLocation == null || _previousReadTime != null && data.ReadFrequenty != 0 && gpsLocation.Time.Subtract(new TimeSpan(0, 0, 0, 0, data.ReadFrequenty)) <= _previousReadTime) { continue; } OnGpsDataReceived(new GpsDataEventArgs(gpsLocation)); _previousReadTime = gpsLocation.Time; } catch (IOException) { Disconnect(); throw; } } }
public override bool Connect() { var data = (GpsdInfo)GpsInfo; IsRunning = true; OnGpsStatusChanged(GpsStatus.Connecting); try { _client = data.IsProxyEnabled ? ProxyClientHandler.GetTcpClient(data) : new TcpClient(data.Address, data.Port); _streamReader = new StreamReader(_client.GetStream()); _streamWriter = new StreamWriter(_client.GetStream()); _gpsdDataParser = new GpsdDataParser(); var gpsData = ""; while (string.IsNullOrEmpty(gpsData)) { gpsData = _streamReader.ReadLine(); } var message = _gpsdDataParser.GetGpsData(gpsData); var version = message as GpsdVersion; if (version == null) { return(false); } ExecuteGpsdCommand(data.GpsOptions.GetCommand()); OnGpsStatusChanged(GpsStatus.Connected); StartGpsReading(data); } catch { Disconnect(); throw; } return(true); }
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; } }