Addressed all code analysis warnings (note: Some minor breaking changes to follow naming guidelines)

This commit is contained in:
mort5161 2014-11-14 17:36:46 -08:00
parent 32b9a8b9eb
commit 9c37a40bc0
31 changed files with 347 additions and 181 deletions

37
src/CustomDictionary.xml Normal file
View file

@ -0,0 +1,37 @@
<Dictionary>
<Words>
<Recognized>
<Word>Nmea</Word>
</Recognized>
<Recognized>
<Word>Gps</Word>
</Recognized>
<Recognized>
<Word>Dgps</Word>
</Recognized>
<!--
<Unrecognized>
<Word>Gps</Word>
</Unrecognized>
<Unrecognized>
<Word>Nmea</Word>
</Unrecognized>
<Deprecated>
<Term PreferredAlternate=""></Term>
</Deprecated>
<Compound>
<Term CompoundAlternate=""></Term>
</Compound>
<DiscreteExceptions>
<Term></Term>
</DiscreteExceptions>
-->
</Words>
<!--<Acronyms>
<CasingExceptions>
<Acronym>Gps</Acronym>
<Acronym>Nmea</Acronym>
<Acronym>Dgps</Acronym>
</CasingExceptions>
</Acronyms> -->
</Dictionary>

BIN
src/GlobalSuppressions.cs Normal file

Binary file not shown.

View file

@ -32,10 +32,16 @@ namespace NmeaParser
BufferedStream m_stream;
int m_readSpeed;
/// <summary>
///
/// Initializes a new instance of the <see cref="BufferedStreamDevice"/> class.
/// </summary>
protected BufferedStreamDevice() : this(200)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="BufferedStreamDevice"/> class.
/// </summary>
/// <param name="readSpeed">The time to wait between each line being read in milliseconds</param>
protected BufferedStreamDevice( int readSpeed = 200)
protected BufferedStreamDevice(int readSpeed)
{
m_readSpeed = readSpeed;
}
@ -44,6 +50,7 @@ namespace NmeaParser
/// Gets the stream to perform buffer reads on.
/// </summary>
/// <returns></returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")]
protected abstract Task<System.IO.Stream> GetStreamAsync();
/// <summary>
@ -74,8 +81,8 @@ namespace NmeaParser
private class BufferedStream : Stream
{
StreamReader m_sr;
byte[] buffer = new byte[0];
System.Threading.Timer timer;
byte[] m_buffer = new byte[0];
System.Threading.Timer m_timer;
object lockObj = new object();
/// <summary>
/// Initializes a new instance of the <see cref="BufferedStream"/> class.
@ -85,7 +92,7 @@ namespace NmeaParser
public BufferedStream(StreamReader stream, int readSpeed)
{
m_sr = stream;
timer = new System.Threading.Timer(OnRead, null, 0, readSpeed); //add a new line to buffer every 100 ms
m_timer = new System.Threading.Timer(OnRead, null, 0, readSpeed); //add a new line to buffer every 100 ms
}
private void OnRead(object state)
{
@ -97,10 +104,10 @@ namespace NmeaParser
var bytes = Encoding.UTF8.GetBytes(line);
lock (lockObj)
{
byte[] newBuffer = new byte[buffer.Length + bytes.Length];
buffer.CopyTo(newBuffer, 0);
bytes.CopyTo(newBuffer, buffer.Length);
buffer = newBuffer;
byte[] newBuffer = new byte[m_buffer.Length + bytes.Length];
m_buffer.CopyTo(newBuffer, 0);
bytes.CopyTo(newBuffer, m_buffer.Length);
m_buffer = newBuffer;
}
}
/// <summary>
@ -162,19 +169,19 @@ namespace NmeaParser
{
lock (lockObj)
{
if (this.buffer.Length <= count)
if (this.m_buffer.Length <= count)
{
int length = this.buffer.Length;
this.buffer.CopyTo(buffer, 0);
this.buffer = new byte[0];
int length = this.m_buffer.Length;
this.m_buffer.CopyTo(buffer, 0);
this.m_buffer = new byte[0];
return length;
}
else
{
Array.Copy(this.buffer, buffer, count);
byte[] newBuffer = new byte[this.buffer.Length - count];
Array.Copy(this.buffer, count, newBuffer, 0, newBuffer.Length);
this.buffer = newBuffer;
Array.Copy(this.m_buffer, buffer, count);
byte[] newBuffer = new byte[this.m_buffer.Length - count];
Array.Copy(this.m_buffer, count, newBuffer, 0, newBuffer.Length);
this.m_buffer = newBuffer;
return count;
}
}
@ -203,7 +210,7 @@ namespace NmeaParser
}
/// <summary>
/// Writes the specified buffer.
/// Writes the specified buffer to the device.
/// </summary>
/// <param name="buffer">The buffer.</param>
/// <param name="offset">The offset.</param>
@ -222,7 +229,7 @@ namespace NmeaParser
{
base.Dispose(disposing);
m_sr.Dispose();
timer.Dispose();
m_timer.Dispose();
}
}
}

View file

@ -26,7 +26,8 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// Bearing Origin to Destination
/// </summary>
[NmeaMessageType(Type = "GPBOD")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gpbod")]
[NmeaMessageType("GPBOD")]
public class Gpbod : NmeaMessage
{
/// <summary>
@ -35,6 +36,8 @@ namespace NmeaParser.Nmea.Gps
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
if (message == null || message.Length < 3)
throw new ArgumentException("Invalid GPBOD", "message");
if (message[0].Length > 0)
TrueBearing = double.Parse(message[0], CultureInfo.InvariantCulture);
else
@ -44,9 +47,9 @@ namespace NmeaParser.Nmea.Gps
else
MagneticBearing = double.NaN;
if (message.Length > 4 && !string.IsNullOrEmpty(message[4]))
DestinationID = message[4];
DestinationId = message[4];
if (message.Length > 5 && !string.IsNullOrEmpty(message[5]))
OriginID = message[5];
OriginId = message[5];
}
/// <summary>
/// True Bearing from start to destination
@ -61,11 +64,11 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// Name of origin
/// </summary>
public string OriginID { get; set; }
public string OriginId { get; set; }
/// <summary>
/// Name of destination
/// </summary>
public string DestinationID { get; set; }
public string DestinationId { get; set; }
}
}

