Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Characteristic Locus
Inheritance object > MicroGraphics
Implements ITextDisplay
Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString()
Namespace Meadow.Foundation.Graphics
Assembly MicroGraphics.dll

Syntax

public class MicroGraphics : ITextDisplay

Constructors

MicroGraphics(IPixelBuffer, bool)

Create a new MicroGraphics instance from a pixel buffer instance

Declaration
public MicroGraphics(IPixelBuffer pixelBuffer, bool initializeBuffer)

Parameters

Type Name Description
IPixelBuffer pixelBuffer

The pixel buffer

bool initializeBuffer

Initialize the off-screen buffer if true

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

MicroGraphics(IGraphicsDisplay)

Create a new MicroGraphics instance from a display peripheral driver instance

Declaration
public MicroGraphics(IGraphicsDisplay display)

Parameters

Type Name Description
IGraphicsDisplay display

An IGraphicsDisplay object

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Fields

IgnoreOutOfBoundsPixels

ignore pixels that are outside of the pixel buffer coordinate space

Declaration
public bool IgnoreOutOfBoundsPixels

Field Value

Type Description
bool

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

canvasState

The current canvas state

Declaration
protected MicroGraphics.CanvasState? canvasState

Field Value

Type Description
MicroGraphics.CanvasState

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

display

Display object responsible for managing the buffer and rendering

Declaration
protected readonly IGraphicsDisplay? display

Field Value

Type Description
IGraphicsDisplay

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Properties

ColorMode

Current color mode

Declaration
public ColorMode ColorMode { get; }

Property Value

Type Description
ColorMode

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

CurrentFont

Font used for drawing text to the display

Declaration
public IFont CurrentFont { get; set; }

Property Value

Type Description
IFont

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

CursorColumn

The current cursor column relative to text/font

Declaration
public byte CursorColumn { get; }

Property Value

Type Description
byte

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

CursorLine

The current cursor line relative to the text

Declaration
public byte CursorLine { get; }

Property Value

Type Description
byte

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DelayBetweenFrames

Optional enforced delay between updates when calling ShowBuffered

Declaration
public TimeSpan DelayBetweenFrames { get; set; }

Property Value

Type Description
TimeSpan

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DisabledColor

The color used when a pixel is not enabled (off)

Declaration
public Color DisabledColor { get; }

Property Value

Type Description
Color

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DisplayConfig

Text display configuration for use with text display menu

Declaration
public TextDisplayConfig DisplayConfig { get; }

Property Value

Type Description
TextDisplayConfig

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

EnabledColor

The color used when a pixel is enabled (on)

Declaration
public Color EnabledColor { get; }

Property Value

Type Description
Color

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Height

Return the height of the display after accounting for the rotation

Declaration
public int Height { get; }

Property Value

Type Description
int

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

PenColor

Current pen color

Declaration
public Color PenColor { get; set; }

Property Value

Type Description
Color

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

PixelBuffer

PixelBuffer draw target

Declaration
protected IPixelBuffer PixelBuffer { get; }

Property Value

Type Description
IPixelBuffer

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Rotation

Current rotation used for drawing pixels to the display

Declaration
public RotationType Rotation { get; set; }

Property Value

Type Description
RotationType

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Stroke

Stroke / line thickness when drawing lines or shape outlines

Declaration
public int Stroke { get; set; }

Property Value

Type Description
int

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Width

Return the width of the display after accounting for the rotation

Declaration
public int Width { get; }

Property Value

Type Description
int

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Methods

Clear(Color, bool)

Clear the pixel buffer to a color

Declaration
public virtual void Clear(Color color, bool updateDisplay = false)

Parameters

Type Name Description
Color color

Color to set display

bool updateDisplay

Update the display immediately when true

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Clear(bool)

Clear the pixel buffer

Declaration
public virtual void Clear(bool updateDisplay = false)

Parameters

Type Name Description
bool updateDisplay

Update the display immediately when true

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Clear(int, int, int, int, bool)

Clear a region of the display pixel buffer

Declaration
public virtual void Clear(int originX, int originY, int width, int height, bool updateDisplay = false)

Parameters

Type Name Description
int originX

The X coord to start

int originY

The Y coord to start

