private void ParseRMCData(string[] Data) { // Check Status [2] // Don't bother parsing if void as it is probably invalid data if (Data[2] == "A") { double lastLat = _mapLatitude; double lastLng = _mapLongitude; double dTmp; //Get DateTime if (Data[1] != string.Empty && Data[9] != string.Empty) { double timeRawDouble = Double.Parse(Data[1]); int timeRaw = (int)timeRawDouble; int hours = timeRaw / 10000; int minutes = (timeRaw / 100) % 100; int seconds = timeRaw % 100; int milliseconds = (int)((timeRawDouble - timeRaw) * 1000.0); int dateRaw = Int32.Parse(Data[9]); int days = dateRaw / 10000; int months = (dateRaw / 100) % 100; int years = 2000 + (dateRaw % 100); _currentDateTime = new DateTime(years, months, days, hours, minutes, seconds); } // Latitude if (Data[3] != string.Empty && Data[4] != string.Empty) GeneralParseLatitude(Data[3], Data[4]); // Longitude if (Data[5] != string.Empty && Data[6] != string.Empty) GeneralParseLongitude(Data[5], Data[6]); // Raise Lat/Lng Event if (lastLat != _mapLatitude || lastLng != _mapLongitude) OnCoordinatesUpdated(this); // Speed (in Knots) if (Data[7] != string.Empty) { dTmp = double.Parse(Data[7]); if (_speed != dTmp) { _speed = dTmp; OnSpeedChanged(this, _speed, _speed * 1.151); } } // Course (in degrees) if (Data[8] != string.Empty) { dTmp = double.Parse(Data[8]); if (_course != dTmp) { _course = dTmp; OnCourseChanged(this, _course); } } // Next 2 messages are only available w/ GlobalTop Customization Service // So ignore them // Mode if (Data[12] != string.Empty) { switch (Data[12]) { case "D": if (_rmcMode != RMCModes.Differential) { _rmcMode = RMCModes.Differential; OnRMCModeChanged(this, _rmcMode); } break; case "E": if (_rmcMode != RMCModes.Estimated) { _rmcMode = RMCModes.Estimated; OnRMCModeChanged(this, _rmcMode); } break; default: if (_rmcMode != RMCModes.Autonomous) { _rmcMode = RMCModes.Autonomous; OnRMCModeChanged(this, _rmcMode); } break; } } //if (tokens[2] != "A") //{ // this.OnInvalidPositionReceived(this, null); // return; //} //double timeRawDouble = Double.Parse(tokens[1]); //int timeRaw = (int)timeRawDouble; //int hours = timeRaw / 10000; //int minutes = (timeRaw / 100) % 100; //int seconds = timeRaw % 100; //int milliseconds = (int)((timeRawDouble - timeRaw) * 1000.0); //int dateRaw = Int32.Parse(tokens[9]); //int days = dateRaw / 10000; //int months = (dateRaw / 100) % 100; //int years = 2000 + (dateRaw % 100); //Position position = new Position(); //position.FixTimeUtc = new DateTime(years, months, days, hours, minutes, seconds, milliseconds); //position.LatitudeString = tokens[3] + " " + tokens[4]; //position.LongitudeString = tokens[5] + " " + tokens[6]; //double latitudeRaw = double.Parse(tokens[3]); //int latitudeDegreesRaw = ((int)latitudeRaw) / 100; //double latitudeMinutesRaw = latitudeRaw - (latitudeDegreesRaw * 100); //position.Latitude = latitudeDegreesRaw + (latitudeMinutesRaw / 60.0); //if (tokens[4] == "S") // position.Latitude = -position.Latitude; //double longitudeRaw = double.Parse(tokens[5]); //int longitudeDegreesRaw = ((int)longitudeRaw) / 100; //double longitudeMinutesRaw = longitudeRaw - (longitudeDegreesRaw * 100); //position.Longitude = longitudeDegreesRaw + (longitudeMinutesRaw / 60.0); //if (tokens[6] == "W") // position.Longitude = -position.Longitude; //position.SpeedKnots = 0; //if (tokens[7] != "") // position.SpeedKnots = Double.Parse(tokens[7]); //position.CourseDegrees = 0; //if (tokens[8] != "") // position.CourseDegrees = Double.Parse(tokens[8]); //this.lastPositionReceived = GT.Timer.GetMachineTime(); //this.LastPosition = position; //this.OnPositionReceived(this, position); } }
protected virtual void OnRMCModeChanged(MTK3339 sender, RMCModes e) { if (RMCModeChanged != null) RMCModeChanged(sender, e); }