View file

@ -26,7 +26,8 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// Global Positioning System Fix Data
/// </summary>
[NmeaMessageType(Type = "GPGGA")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gpgga")]
[NmeaMessageType("GPGGA")]
public class Gpgga : NmeaMessage
{
/// <summary>
@ -39,12 +40,16 @@ namespace NmeaParser.Nmea.Gps
/// <summary>GPS</summary>
GpsFix = 1,
/// <summary>Differential GPS</summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Dgps")]
DgpsFix = 2,
/// <summary>Precise Positioning Service</summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Pps")]
PpsFix = 3,
/// <summary>Real Time Kinematic (Fixed)</summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Rtk")]
Rtk = 4,
/// <summary>Real Time Kinematic (Floating)</summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Rtk")]
FloatRtk = 5,
/// <summary>Estimated</summary>
Estimated = 6,
@ -60,7 +65,8 @@ namespace NmeaParser.Nmea.Gps
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
var time = message[0];
if (message == null || message.Length < 14)
throw new ArgumentException("Invalid GPGGA", "message");
Latitude = NmeaMessage.StringToLatitude(message[1], message[2]);
Longitude = NmeaMessage.StringToLongitude(message[3], message[4]);
Quality = (FixQuality)int.Parse(message[5], CultureInfo.InvariantCulture);
@ -72,14 +78,14 @@ namespace NmeaParser.Nmea.Gps
HeightOfGeoidUnits = message[11];
if (message[0].Length == 6)
{
TimeSinceLastDgpsUpdate = new TimeSpan(int.Parse(message[0].Substring(0, 2)),
int.Parse(message[0].Substring(2, 2)),
int.Parse(message[0].Substring(4, 2)));
TimeSinceLastDgpsUpdate = new TimeSpan(int.Parse(message[0].Substring(0, 2), CultureInfo.InvariantCulture),
int.Parse(message[0].Substring(2, 2), CultureInfo.InvariantCulture),
int.Parse(message[0].Substring(4, 2), CultureInfo.InvariantCulture));
}
if (message[13].Length > 0)
DgpsStationID = int.Parse(message[13], CultureInfo.InvariantCulture);
DgpsStationId = int.Parse(message[13], CultureInfo.InvariantCulture);
else
DgpsStationID = -1;
DgpsStationId = -1;
}
/// <summary>
@ -105,6 +111,7 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// Horizontal Dilution of Precision
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Hdop")]
public double Hdop { get; private set; }
/// <summary>
@ -135,6 +142,6 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// DGPS Station ID Number
/// </summary>
public int DgpsStationID { get; set; }
public int DgpsStationId { get; set; }
}
}

View file