int width

The width of the region to clear

int height

The height of the region to clear

bool updateDisplay

Update the display immediately when true

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

ClearLine(byte)

Clear a single line of text

Declaration
public void ClearLine(byte lineNumber)

Parameters

Type Name Description
byte lineNumber

The line to clear

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

ClearLines()

Clear all lines of text

Declaration
public void ClearLines()

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawArc(int, int, int, Angle, Angle, Color, bool)

Draw a circular arc between two angles

Declaration
public void DrawArc(int centerX, int centerY, int radius, Angle startAngle, Angle endAngle, Color color, bool centerBetweenPixels = true)

Parameters

Type Name Description
int centerX

Abscissa of the center point of the circle

int centerY

Ordinate of the center point of the circle

int radius

Radius of the circle

Angle startAngle

The arc starting angle

Angle endAngle

The arc ending angle

Color color

The color of the circle

bool centerBetweenPixels

If true, the center of the arc is between the assigned pixel and the next pixel, false it's directly on the center pixel

Remarks

Note that y axis is inverted so the arc will be flipped from the standard cartesian plain

DrawArc(int, int, int, Angle, Angle, bool)

Draw a circular arc between two angles using PenColor

Declaration
public void DrawArc(int centerX, int centerY, int radius, Angle startAngle, Angle endAngle, bool centerBetweenPixels = true)

Parameters

Type Name Description
int centerX

Abscissa of the center point of the circle

int centerY

Ordinate of the center point of the circle

int radius

Radius of the circle

Angle startAngle

The arc starting angle

Angle endAngle

The arc ending angle

bool centerBetweenPixels

If true, the center of the arc is between the assigned pixel and the next pixel, false it's directly on the center pixel

Remarks

Note that y axis is inverted so the arc will be flipped from the standard Cartesian plain

DrawArc(int, int, int, Angle, Angle, bool, bool)

Draw a circular arc between two angles

Declaration
public void DrawArc(int centerX, int centerY, int radius, Angle startAngle, Angle endAngle, bool enabled = true, bool centerBetweenPixels = true)

Parameters

Type Name Description
int centerX

Abscissa of the center point of the circle

int centerY

Ordinate of the center point of the circle

int radius

Radius of the circle

Angle startAngle

The arc starting angle

Angle endAngle

The arc ending angle

bool enabled

Should draw the arc (true) or remove (false)

bool centerBetweenPixels

If true, the center of the arc is between the assigned pixel and the next pixel, false it's directly on the center pixel

Remarks

Note that y axis is inverted so the arc will be flipped from the standard Cartesian plain

DrawBitmap(int, int, int, int, byte[], Color, ScaleFactor)

Writes a 1-bit bitmap stored in a byte array

Declaration
protected void DrawBitmap(int x, int y, int width, int height, byte[] bitmap, Color color, ScaleFactor scaleFactor = ScaleFactor.X1)

Parameters

Type Name Description
int x

Abscissa of the top left corner of the bitmap

int y

Ordinate of the top left corner of the bitmap

int width

Width of the bitmap in pixels

int height

Height of the bitmap in pixels

byte[] bitmap

Bitmap to display

Color color

The color of the bitmap

ScaleFactor scaleFactor

The integer scale factor (default is 1)

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawBitmap(int, int, int, int, byte[], ScaleFactor)

Writes a 1-bit bitmap to the buffer - used for font rendering

Declaration
protected void DrawBitmap(int x, int y, int width, int height, byte[] bitmap, ScaleFactor scaleFactor = ScaleFactor.X1)

Parameters

Type Name Description
int x

Abscissa of the top left corner of the bitmap

int y

Ordinate of the top left corner of the bitmap

int width

Width of the bitmap in pixels

int height

Height of the bitmap in pixels

byte[] bitmap

Bitmap to display

ScaleFactor scaleFactor

The integer scale factor (default is 1)

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawBuffer(int, int, IPixelBuffer)

Draw a buffer onto the display buffer at the given location For best performance, source buffer should be the same color depth as the target display

Declaration
public void DrawBuffer(int x, int y, IPixelBuffer buffer)

Parameters

Type Name Description
int x

x location of target to draw buffer

int y

