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);
 }