@ -26,7 +26,8 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// Geographic position, latitude / longitude
/// </summary>
[NmeaMessageType(Type = "GPGLL")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gpgll")]
[NmeaMessageType("GPGLL")]
public class Gpgll : NmeaMessage
{
/// <summary>
@ -35,14 +36,15 @@ namespace NmeaParser.Nmea.Gps
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
var time = message[0];
if (message == null || message.Length < 4)
throw new ArgumentException("Invalid GPGLL", "message");
Latitude = NmeaMessage.StringToLatitude(message[0], message[1]);
Longitude = NmeaMessage.StringToLongitude(message[2], message[3]);
if (message.Length >= 5 && message[4].Length == 6) //Some older GPS doesn't broadcast fix time
{
FixTime = new TimeSpan(int.Parse(message[4].Substring(0, 2)),
int.Parse(message[4].Substring(2, 2)),
int.Parse(message[4].Substring(4, 2)));
FixTime = new TimeSpan(int.Parse(message[4].Substring(0, 2), CultureInfo.InvariantCulture),
int.Parse(message[4].Substring(2, 2), CultureInfo.InvariantCulture),
int.Parse(message[4].Substring(4, 2), CultureInfo.InvariantCulture));
}
DataActive = (message.Length < 6 || message[5] == "A");
}

View file

@ -26,7 +26,8 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// Global Positioning System Fix Data
/// </summary>
[NmeaMessageType(Type = "GPGSA")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gpgsa")]
[NmeaMessageType("GPGSA")]
public class Gpgsa : NmeaMessage
{
/// <summary>
@ -46,6 +47,7 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// Fix Mode
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1008:EnumsShouldHaveZeroValue", Justification = "Enum values matches NMEA spec")]
public enum Mode : int
{
/// <summary>
@ -55,11 +57,11 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// 2D Fix
/// </summary>
_2D = 2,
Fix2D = 2,
/// <summary>
/// 3D Fix
/// </summary>
_3D = 3
Fix3D = 3
}
/// <summary>
@ -68,8 +70,11 @@ namespace NmeaParser.Nmea.Gps
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
if (message == null || message.Length < 17)
throw new ArgumentException("Invalid GPGSA", "message");
GpsMode = message[0] == "A" ? ModeSelection.Auto : ModeSelection.Manual;
FixMode = (Mode)int.Parse(message[1]);
FixMode = (Mode)int.Parse(message[1], CultureInfo.InvariantCulture);
List<int> svs = new List<int>();
for (int i = 2; i < 14; i++)
@ -82,19 +87,19 @@ namespace NmeaParser.Nmea.Gps
double tmp;
if (double.TryParse(message[14], NumberStyles.Float, CultureInfo.InvariantCulture, out tmp))
PDop = tmp;
Pdop = tmp;
else
PDop = double.NaN;
Pdop = double.NaN;
if (double.TryParse(message[15], NumberStyles.Float, CultureInfo.InvariantCulture, out tmp))
HDop = tmp;
Hdop = tmp;
else
HDop = double.NaN;
Hdop = double.NaN;
if (double.TryParse(message[16], NumberStyles.Float, CultureInfo.InvariantCulture, out tmp))
VDop = tmp;
Vdop = tmp;
else
VDop = double.NaN;
Vdop = double.NaN;
}
/// <summary>
@ -110,21 +115,24 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// IDs of SVs used in position fix
/// </summary>
public int[] SVs { get; private set; }
public IReadOnlyList<int> SVs { get; private set; }
/// <summary>
/// Dilution of precision
/// </summary>
public double PDop { get; private set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Pdop")]
public double Pdop { get; private set; }
/// <summary>
/// Horizontal dilution of precision
/// </summary>
public double HDop { get; private set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Hdop")]
public double Hdop { get; private set; }
/// <summary>
/// Vertical dilution of precision
/// </summary>
public double VDop { get; private set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Vdop")]
public double Vdop { get; private set; }
}
}

View file

@ -26,8 +26,10 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// GPS Satellites in view
/// </summary>
[NmeaMessageType(Type = "GPGSV")]
public sealed class Gpgsv : NmeaMessage, IMultiPartMessage<SatelitteVehicle>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gpgsv")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")]
[NmeaMessageType("GPGSV")]
public sealed class Gpgsv : NmeaMessage, IMultiPartMessage<SatelliteVehicle>
{
/// <summary>
/// Called when the message is being loaded.
@ -35,17 +37,20 @@ namespace NmeaParser.Nmea.Gps
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
TotalMessages = int.Parse(message[0]);
MessageNumber = int.Parse(message[1]);
SVsInView = int.Parse(message[2]);
if (message == null || message.Length < 3)
throw new ArgumentException("Invalid GPGSV", "message");
TotalMessages = int.Parse(message[0], CultureInfo.InvariantCulture);
MessageNumber = int.Parse(message[1], CultureInfo.InvariantCulture);
SVsInView = int.Parse(message[2], CultureInfo.InvariantCulture);
List<SatelitteVehicle> svs = new List<SatelitteVehicle>();
List<SatelliteVehicle> svs = new List<SatelliteVehicle>();
for (int i = 3; i < message.Length - 4; i += 4)
{
if (message[i].Length == 0)
continue;
else
svs.Add(new SatelitteVehicle(message, i));
svs.Add(new SatelliteVehicle(message, i));
}
this.SVs = svs.ToArray();
}
@ -68,13 +73,13 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// Dilution of precision
/// </summary>
public SatelitteVehicle[] SVs { get; private set; }
public IReadOnlyList<SatelliteVehicle> SVs { get; private set; }
/// <summary>
/// Returns an enumerator that iterates through the collection.
/// </summary>
/// <returns> A System.Collections.Generic.IEnumerator{SatelitteVehicle} that can be used to iterate through the collection.</returns>
public IEnumerator<SatelitteVehicle> GetEnumerator()
/// <returns> A System.Collections.Generic.IEnumerator{SatelliteVehicle} that can be used to iterate through the collection.</returns>
public IEnumerator<SatelliteVehicle> GetEnumerator()
{
foreach(var sv in SVs)
yield return sv;
@ -93,11 +98,11 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// Satellite vehicle
/// </summary>
public sealed class SatelitteVehicle
public sealed class SatelliteVehicle
{
internal SatelitteVehicle(string[] message, int startIndex)
internal SatelliteVehicle(string[] message, int startIndex)
{
PrnNumber = int.Parse(message[startIndex]);
PrnNumber = int.Parse(message[startIndex], CultureInfo.InvariantCulture);
Elevation = double.Parse(message[startIndex+1], CultureInfo.InvariantCulture);
Azimuth = double.Parse(message[startIndex + 2], CultureInfo.InvariantCulture);
int snr = -1;
@ -155,10 +160,12 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// WAAS - Wide Area Augmentation System
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Waas")]
Waas,
/// <summary>
/// GLONASS - Globalnaya navigatsionnaya sputnikovaya sistema
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Glonass")]
Glonass
}
}

View file

@ -26,7 +26,8 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// Recommended minimum navigation information
/// </summary>
[NmeaMessageType(Type = "GPRMB")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gprmb")]
[NmeaMessageType("GPRMB")]
public class Gprmb : NmeaMessage
{
/// <summary>
@ -35,9 +36,9 @@ namespace NmeaParser.Nmea.Gps
public enum DataStatus
{
/// <summary>
/// OK
/// Ok
/// </summary>
OK,
Ok,
/// <summary>
/// Warning
/// </summary>
@ -49,7 +50,10 @@ namespace NmeaParser.Nmea.Gps
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
Status = message[0] == "A" ? DataStatus.OK : Gprmb.DataStatus.Warning;
if (message == null || message.Length < 13)
throw new ArgumentException("Invalid GPRMB", "message");
Status = message[0] == "A" ? DataStatus.Ok : Gprmb.DataStatus.Warning;
double tmp;
if (double.TryParse(message[1], NumberStyles.Float, CultureInfo.InvariantCulture, out tmp))
{
@ -62,9 +66,9 @@ namespace NmeaParser.Nmea.Gps
CrossTrackError = double.NaN;
if(message[3].Length > 0)
OriginWaypointID = int.Parse(message[3], CultureInfo.InvariantCulture);
OriginWaypointId = int.Parse(message[3], CultureInfo.InvariantCulture);
if (message[3].Length > 0)
DestinationWaypointID = int.Parse(message[4], CultureInfo.InvariantCulture);
DestinationWaypointId = int.Parse(message[4], CultureInfo.InvariantCulture);
DestinationLatitude = NmeaMessage.StringToLatitude(message[5], message[6]);
DestinationLongitude = NmeaMessage.StringToLongitude(message[7], message[8]);
if (double.TryParse(message[9], NumberStyles.Float, CultureInfo.InvariantCulture, out tmp))
@ -95,12 +99,12 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// Origin waypoint ID
/// </summary>
public double OriginWaypointID { get; private set; }
public double OriginWaypointId { get; private set; }
/// <summary>
/// Destination waypoint ID
/// </summary>
public double DestinationWaypointID { get; private set; }
public double DestinationWaypointId { get; private set; }
/// <summary>
/// Destination Latitude

View file

@ -26,7 +26,8 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// Recommended Minimum
/// </summary>
[NmeaMessageType(Type = "GPRMC")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gprmc")]
[NmeaMessageType("GPRMC")]
public class Gprmc : NmeaMessage
{
/// <summary>
@ -35,14 +36,17 @@ namespace NmeaParser.Nmea.Gps
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
if (message == null || message.Length < 11)
throw new ArgumentException("Invalid GPRMC", "message");
if (message[8].Length == 6 && message[0].Length == 6)
{
FixTime = new DateTime(int.Parse(message[8].Substring(4, 2)) + 2000,
int.Parse(message[8].Substring(2, 2)),
int.Parse(message[8].Substring(0, 2)),
int.Parse(message[0].Substring(0, 2)),
int.Parse(message[0].Substring(2, 2)),
int.Parse(message[0].Substring(4, 2)), DateTimeKind.Utc);
FixTime = new DateTime(int.Parse(message[8].Substring(4, 2), CultureInfo.InvariantCulture) + 2000,
int.Parse(message[8].Substring(2, 2), CultureInfo.InvariantCulture),
int.Parse(message[8].Substring(0, 2), CultureInfo.InvariantCulture),
int.Parse(message[0].Substring(0, 2), CultureInfo.InvariantCulture),
int.Parse(message[0].Substring(2, 2), CultureInfo.InvariantCulture),
int.Parse(message[0].Substring(4, 2), CultureInfo.InvariantCulture), DateTimeKind.Utc);
}
Active = (message[1] == "A");
Latitude = NmeaMessage.StringToLatitude(message[2], message[3]);

View file

@ -26,7 +26,9 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// Routes
/// </summary>
[NmeaMessageType(Type = "GPRTE")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gprte")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")]
[NmeaMessageType("GPRTE")]
public sealed class Gprte : NmeaMessage, IMultiPartMessage<string>
{
/// <summary>
@ -49,10 +51,13 @@ namespace NmeaParser.Nmea.Gps
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
TotalMessages = int.Parse(message[0]);
MessageNumber = int.Parse(message[1]);
if (message == null || message.Length < 4)
throw new ArgumentException("Invalid GPRTE", "message");
TotalMessages = int.Parse(message[0], CultureInfo.InvariantCulture);
MessageNumber = int.Parse(message[1], CultureInfo.InvariantCulture);
ListType = message[2] == "c" ? WaypointListType.CompleteWaypointsList : WaypointListType.RemainingWaypointsList;
RouteID = message[3];
RouteId = message[3];
Waypoints = message.Skip(4).ToArray();
}
@ -74,12 +79,12 @@ namespace NmeaParser.Nmea.Gps
/// <summary>
/// Gets the route identifier.
/// </summary>
public string RouteID { get; private set; }
public string RouteId { get; private set; }
/// <summary>
/// Waypoints
/// </summary>
public string[] Waypoints { get; private set; }
public IReadOnlyList<string> Waypoints { get; private set; }
/// <summary>
/// Returns an enumerator that iterates through the collection.

View file

@ -26,7 +26,8 @@ namespace NmeaParser.Nmea.Gps.Garmin
/// <summary>
/// Recommended Minimum
/// </summary>
[NmeaMessageType(Type = "PGRME")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Pgrme")]
[NmeaMessageType("PGRME")]
public class Pgrme : NmeaMessage
{
/// <summary>
@ -35,6 +36,9 @@ namespace NmeaParser.Nmea.Gps.Garmin
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
if (message == null || message.Length < 6)
throw new ArgumentException("Invalid PGRME", "message");
HorizontalError = NmeaMessage.StringToDouble(message[0]);
HorizontalErrorUnits = message[1];
VerticalError = NmeaMessage.StringToDouble(message[2]);

View file

@ -26,7 +26,8 @@ namespace NmeaParser.Nmea.Gps.Garmin
/// <summary>
/// Altitude Information
/// </summary>
[NmeaMessageType(Type = "PGRMZ")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Pgrmz")]
[NmeaMessageType("PGRMZ")]
public class Pgrmz : NmeaMessage
{
/// <summary>
@ -67,6 +68,9 @@ namespace NmeaParser.Nmea.Gps.Garmin
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
if (message == null || message.Length < 3)
throw new ArgumentException("Invalid PGRMZ", "message");
if (message[0].Length > 0)
Altitude = double.Parse(message[0], CultureInfo.InvariantCulture);
else

View file

@ -35,6 +35,9 @@ namespace NmeaParser.Nmea.LaserRange
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
if (message == null || message.Length < 9)
throw new ArgumentException("Invalid Laser Range Message", "message");
HorizontalVector = message[0];
HorizontalDistance = double.Parse(message[1], CultureInfo.InvariantCulture);
HorizontalDistanceUnits = message[2][0];

View file

@ -26,7 +26,8 @@ namespace NmeaParser.Nmea.LaserRange.LaserTech
/// <summary>
/// Laser Range
/// </summary>
[NmeaMessageType(Type = "PLTIT")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Pltit")]
[NmeaMessageType("PLTIT")]
public class Pltit : LaserRangeMessage
{
}

View file

@ -26,7 +26,8 @@ namespace NmeaParser.Nmea.LaserRange.Trimble
/// <summary>
/// Burden finder
/// </summary>
[NmeaMessageType(Type = "PTNLA")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Ptnla")]
[NmeaMessageType("PTNLA")]
public class Ptnla : LaserRangeMessage
{
}

View file

@ -26,7 +26,8 @@ namespace NmeaParser.Nmea.LaserRange.Trimble
/// <summary>
/// Tree Measurement
/// </summary>
[NmeaMessageType(Type = "PTNLB")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Ptnlb")]
[NmeaMessageType("PTNLB")]
public class Ptnlb : NmeaMessage
{
/// <summary>
@ -35,6 +36,9 @@ namespace NmeaParser.Nmea.LaserRange.Trimble
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
if (message == null || message.Length < 6)
throw new ArgumentException("Invalid PTNLB", "message");
TreeHeight = message[0];
MeasuredTreeHeight = double.Parse(message[1], CultureInfo.InvariantCulture);
MeasuredTreeHeightUnits = message[2][0];

View file

@ -27,12 +27,21 @@ namespace NmeaParser.Nmea
/// <summary>
/// Nmea message attribute type used on concrete <see cref="NmeaMessage"/> implementations.
/// </summary>
public class NmeaMessageTypeAttribute : Attribute
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class NmeaMessageTypeAttribute : Attribute
{
/// <summary>
/// Initializes a new instance of the <see cref="NmeaMessageTypeAttribute"/> class.
/// </summary>
/// <param name="nmeaType">The type.</param>
public NmeaMessageTypeAttribute(string nmeaType)
{
NmeaType = nmeaType;
}
/// <summary>
/// Gets or sets the NMEA message type.
/// </summary>
public string Type { get; set; }
public string NmeaType { get; private set; }
}
/// <summary>
@ -51,6 +60,9 @@ namespace NmeaParser.Nmea
/// </exception>
public static NmeaMessage Parse(string message)
{
if (string.IsNullOrEmpty(message))
throw new ArgumentNullException("message");
int checksum = -1;
if (message[0] != '$')
throw new ArgumentException("Invalid nmea message: Missing starting character '$'");
@ -69,7 +81,7 @@ namespace NmeaParser.Nmea
checksumTest ^= Convert.ToByte(message[i]);
}
if (checksum != checksumTest)
throw new ArgumentException(string.Format("Invalid nmea message: Checksum failure. Got {0:X2}, Expected {1:X2}", checksum, checksumTest));
throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Invalid nmea message: Checksum failure. Got {0:X2}, Expected {1:X2}", checksum, checksumTest));
}
string[] parts = message.Split(new char[] { ',' });
@ -110,7 +122,7 @@ namespace NmeaParser.Nmea
var pinfo = c.GetParameters();
if (pinfo.Length == 0)
{
messageTypes.Add(attr.Type, c);
messageTypes.Add(attr.NmeaType, c);
break;
}
}
@ -124,10 +136,10 @@ namespace NmeaParser.Nmea
/// <summary>
/// Gets the NMEA message parts.
/// </summary>
protected string[] MessageParts { get; private set; }
protected IReadOnlyList<string> MessageParts { get; private set; }
/// <summary>
/// Gets the type id for the message.
/// Gets the NMEA type id for the message.
/// </summary>
public string MessageType { get; private set; }
@ -148,47 +160,37 @@ namespace NmeaParser.Nmea
/// </returns>
public override string ToString()
{
return string.Format("${0},{1}", MessageType, string.Join(",", MessageParts));
return string.Format(CultureInfo.InvariantCulture, "${0},{1}", MessageType, string.Join(",", MessageParts));
}
internal static double StringToLatitude(string value, string ns)
{
try
{
if (value.Length < 3)
return double.NaN;
double latitude = int.Parse(value.Substring(0, 2), CultureInfo.InvariantCulture) + double.Parse(value.Substring(2), CultureInfo.InvariantCulture) / 60;
if (ns == "S")
latitude *= -1;
return latitude;
}
catch { return double.NaN; }
if (value == null || value.Length < 3)
return double.NaN;
double latitude = int.Parse(value.Substring(0, 2), CultureInfo.InvariantCulture) + double.Parse(value.Substring(2), CultureInfo.InvariantCulture) / 60;
if (ns == "S")
latitude *= -1;
return latitude;
}
internal static double StringToLongitude(string value, string ew)
{
try
{
if (value.Length < 4)
return double.NaN;
double longitude = int.Parse(value.Substring(0, 3), CultureInfo.InvariantCulture) + double.Parse(value.Substring(3), CultureInfo.InvariantCulture) / 60;
if (ew == "W")
longitude *= -1;
return longitude;
}
catch { return double.NaN; }
if (value == null || value.Length < 4)
return double.NaN;
double longitude = int.Parse(value.Substring(0, 3), CultureInfo.InvariantCulture) + double.Parse(value.Substring(3), CultureInfo.InvariantCulture) / 60;
if (ew == "W")
longitude *= -1;
return longitude;
}
internal static double StringToDouble(string value)
{
try
double result = double.NaN;
if(value != null && double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out result))
{
double result = double.NaN;
if(double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out result))
{
return result;
}
return double.NaN;
return result;
}
catch { return double.NaN; }
return double.NaN;
}
}
}

View file

@ -28,9 +28,9 @@ namespace NmeaParser.Nmea
public class UnknownMessage : NmeaMessage
{
/// <summary>
/// Gets the nmea value aarray.
/// Gets the nmea value array.
/// </summary>
public string[] Values { get { return base.MessageParts; } }
public IReadOnlyList<string> Values { get { return base.MessageParts; } }
/// <summary>
/// Called when the message is being loaded.
/// </summary>

View file

@ -58,6 +58,7 @@ namespace NmeaParser
MultiPartMessageCache.Clear();
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals", MessageId = "_")]
private void StartParser()
{
var token = m_cts.Token;
@ -127,7 +128,7 @@ namespace NmeaParser
{
m_message += nmea;
var lineEnd = m_message.IndexOf("\n");
var lineEnd = m_message.IndexOf("\n", StringComparison.Ordinal);
if (lineEnd > -1)
{
line = m_message.Substring(0, lineEnd).Trim();
@ -138,6 +139,7 @@ namespace NmeaParser
ProcessMessage(line);
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification="Must silently handle invalid/corrupt input")]
private void ProcessMessage(string p)
{
try
@ -152,10 +154,10 @@ namespace NmeaParser
private void OnMessageReceived(Nmea.NmeaMessage msg)
{
var args = new NmeaMessageReceivedEventArgs(msg);
if (msg is IMultiPartMessage)
var multi = msg as IMultiPartMessage;
if (multi != null)
{
args.IsMultiPart = true;
var multi = (IMultiPartMessage)msg;
args.IsMultipart = true;
if (MultiPartMessageCache.ContainsKey(msg.MessageType))
{
var dic = MultiPartMessageCache[msg.MessageType];
@ -202,12 +204,13 @@ namespace NmeaParser
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// Releases unmanaged and - optionally - managed resources.
/// </summary>
/// <param name="force"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
protected virtual void Dispose(bool force)
/// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
protected virtual void Dispose(bool disposing)
{
if (m_stream != null)
{
@ -217,6 +220,8 @@ namespace NmeaParser
m_cts = null;
}
CloseStreamAsync(m_stream);
if (disposing && m_stream != null)
m_stream.Dispose();
m_stream = null;
}
}
@ -251,13 +256,13 @@ namespace NmeaParser
/// <value>
/// <c>true</c> if this instance is multi part; otherwise, <c>false</c>.
/// </value>
public bool IsMultiPart { get; internal set; }
public bool IsMultipart { get; internal set; }
/// <summary>
/// Gets the message parts if this is a multi-part message and all message parts has been received.
/// </summary>
/// <value>
/// The message parts.
/// </value>
public Nmea.NmeaMessage[] MessageParts { get; internal set; }
public IReadOnlyList<Nmea.NmeaMessage> MessageParts { get; internal set; }
}
}

View file

@ -33,32 +33,47 @@ namespace NmeaParser
#else
string m_filename;
#endif
int m_readSpeed;
/// <summary>
/// Initializes a new instance of the <see cref="NmeaFileDevice"/> class.
/// </summary>
/// <param name="filename"></param>
/// <param name="readSpeed">The time to wait between each line being read in milliseconds</param>
/// <param name="fileName"></param>
#if NETFX_CORE
public NmeaFileDevice(Windows.Storage.IStorageFile filename, int readSpeed = 200) : base(readSpeed)
public NmeaFileDevice(Windows.Storage.IStorageFile fileName) : this(fileName, 200)
#else
public NmeaFileDevice(string filename, int readSpeed = 200) : base(readSpeed)
public NmeaFileDevice(string fileName) : this(fileName, 200)
#endif
{
m_filename = filename;
m_readSpeed = readSpeed;
m_filename = fileName;
}
/// <summary>
/// Initializes a new instance of the <see cref="NmeaFileDevice"/> class.
/// </summary>
/// <param name="fileName"></param>
/// <param name="readSpeed">The time to wait between each line being read in milliseconds</param>
#if NETFX_CORE
public NmeaFileDevice(Windows.Storage.IStorageFile fileName, int readSpeed)
: base(readSpeed)
#else
public NmeaFileDevice(string fileName, int readSpeed) : base(readSpeed)
#endif
{
m_filename = fileName;
}
/// <summary>
/// Gets the stream to perform buffer reads on.
/// </summary>
/// <returns></returns>
#if !NETFX_CORE
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
#endif
protected override Task<Stream> GetStreamAsync()
{
#if NETFX_CORE
return m_filename.OpenStreamForReadAsync();
#else
var sr = System.IO.File.OpenRead(m_filename);
return Task.FromResult<Stream>(sr);
return Task.FromResult<Stream>(System.IO.File.OpenRead(m_filename));
#endif
}
}

View file

@ -24,6 +24,6 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.3.1.0")]
[assembly: AssemblyFileVersion("1.3.1.0")]
[assembly: AssemblyVersion("1.4.0.0")]
[assembly: AssemblyFileVersion("1.4.0.0")]
[assembly: ComVisible(false)]

View file

@ -59,9 +59,10 @@ namespace NmeaParser
/// <summary>
/// Releases unmanaged and - optionally - managed resources.
/// </summary>
/// <param name="force"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
protected override void Dispose(bool force)
/// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (m_stream != null)
m_stream.Dispose();
m_stream = null;

View file

@ -23,13 +23,13 @@ namespace NmeaParser.Tests
count++;
try
{
Assert.IsTrue(e.IsMultiPart, "IsMultiPart");
Assert.IsTrue(e.IsMultipart, "IsMultiPart");
Assert.IsInstanceOfType(e.Message, typeof(NmeaParser.Nmea.Gps.Gpgsv));
var msg = e.Message as NmeaParser.Nmea.Gps.Gpgsv;
if (msg.TotalMessages == msg.MessageNumber)
{
Assert.IsNotNull(e.MessageParts);
Assert.AreEqual(e.MessageParts.Length, 3, "MessageParts.Length");
Assert.AreEqual(e.MessageParts.Count, 3, "MessageParts.Length");
tcs.SetResult(true);
}
else
@ -60,7 +60,7 @@ namespace NmeaParser.Tests
count++;
try
{
Assert.IsTrue(e.IsMultiPart, "IsMultiPart");
Assert.IsTrue(e.IsMultipart, "IsMultiPart");
Assert.IsInstanceOfType(e.Message, typeof(NmeaParser.Nmea.Gps.Gpgsv));
var msg = e.Message as NmeaParser.Nmea.Gps.Gpgsv;
Assert.IsNull(e.MessageParts);

View file

@ -57,10 +57,10 @@ namespace NmeaParser.Tests
Assert.AreEqual(double.NaN, rmb.CrossTrackError);
Assert.AreEqual(double.NaN, rmb.DestinationLatitude);
Assert.AreEqual(double.NaN, rmb.DestinationLongitude);
Assert.AreEqual(0, rmb.DestinationWaypointID);
Assert.AreEqual(0, rmb.OriginWaypointID);
Assert.AreEqual(0, rmb.DestinationWaypointId);
Assert.AreEqual(0, rmb.OriginWaypointId);
Assert.AreEqual(double.NaN, rmb.RangeToDestination);
Assert.AreEqual(Gprmb.DataStatus.OK, rmb.Status);
Assert.AreEqual(Gprmb.DataStatus.Ok, rmb.Status);
Assert.AreEqual(double.NaN, rmb.TrueBearing);
Assert.AreEqual(double.NaN, rmb.Velocity);
}
@ -72,10 +72,10 @@ namespace NmeaParser.Tests
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gprmb));
Gprmb rmb = (Gprmb)msg;
Assert.AreEqual(Gprmb.DataStatus.OK, rmb.Status);
Assert.AreEqual(Gprmb.DataStatus.Ok, rmb.Status);
Assert.AreEqual(-.66, rmb.CrossTrackError);
Assert.AreEqual(3, rmb.OriginWaypointID);
Assert.AreEqual(4, rmb.DestinationWaypointID);
Assert.AreEqual(3, rmb.OriginWaypointId);
Assert.AreEqual(4, rmb.DestinationWaypointId);
Assert.AreEqual(-49.287333333333333333, rmb.DestinationLatitude);
Assert.AreEqual(-123.1595, rmb.DestinationLongitude);
Assert.AreEqual(1.3, rmb.RangeToDestination);
@ -113,7 +113,7 @@ namespace NmeaParser.Tests
Assert.AreEqual("M", gga.AltitudeUnits);
Assert.AreEqual(-22.1, gga.HeightOfGeoid);
Assert.AreEqual("M", gga.HeightOfGeoidUnits);
Assert.AreEqual(-1, gga.DgpsStationID);
Assert.AreEqual(-1, gga.DgpsStationId);
}
[TestMethod]
@ -156,15 +156,15 @@ namespace NmeaParser.Tests
Assert.IsInstanceOfType(msg, typeof(Gpgsa));
Gpgsa gsa = (Gpgsa)msg;
Assert.AreEqual(Gpgsa.ModeSelection.Auto, gsa.GpsMode);
Assert.AreEqual(Gpgsa.Mode._3D, gsa.FixMode);
Assert.AreEqual(4, gsa.SVs.Length);
Assert.AreEqual(Gpgsa.Mode.Fix3D, gsa.FixMode);
Assert.AreEqual(4, gsa.SVs.Count);
Assert.AreEqual(16, gsa.SVs[0]);
Assert.AreEqual(18, gsa.SVs[1]);
Assert.AreEqual(22, gsa.SVs[2]);
Assert.AreEqual(24, gsa.SVs[3]);
Assert.AreEqual(double.NaN, gsa.PDop);
Assert.AreEqual(double.NaN, gsa.HDop);
Assert.AreEqual(double.NaN, gsa.VDop);
Assert.AreEqual(double.NaN, gsa.Pdop);
Assert.AreEqual(double.NaN, gsa.Hdop);
Assert.AreEqual(double.NaN, gsa.Vdop);
}
[TestMethod]
public void TestGpgsa()
@ -174,8 +174,8 @@ namespace NmeaParser.Tests
Assert.IsInstanceOfType(msg, typeof(Gpgsa));
Gpgsa gsa = (Gpgsa)msg;
Assert.AreEqual(Gpgsa.ModeSelection.Manual, gsa.GpsMode);
Assert.AreEqual(Gpgsa.Mode._2D, gsa.FixMode);
Assert.AreEqual(12, gsa.SVs.Length);
Assert.AreEqual(Gpgsa.Mode.Fix2D, gsa.FixMode);
Assert.AreEqual(12, gsa.SVs.Count);
Assert.AreEqual(19, gsa.SVs[0]);
Assert.AreEqual(28, gsa.SVs[1]);
Assert.AreEqual(14, gsa.SVs[2]);
@ -188,9 +188,9 @@ namespace NmeaParser.Tests
Assert.AreEqual(42, gsa.SVs[9]);
Assert.AreEqual(43, gsa.SVs[10]);
Assert.AreEqual(44, gsa.SVs[11]);
Assert.AreEqual(1.7, gsa.PDop);
Assert.AreEqual(1.0, gsa.HDop);
Assert.AreEqual(1.3, gsa.VDop);
Assert.AreEqual(1.7, gsa.Pdop);
Assert.AreEqual(1.0, gsa.Hdop);
Assert.AreEqual(1.3, gsa.Vdop);
}
[TestMethod]
@ -204,7 +204,7 @@ namespace NmeaParser.Tests
Assert.AreEqual(3, gsv.MessageNumber);
Assert.AreEqual(11, gsv.SVsInView);
Assert.IsNotNull(gsv.SVs);
Assert.AreEqual(3, gsv.SVs.Length);
Assert.AreEqual(3, gsv.SVs.Count);
var sv = gsv.SVs[0];
Assert.AreEqual(22, sv.PrnNumber);
Assert.AreEqual(42, sv.Elevation);
@ -238,7 +238,7 @@ namespace NmeaParser.Tests
Assert.AreEqual(1, gsv.MessageNumber);
Assert.AreEqual(0, gsv.SVsInView);
Assert.IsNotNull(gsv.SVs);
Assert.AreEqual(0, gsv.SVs.Length);
Assert.AreEqual(0, gsv.SVs.Count);
}
[TestMethod]
@ -277,8 +277,8 @@ namespace NmeaParser.Tests
Gpbod bod = (Gpbod)msg;
Assert.AreEqual(double.NaN, bod.TrueBearing, "TrueBearing");
Assert.AreEqual(double.NaN, bod.MagneticBearing, "MagneticBearing");
Assert.IsNull(bod.OriginID, "OriginID");
Assert.IsNull(bod.DestinationID, "DestinationID");
Assert.IsNull(bod.OriginId, "OriginID");
Assert.IsNull(bod.DestinationId, "DestinationID");
}
[TestMethod]
@ -290,8 +290,8 @@ namespace NmeaParser.Tests
Gpbod bod = (Gpbod)msg;
Assert.AreEqual(99.3, bod.TrueBearing, "TrueBearing");
Assert.AreEqual(105.6, bod.MagneticBearing, "MagneticBearing");
Assert.AreEqual("POINTB", bod.DestinationID, "DestinationID");
Assert.IsNull(bod.OriginID, "OriginID");
Assert.AreEqual("POINTB", bod.DestinationId, "DestinationID");
Assert.IsNull(bod.OriginId, "OriginID");
}
@ -304,8 +304,8 @@ namespace NmeaParser.Tests
Gpbod bod = (Gpbod)msg;
Assert.AreEqual(97d, bod.TrueBearing, "TrueBearing");
Assert.AreEqual(103.2, bod.MagneticBearing, "MagneticBearing");
Assert.AreEqual("POINTB", bod.DestinationID, "DestinationID");
Assert.AreEqual("POINTA", bod.OriginID, "OriginID");
Assert.AreEqual("POINTB", bod.DestinationId, "DestinationID");
Assert.AreEqual("POINTA", bod.OriginId, "OriginID");
}
@ -343,9 +343,9 @@ namespace NmeaParser.Tests
Assert.AreEqual(2, gsv.TotalMessages);
Assert.AreEqual(1, gsv.MessageNumber);
Assert.AreEqual(NmeaParser.Nmea.Gps.Gprte.WaypointListType.CompleteWaypointsList, gsv.ListType);
Assert.AreEqual("0", gsv.RouteID);
Assert.AreEqual("0", gsv.RouteID);
Assert.AreEqual(9, gsv.Waypoints.Length);
Assert.AreEqual("0", gsv.RouteId);
Assert.AreEqual("0", gsv.RouteId);
Assert.AreEqual(9, gsv.Waypoints.Count);
Assert.AreEqual("W3IWI", gsv.Waypoints[0]);
Assert.AreEqual("32BKLD", gsv.Waypoints[4]);
Assert.AreEqual("BW-198", gsv.Waypoints[8]);

View file

@ -21,6 +21,8 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>..\Bin\Debug\NmeaParser.WinDesktop.xml</DocumentationFile>
<RunCodeAnalysis>true</RunCodeAnalysis>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
@ -30,6 +32,7 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>..\Bin\Release\NmeaParser.WinDesktop.xml</DocumentationFile>
<RunCodeAnalysis>true</RunCodeAnalysis>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
@ -37,10 +40,18 @@
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\GlobalSuppressions.cs">
<Link>GlobalSuppressions.cs</Link>
</Compile>
<Compile Include="SerialPortDevice.cs" />
<Compile Include="Properties\AssemblyInfo.Desktop.cs" />
<Compile Include="TypedEventHandler.cs" />
</ItemGroup>
<ItemGroup>
<CodeAnalysisDictionary Include="..\CustomDictionary.xml">
<Link>CustomDictionary.xml</Link>
</CodeAnalysisDictionary>
</ItemGroup>
<Import Project="..\NmeaParser.Shared\NmeaParser.Shared.projitems" Label="Shared" Condition="Exists('..\NmeaParser.Shared\NmeaParser.Shared.projitems')" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View file

@ -26,6 +26,8 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>..\bin\Debug\NmeaParser.WinPhone.xml</DocumentationFile>
<RunCodeAnalysis>true</RunCodeAnalysis>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
@ -35,16 +37,25 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>..\bin\Release\NmeaParser.WinPhone.xml</DocumentationFile>
<RunCodeAnalysis>true</RunCodeAnalysis>
</PropertyGroup>
<ItemGroup>
<!-- A reference to the entire .Net Framework and Windows SDK are automatically included -->
<Folder Include="Properties\" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\GlobalSuppressions.cs">
<Link>GlobalSuppressions.cs</Link>
</Compile>
<Compile Include="..\NmeaParser.WinStore\BluetoothDevice.cs">
<Link>BluetoothDevice.cs</Link>
</Compile>
</ItemGroup>
<ItemGroup>
<CodeAnalysisDictionary Include="..\CustomDictionary.xml">
<Link>CustomDictionary.xml</Link>
</CodeAnalysisDictionary>
</ItemGroup>
<Import Project="..\NmeaParser.Shared\NmeaParser.Shared.projitems" Label="Shared" Condition="Exists('..\NmeaParser.Shared\NmeaParser.Shared.projitems')" />
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '12.0' ">
<VisualStudioVersion>12.0</VisualStudioVersion>

View file

@ -74,6 +74,8 @@ namespace NmeaParser
/// <returns></returns>
protected override Task CloseStreamAsync(System.IO.Stream stream)
{
if (stream == null)
throw new ArgumentNullException("stream");
stream.Dispose();
m_socket.Dispose();
m_socket = null;

View file

@ -26,6 +26,8 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>..\bin\Debug\NmeaParser.WinStore.xml</DocumentationFile>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<RunCodeAnalysis>true</RunCodeAnalysis>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
@ -35,14 +37,24 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>..\bin\Release\NmeaParser.WinStore.xml</DocumentationFile>
<RunCodeAnalysis>true</RunCodeAnalysis>
</PropertyGroup>
<ItemGroup>
<!-- A reference to the entire .Net Framework and Windows SDK are automatically included -->
<Folder Include="Properties\" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\GlobalSuppressions.cs">
<Link>GlobalSuppressions.cs</Link>
</Compile>
<Compile Include="BluetoothDevice.cs" />
</ItemGroup>
<ItemGroup>
<CodeAnalysisDictionary Include="..\CustomDictionary.xml">
<Link>CustomDictionary.xml</Link>
<SubType>Designer</SubType>
</CodeAnalysisDictionary>
</ItemGroup>
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '12.0' ">
<VisualStudioVersion>12.0</VisualStudioVersion>
</PropertyGroup>

View file

@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.30501.0
VisualStudioVersion = 12.0.31101.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NmeaParser.WinStore", "NmeaParser.WinStore\NmeaParser.WinStore.csproj", "{62A55887-10F5-40D2-9352-96246D1B11D3}"
EndProject
@ -33,6 +33,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UnitTests", "UnitTests", "{
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SampleApps", "SampleApps", "{A4B9D59A-C8C6-4199-A7F3-F3AF0C748281}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0EBBFC7B-43E8-4478-9951-50C842991A9C}"
ProjectSection(SolutionItems) = preProject
CustomDictionary.xml = CustomDictionary.xml
GlobalSuppressions.cs = GlobalSuppressions.cs
EndProjectSection
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
NmeaParser.Shared\NmeaParser.Shared.projitems*{df711ab9-f14e-4f1f-b8f2-b6ddc4691554}*SharedItemsImports = 4

View file

@ -42,7 +42,7 @@ namespace SampleApp.WinDesktop
if(args.Message is NmeaParser.Nmea.Gps.Gpgsv)
{
var gpgsv = (NmeaParser.Nmea.Gps.Gpgsv)args.Message;
if(args.IsMultiPart && args.MessageParts != null)
if(args.IsMultipart && args.MessageParts != null)
satView.GpgsvMessages = args.MessageParts.OfType<NmeaParser.Nmea.Gps.Gpgsv>();
}
});