x location of target to draw buffer

IPixelBuffer buffer

the source buffer to write to the display buffer

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawBuffer(int, int, IPixelBuffer, HorizontalAlignment, VerticalAlignment)

Draw a buffer onto the display buffer at the given location For best performance, source buffer should be the same color depth as the target display

Declaration
public void DrawBuffer(int x, int y, IPixelBuffer buffer, HorizontalAlignment alignmentH = HorizontalAlignment.Left, VerticalAlignment alignmentV = VerticalAlignment.Top)

Parameters

Type Name Description
int x

x location of target to draw buffer

int y

x location of target to draw buffer

IPixelBuffer buffer

the source buffer to write to the display buffer

HorizontalAlignment alignmentH

Horizontal alignment: Left, Center or right align the buffer to the x location

VerticalAlignment alignmentV

Vertical alignment: Top, Center or bottom align the buffer to the y location

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawCircle(int, int, int, Color, bool, bool)

Draw a circle

Declaration
public void DrawCircle(int centerX, int centerY, int radius, Color color, bool filled = false, bool centerBetweenPixels = false)

Parameters

Type Name Description
int centerX

Abscissa of the center point of the circle

int centerY

Ordinate of the center point of the circle

int radius

Radius of the circle

Color color

The color of the circle

bool filled

Draw a filled circle

bool centerBetweenPixels

If true, the center of the circle is between the assigned pixel and the next pixel, false it's directly on the center pixel

Remarks

This algorithm draws the circle by splitting the full circle into eight segments This method uses the Midpoint algorithm: https://en.wikipedia.org/wiki/Midpoint_circle_algorithm

DrawCircle(int, int, int, bool, bool)

Draw a circle

Declaration
public void DrawCircle(int centerX, int centerY, int radius, bool filled = false, bool centerBetweenPixels = false)

Parameters

Type Name Description
int centerX

Abscissa of the center point of the circle

int centerY

Ordinate of the center point of the circle

int radius

Radius of the circle

bool filled

Draw a filled circle?

bool centerBetweenPixels

If true, the center of the circle is between the assigned pixel and the next pixel, false it's directly on the center pixel

Remarks

This algorithm draws the circle by splitting the full circle into eight segments This method uses the Midpoint algorithm: https://en.wikipedia.org/wiki/Midpoint_circle_algorithm

DrawCircle(int, int, int, bool, bool, bool)

Draw a circle

Declaration
public void DrawCircle(int centerX, int centerY, int radius, bool enabled, bool filled = false, bool centerBetweenPixels = false)

Parameters

Type Name Description
int centerX

Abscissa of the center point of the circle

int centerY

Ordinate of the center point of the circle

int radius

Radius of the circle

bool enabled

Show the circle when true

bool filled

Draw a filled circle?

bool centerBetweenPixels

Set center between pixels

Remarks

This algorithm draws the circle by splitting the full circle into eight segments. This method uses the Midpoint algorithm: https://en.wikipedia.org/wiki/Midpoint_circle_algorithm

DrawCircleQuadrant(int, int, int, int, Color, bool, bool)

Draws a circle quadrant (quarter circle)

Declaration
public void DrawCircleQuadrant(int centerX, int centerY, int radius, int quadrant, Color color, bool filled = false, bool centerBetweenPixels = false)

Parameters

Type Name Description
int centerX
int centerY
int radius
int quadrant
Color color
bool filled
bool centerBetweenPixels

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawCircleQuadrant(int, int, int, int, bool, bool)

Draws a circle quadrant (quarter circle)

Declaration
public void DrawCircleQuadrant(int centerX, int centerY, int radius, int quadrant, bool filled = false, bool centerBetweenPixels = false)

Parameters

Type Name Description
int centerX
int centerY
int radius
int quadrant
bool filled
bool centerBetweenPixels

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawCircleQuadrant(int, int, int, int, bool, bool, bool)

Draws a circle quadrant (quarter circle)

Declaration
public void DrawCircleQuadrant(int centerX, int centerY, int radius, int quadrant, bool enabled = true, bool filled = false, bool centerBetweenPixels = false)

Parameters

Type Name Description
int centerX
int centerY
int radius
int quadrant
bool enabled
bool filled
bool centerBetweenPixels

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawHorizontalLine(int, int, int)

Draw a horizontal line

Declaration
public void DrawHorizontalLine(int x, int y, int length)

Parameters

Type Name Description
int x

Abscissa of the starting point of the line

int y

Ordinate of the starting point of the line

int length

Length of the line to draw

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawHorizontalLine(int, int, int, Color)

Draw a horizontal line

Declaration
public void DrawHorizontalLine(int x, int y, int length, Color color)

Parameters

Type Name Description
int x

Abscissa of the starting point of the line

int y

Ordinate of the starting point of the line

int length

Length of the line to draw

Color color

The color of the line

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawHorizontalLine(int, int, int, bool)

Draw a horizontal line.

Declaration
public void DrawHorizontalLine(int x, int y, int length, bool enabled)

Parameters

Type Name Description
int x

Abscissa of the starting point of the line

int y

Ordinate of the starting point of the line

int length

Length of the line to draw

bool enabled

Turn the pixel on (true) or off (false)

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawImage(Image)

Draw an Image onto the display buffer at (0, 0)

Declaration
public void DrawImage(Image image)

Parameters

Type Name Description
Image image

the source image to write to the display buffer

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawImage(int, int, Image)

Draw an Image onto the display buffer at the specified location

Declaration
public void DrawImage(int x, int y, Image image)

Parameters

Type Name Description
int x

x location of target to draw buffer

int y

x location of target to draw buffer

Image image

the source image to write to the display buffer

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawImage(int, int, Image, HorizontalAlignment, VerticalAlignment)

Draw an Image onto the display buffer at the specified location

Declaration
public void DrawImage(int x, int y, Image image, HorizontalAlignment alignmentH = HorizontalAlignment.Left, VerticalAlignment alignmentV = VerticalAlignment.Top)

Parameters

Type Name Description
int x

x location of target to draw buffer

int y

x location of target to draw buffer

Image image

the source image to write to the display buffer

HorizontalAlignment alignmentH

Horizontal alignment: Left, Center or right align the image to the x location

VerticalAlignment alignmentV

Vertical alignment: Top, Center or bottom align the image to the y location

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawLine(int, int, int, int)

Draw a line using Bresenhams line drawing algorithm

Declaration
public void DrawLine(int x0, int y0, int x1, int y1)

Parameters

Type Name Description
int x0

Abscissa of the starting point of the line

int y0

Ordinate of the starting point of the line

int x1

Abscissa of the end point of the line

int y1

Ordinate of the end point of the line

Remarks

DrawLine(int, int, int, int, Color)

Draw a line using Bresenhams line drawing algorithm

Declaration
public void DrawLine(int x0, int y0, int x1, int y1, Color color)

Parameters

Type Name Description
int x0

Abscissa of the starting point of the line

int y0

Ordinate of the starting point of the line

int x1

Abscissa of the end point of the line

int y1

Ordinate of the end point of the line

Color color

Color of the line to be drawn

Remarks

DrawLine(int, int, int, int, bool)

Draw a line using Bresenhams line drawing algorithm

Declaration
public void DrawLine(int x0, int y0, int x1, int y1, bool enabled)

Parameters

Type Name Description
int x0

Abscissa of the starting point of the line

int y0

Ordinate of the starting point of the line

int x1

Abscissa of the end point of the line

int y1

Ordinate of the end point of the line

bool enabled

Turn the pixel on (true) or off (false)

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawLine(int, int, int, float, Color)

Draw a line from a point to a position defined by a radius and an angle

Declaration
public void DrawLine(int x, int y, int length, float angle, Color color)

Parameters

Type Name Description
int x
int y

Ordinate of the starting point of the line

int length

length of line

float angle

angle to draw line in radians

Color color

The color of the line

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawLine(int, int, int, float, bool)

Draw a line using polar coordinates

Declaration
public void DrawLine(int x, int y, int length, float angle, bool enabled)

Parameters

Type Name Description
int x

Abscissa of the starting point of the line

int y

Ordinate of the starting point of the line

int length

Length of line

float angle

Angle in radians

bool enabled

Turn the pixel on (true) or off (false)

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawPath(GraphicsPath)

Draw a graphics path

Declaration
public void DrawPath(GraphicsPath path)

Parameters

Type Name Description
GraphicsPath path

The path

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawPath(GraphicsPath, Color)

Draw a graphics path

Declaration
public void DrawPath(GraphicsPath path, Color color)

Parameters

Type Name Description
GraphicsPath path

The path

Color color

The color to draw the path

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawPath(GraphicsPath, bool)

Draw a graphics path

Declaration
public void DrawPath(GraphicsPath path, bool enabled)

Parameters

Type Name Description
GraphicsPath path

The path

bool enabled

Should pixels be enabled (on) or disabled (off)

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawPixel(int)

Draw a single pixel using the pen color

Declaration
public virtual void DrawPixel(int index)

Parameters

Type Name Description
int index

pixel location in buffer

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawPixel(int, int)

Draw a single pixel

Declaration
public virtual void DrawPixel(int x, int y)

Parameters

Type Name Description
int x

x location

int y

y location

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawPixel(int, int, Color)

Draw a single pixel using the pen color

Declaration
public virtual void DrawPixel(int x, int y, Color color)

Parameters

Type Name Description
int x

x location

int y

y location

Color color

Color of pixel

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawPixel(int, int, bool)

Draw a single pixel

Declaration
public void DrawPixel(int x, int y, bool enabled)

Parameters

Type Name Description
int x

x location

int y

y location

bool enabled

Turn the pixel on (true) or off (false)

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawRectangle(int, int, int, int, Color, bool)

Draw a rectangle

Declaration
public void DrawRectangle(int x, int y, int width, int height, Color color, bool filled = false)

Parameters

Type Name Description
int x

Abscissa of the top left corner

int y

Ordinate of the top left corner

int width

Width of the rectangle

int height

Height of the rectangle

Color color

The color of the rectangle

bool filled

Fill the rectangle (true) or draw the outline (false, default)

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawRectangle(int, int, int, int, bool)

Draw a rectangle

Declaration
public void DrawRectangle(int x, int y, int width, int height, bool filled = false)

Parameters

Type Name Description
int x

Abscissa of the top left corner

int y

Ordinate of the top left corner

int width

Width of the rectangle

int height

Height of the rectangle

bool filled

Fill the rectangle (true) or draw the outline (false, default)

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawRectangle(int, int, int, int, bool, bool)

Draw a rectangle

Declaration
public void DrawRectangle(int x, int y, int width, int height, bool enabled, bool filled = false)

Parameters

Type Name Description
int x

Abscissa of the top left corner

int y

Ordinate of the top left corner

int width

Width of the rectangle

int height

Height of the rectangle

bool enabled

Turn pixels on (true) or turn pixels off (false)

bool filled

Fill the rectangle (true) or draw the outline (false, default)

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawRoundedRectangle(int, int, int, int, int, Color, bool)

Draw a rounded rectangle

Declaration
public void DrawRoundedRectangle(int x, int y, int width, int height, int cornerRadius, Color color, bool filled = false)

Parameters

Type Name Description
int x

Abscissa of the top left corner

int y

Ordinate of the top left corner

int width

Width of the rectangle

int height

Height of the rectangle

int cornerRadius

Radius of the corners of the rectangle

Color color

The color of the rectangle

bool filled

Fill the rectangle (true) or draw the outline (false, default)

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawRoundedRectangle(int, int, int, int, int, bool)

Draw a rounded rectangle

Declaration
public void DrawRoundedRectangle(int x, int y, int width, int height, int cornerRadius, bool filled = false)

Parameters

Type Name Description
int x

Abscissa of the top left corner

int y

Ordinate of the top left corner

int width

Width of the rectangle

int height

Height of the rectangle

int cornerRadius

Radius of the corners of the rectangle

bool filled

Fill the rectangle (true) or draw the outline (false, default)

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawRoundedRectangle(int, int, int, int, int, bool, bool)

Draw a rounded rectangle

Declaration
public void DrawRoundedRectangle(int x, int y, int width, int height, int cornerRadius, bool enabled, bool filled = false)

Parameters

Type Name Description
int x

Abscissa of the top left corner

int y

Ordinate of the top left corner

int width

Width of the rectangle

int height

Height of the rectangle

int cornerRadius

Radius of the corners of the rectangle

bool enabled

Turn pixels on (true) or turn pixels off (false)

bool filled

Fill the rectangle (true) or draw the outline (false, default)

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawText(int, int, string, Color, ScaleFactor, HorizontalAlignment, VerticalAlignment, IFont?)

Draw a text message on the display using the current font.

Declaration
public void DrawText(int x, int y, string text, Color color, ScaleFactor scaleFactor = ScaleFactor.X1, HorizontalAlignment alignmentH = HorizontalAlignment.Left, VerticalAlignment alignmentV = VerticalAlignment.Top, IFont? font = null)

Parameters

Type Name Description
int x

Abscissa of the location of the text

int y

Ordinate of the location of the text

string text

Text to display

Color color

Color of the text

ScaleFactor scaleFactor

Scale factor used to calculate the size

HorizontalAlignment alignmentH

Horizontal alignment: Left, Center or right aligned text

VerticalAlignment alignmentV

Vertical alignment: Top, Center or bottom aligned text

IFont font

Optional font used to draw the text

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawText(int, int, string, ScaleFactor, HorizontalAlignment, VerticalAlignment)

Draw a text message on the display using the current font

Declaration
public void DrawText(int x, int y, string text, ScaleFactor scaleFactor = ScaleFactor.X1, HorizontalAlignment alignmentH = HorizontalAlignment.Left, VerticalAlignment alignmentV = VerticalAlignment.Top)

Parameters

Type Name Description
int x

Abscissa of the location of the text

int y

Ordinate of the location of the text

string text

Text to display

ScaleFactor scaleFactor

Scale factor used to calculate the size

HorizontalAlignment alignmentH

Horizontal alignment: Left, Center or right aligned text

VerticalAlignment alignmentV

Vertical alignment: Top, Center or bottom aligned text

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawTriangle(int, int, int, int, int, int, Color, bool)

Draw a triangle

Declaration
public void DrawTriangle(int x0, int y0, int x1, int y1, int x2, int y2, Color color, bool filled = false)

Parameters

Type Name Description
int x0

Vertex #0 x coordinate

int y0

Vertex #0 y coordinate

int x1

Vertex #1 x coordinate

int y1

Vertex #1 y coordinate

int x2

Vertex #2 x coordinate

int y2

Vertex #2 y coordinate

Color color

Color of triangle

bool filled

Draw a filled triangle?

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawTriangle(int, int, int, int, int, int, bool)

Draw a triangle

Declaration
public void DrawTriangle(int x0, int y0, int x1, int y1, int x2, int y2, bool filled = false)

Parameters

Type Name Description
int x0

Vertex #0 x coordinate

int y0

Vertex #0 y coordinate

int x1

Vertex #1 x coordinate

int y1

Vertex #1 y coordinate

int x2

Vertex #2 x coordinate

int y2

Vertex #2 y coordinate

bool filled

Draw a filled triangle?

Remarks

Draw triangle method for 1 bit displays

DrawTriangle(int, int, int, int, int, int, bool, bool)

Draw a triangle

Declaration
public void DrawTriangle(int x0, int y0, int x1, int y1, int x2, int y2, bool enabled = true, bool filled = false)

Parameters

Type Name Description
int x0

Vertex #0 x coordinate

int y0

Vertex #0 y coordinate

int x1

Vertex #1 x coordinate

int y1

Vertex #1 y coordinate

int x2

Vertex #2 x coordinate

int y2

Vertex #2 y coordinate

bool enabled

Should the triangle add (true) or remove (false)

bool filled

Draw a filled triangle?

Remarks

Draw triangle method for 1 bit displays

DrawVerticalLine(int, int, int)

Draw a vertical line

Declaration
public void DrawVerticalLine(int x, int y, int length)

Parameters

Type Name Description
int x

Abscissa of the starting point of the line

int y

Ordinate of the starting point of the line

int length

Length of the line to draw

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawVerticalLine(int, int, int, Color)

Draw a vertical line

Declaration
public void DrawVerticalLine(int x, int y, int length, Color color)

Parameters

Type Name Description
int x

Abscissa of the starting point of the line

int y

Ordinate of the starting point of the line

int length

Length of the line to draw

Color color

The color of the line

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

DrawVerticalLine(int, int, int, bool)

Draw a vertical line.

Declaration
public void DrawVerticalLine(int x, int y, int length, bool enabled)

Parameters

Type Name Description
int x

Abscissa of the starting point of the line

int y

Ordinate of the starting point of the line

int length

Length of the line to draw

bool enabled

Show the line when (true) or off (false)

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

GetXForRotation(int, int)

Get x pixel position for the current graphics rotation

Declaration
public int GetXForRotation(int x, int y)

Parameters

Type Name Description
int x

The non-rotated x position

int y

The non-rotated y position

Returns

Type Description
int

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

GetYForRotation(int, int)

Get y pixel position for the current graphics rotation

Declaration
public int GetYForRotation(int x, int y)

Parameters

Type Name Description
int x

The non-rotated x position

int y

The non-rotated y position

Returns

Type Description
int

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

InvertPixel(int, int)

Invert the color of the pixel at the given location

Declaration
public void InvertPixel(int x, int y)

Parameters

Type Name Description
int x

x location

int y

y location

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

InvertRectangle(int, int, int, int)

Invert all pixels within a rectangle

Declaration
public virtual void InvertRectangle(int x, int y, int width, int height)

Parameters

Type Name Description
int x

x start

int y

y start

int width

width of area to invert

int height

height of area to invert

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

MeasureText(string, IFont, ScaleFactor)

Get the size in pixels of a string for a given font and scale factor

Declaration
public Size MeasureText(string text, IFont font, ScaleFactor scaleFactor = ScaleFactor.X1)

Parameters

Type Name Description
string text

The string to measure

IFont font

The font used to calculate the text size

ScaleFactor scaleFactor

Scale factor used to calculate the size

Returns

Type Description
Size

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

MeasureText(string, ScaleFactor)

Get the size in pixels of a string using the current font

Declaration
public Size MeasureText(string text, ScaleFactor scaleFactor = ScaleFactor.X1)

Parameters

Type Name Description
string text

The string to measure

ScaleFactor scaleFactor

Scale factor used to calculate the size

Returns

Type Description
Size

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

RestoreState()

Restore saved state variables and apply them to the MicroGraphics instance Includes: CurrentFont, Stroke, and Rotation

Declaration
public void RestoreState()

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

SaveState()

Save any state variables Includes: CurrentFont, Stroke, and Rotation

Declaration
public void SaveState()

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

SetCursorPosition(byte, byte)

Set the cursor position relative to the text

Declaration
public void SetCursorPosition(byte column, byte line)

Parameters

Type Name Description
byte column

The text column

byte line

The line column

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Show()

Update the display target from the buffer (thread safe)

Declaration
public virtual void Show()

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Show(Rect)

Update a region of the display Note: not all displays support partial updates

Declaration
public virtual void Show(Rect rect)

Parameters

Type Name Description
Rect rect

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Show(int, int, int, int)

Update a region of the display Note: not all displays support partial updates

Declaration
public virtual void Show(int left, int top, int right, int bottom)

Parameters

Type Name Description
int left
int top
int right
int bottom

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

ShowBuffered()

Update the display target from the buffer (thread safe) while respecting MinimumTimeBetweenUpdates

Declaration
public virtual Task ShowBuffered()

Returns

Type Description
Task

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

ShowUnsafe()

Update the display target from the buffer (not thread safe)

Declaration
public virtual void ShowUnsafe()

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

ShowUnsafe(int, int, int, int)

Update a region of the display Note: not all displays support partial updates

Declaration
public virtual void ShowUnsafe(int left, int top, int right, int bottom)

Parameters

Type Name Description
int left
int top
int right
int bottom

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Write(string)

Write text to the display

Declaration
public void Write(string text)

Parameters

Type Name Description
string text

The text

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Exceptions

Type Condition
Exception

Throws if no font is set

WriteLine(string, byte, bool)

Write a line of text

Declaration
public void WriteLine(string text, byte lineNumber, bool showCursor = false)

Parameters

Type Name Description
string text

The text

byte lineNumber

The line to write

bool showCursor

True to show the cursor

Remarks

NmeaProcessor
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Location.Gnss.NmeaProcessor
List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public MeadowApp()
{
    Initialize();
}

void Initialize()
{
    Console.WriteLine("Initialize");
    this.sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) {
        Console.WriteLine($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Console.WriteLine("Made it through all sentences");
}

void InitDecoders()
{
    Console.WriteLine("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Console.WriteLine("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Console.WriteLine("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(location);
        Console.WriteLine("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(activeSatellites);
        Console.WriteLine("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine(positionCourseAndTime);
        Console.WriteLine("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{courseAndVelocity}");
        Console.WriteLine("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Console.WriteLine("*********************************************");
        Console.WriteLine($"{satellites}");
        Console.WriteLine("*********************************************");
    };

}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Code Example

List<string> sentences;
NmeaSentenceProcessor nmeaProcessor;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");
    
    sentences = GetSampleNmeaSentences();

    InitDecoders();

    foreach (string sentence in sentences) 
    {
        Resolver.Log.Info($"About to process:{sentence}");
        nmeaProcessor.ProcessNmeaMessage(sentence);
    }

    Resolver.Log.Info("Made it through all sentences");

    return Task.CompletedTask;
}

void InitDecoders()
{
    Resolver.Log.Info("Create NMEA");
    nmeaProcessor = new NmeaSentenceProcessor();

    Resolver.Log.Info("Add decoders");

    // GGA
    var ggaDecoder = new GgaDecoder();
    Resolver.Log.Info("Created GGA");
    nmeaProcessor.RegisterDecoder(ggaDecoder);
    ggaDecoder.PositionReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GLL
    var gllDecoder = new GllDecoder();
    nmeaProcessor.RegisterDecoder(gllDecoder);
    gllDecoder.GeographicLatitudeLongitudeReceived += (object sender, GnssPositionInfo location) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(location.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // GSA
    var gsaDecoder = new GsaDecoder();
    nmeaProcessor.RegisterDecoder(gsaDecoder);
    gsaDecoder.ActiveSatellitesReceived += (object sender, ActiveSatellites activeSatellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(activeSatellites.ToString());
        Resolver.Log.Info("*********************************************");
    };

    // RMC (recommended minimum)
    var rmcDecoder = new RmcDecoder();
    nmeaProcessor.RegisterDecoder(rmcDecoder);
    rmcDecoder.PositionCourseAndTimeReceived += (object sender, GnssPositionInfo positionCourseAndTime) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info(positionCourseAndTime.ToString());
        Resolver.Log.Info("*********************************************");

    };

    // VTG (course made good)
    var vtgDecoder = new VtgDecoder();
    nmeaProcessor.RegisterDecoder(vtgDecoder);
    vtgDecoder.CourseAndVelocityReceived += (object sender, CourseOverGround courseAndVelocity) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{courseAndVelocity}");
        Resolver.Log.Info("*********************************************");
    };

    // GSV (satellites in view)
    var gsvDecoder = new GsvDecoder();
    nmeaProcessor.RegisterDecoder(gsvDecoder);
    gsvDecoder.SatellitesInViewReceived += (object sender, SatellitesInView satellites) => {
        Resolver.Log.Info("*********************************************");
        Resolver.Log.Info($"{satellites}");
        Resolver.Log.Info("*********************************************");
    };
}

List<string> GetSampleNmeaSentences()
{
    List<string> sentences = new List<string>() {
        "$GPGGA,000049.799,,,,,0,00,,,M,,M,,*72", // i think not valid.
        "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47", // valid
        "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B", // valid
        "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34", // Valid
        "$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32",
        "$GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74",
        "$GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F",
        "$GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65",
        "$GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02",

        "$GPGSA,A,3,10,32,14,01,,,,,,,,,2.41,2.20,0.99*01",

        "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74",
        "$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74",
        "$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D",

        "$GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C",
        "$GPZDA,162254.00,11,07,2006,00,00*63",
        "$GNGLL,,,,,,V,N*7A",
        "$GLGSV,1,1,00*65",
    };

    return sentences;
}

Sample project(s) available on GitHub

Exceptions

Type Condition
Exception

Throws if no font is set