git_bsmd/AIS/bsmd.AIS2Service/AIS_Target.cs

374 lines
10 KiB
C#

using System;
using System.Data;
namespace bsmd.AIS2Service
{
public class AIS_Target : IComparable<AIS_Target>
{
#region private members
private readonly int _mmsi;
private bool? _isClassB = false;
private DateTime? _lastUpdate;
private string _name;
private string _callSign;
private double? _latitude;
private double? _longitude;
private int? _heading;
private double? _cog;
private int? _rot;
private double? _sog;
private bool? _accuracy;
private int? _maneuverIndicator;
private bool? _raim;
private int? _radio;
private int? _imo;
private int? _shipType;
private int? _aisVersion;
private int? _breadth;
private int? _length;
private int? _typeOfDevice;
private DateTime? _eta;
private double? _draught;
private string _destination;
private bool? _dte;
private AIS_Target.Type _type = Type.OTHER;
private int _navStatus = 15; // not defined
#endregion
#region public defs
public enum Type
{
PASSENGER,
CARGO,
TANKER,
HSC,
WIG,
TUG,
YACHT,
OTHER
}
#endregion
#region Construction
public AIS_Target(int mmsi)
{
this._mmsi = mmsi;
}
#endregion
#region Properties
public int MMSI
{
get { return this._mmsi; }
}
public DateTime? LastUpdate
{
get { return this._lastUpdate; } private set { this._lastUpdate = value; }
}
public string Name
{
get { return this._name; }
private set { this._name = value; }
}
public string Callsign
{
get { return this._callSign; }
private set { this._callSign = value; }
}
public double? Latitude
{
get { return this._latitude; } private set { this._latitude = value; }
}
public double? Longitude
{
get { return this._longitude; } private set { this._longitude = value; }
}
public Type TargetType
{
get { return this._type; }
set { this._type = value; }
}
public int NavStatus
{
get { return this._navStatus; } private set { this._navStatus = value; }
}
public bool? IsClassB
{
get { return this._isClassB; }
private set { this._isClassB = value; }
}
public int? Heading
{
get { return _heading; } private set { _heading = value; }
}
public double? COG
{
get { return _cog; } private set { _cog = value; }
}
public int? ROT
{
get { return _rot; } private set { _rot = value; }
}
public double? SOG
{
get { return _sog; } private set { _sog = value; }
}
public bool? Accuracy
{
get { return _accuracy; } private set { _accuracy = value; }
}
public int? ManeuverIndicator
{
get { return _maneuverIndicator; } private set { _maneuverIndicator = value; }
}
public bool? RAIM
{
get { return _raim; } private set { _raim = value; }
}
public int? Radio
{
get { return _radio; } private set { _radio = value; }
}
public int? AISVersion
{
get { return _aisVersion; } private set { _aisVersion = value; }
}
public int? IMO
{
get { return _imo; } private set { _imo = value; }
}
public int? ShipType
{
get { return _shipType; } private set { _shipType = value; }
}
public int? Breadth
{
get { return _breadth; } private set { _breadth = value; }
}
public int? Length
{
get { return _length; } private set { _length = value; }
}
public int? TypeOfDevice
{
get { return _typeOfDevice; } private set { _typeOfDevice = value; }
}
public DateTime? ETA
{
get { return _eta; } private set { _eta = value; }
}
public double? Draught
{
get { return _draught; } private set { _draught = value; }
}
public string Destination
{
get { return _destination; } private set { _destination = value; }
}
public bool? DTE
{
get { return _dte; } private set { _dte = value; }
}
public int UpdateCount { get; private set; }
public GeoPoint Position
{
get { GeoPoint gp = new GeoPoint(-1);
gp.Lat = this.Latitude ?? 0;
gp.Lon = this.Longitude ?? 0;
return gp;
}
}
#endregion
#region internal update methods
internal void Update(AIS_PosReport posReport)
{
this.NavStatus = posReport.NavStatusVal;
this.ROT = posReport.ROT;
this.SOG = posReport.SOG;
this.Accuracy = (posReport.Accuracy == 1);
this.Latitude = posReport.Latitude;
this.Longitude = posReport.Longitude;
this.COG = posReport.COG;
this.Heading = posReport.TrueHeading;
this.ManeuverIndicator = posReport.ManeuverIndicator;
this.RAIM = posReport.Raim == 1;
this.Radio = posReport.CommState;
this.LastUpdate = DateTime.Now;
}
internal void Update(AIS_StaticData staticData)
{
this.AISVersion = staticData.Version;
this.IMO = staticData.IMONumber;
this.Callsign = staticData.Callsign;
this.Name = staticData.Name;
this.ShipType = staticData.ShipType;
this.Breadth = staticData.Breadth;
this.Length = staticData.Length;
this.TypeOfDevice = staticData.TypeOfDevice;
this.ETA = staticData.ETA;
this.Draught = staticData.Draught;
this.Destination = staticData.Destination;
this.DTE = staticData.DTE == 0;
this.IsClassB = false;
this.LastUpdate = DateTime.Now;
}
internal void Update(AIS_ClassBStatic staticData)
{
this.IsClassB = true;
if(staticData.IsPartA)
{
this.Name = staticData.Name;
}
if(staticData.IsPartB)
{
this.ShipType = staticData.ShipTypeVal;
// this.VendorId = staticData.VendorId;
this.Callsign = staticData.Callsign;
this.Length = staticData.Length;
this.Breadth = staticData.Breadth;
}
this.LastUpdate = DateTime.Now;
}
internal void Update(AIS_ClassB bPos)
{
this.IsClassB = true;
this.SOG = bPos.Sog;
this.Accuracy = bPos.Accuracy == 1;
this.Longitude = bPos.Longitude;
this.Latitude = bPos.Latitude;
this.COG = bPos.Cog;
this.Heading = bPos.TrueHeading;
this.RAIM = bPos.Raim == 1;
this.Radio = bPos.CommState;
this.LastUpdate = DateTime.Now;
}
internal void Update(AIS_ClassBExt bPosExt)
{
this.IsClassB = true;
this.SOG = bPosExt.Sog;
this.Accuracy = bPosExt.Accuracy == 1;
this.Longitude = bPosExt.Longitude;
this.Latitude = bPosExt.Latitude;
this.COG = bPosExt.Cog;
this.Name = bPosExt.Name;
this.Heading = bPosExt.TrueHeading;
this.ShipType = bPosExt.ShipType;
this.Length = bPosExt.Length;
this.Breadth = bPosExt.Breadth;
this.RAIM = bPosExt.RAIM == 1;
this.DTE = bPosExt.DTE == 1;
this.LastUpdate = DateTime.Now;
}
internal static AIS_Target CreateFromReader(IDataReader reader)
{
int mmsi = reader.GetInt32(0);
AIS_Target result = new AIS_Target(mmsi);
if (!reader.IsDBNull(1))
result.AISVersion = reader.GetInt32(1);
if (!reader.IsDBNull(2))
result.IMO = reader.GetInt32(2);
if (!reader.IsDBNull(3))
result.Callsign = reader.GetString(3);
if (!reader.IsDBNull(4))
result.Name = reader.GetString(4);
if (!reader.IsDBNull(5))
result.ShipType = reader.GetInt32(5);
if (!reader.IsDBNull(6))
result.TypeOfDevice = reader.GetInt32(6);
if (!reader.IsDBNull(7))
result.Draught = reader.GetInt32(7) / 10.0;
if (!reader.IsDBNull(8))
result.Destination = reader.GetString(8);
if (!reader.IsDBNull(9))
result.DTE = reader.GetBoolean(9);
if (!reader.IsDBNull(10))
result.IsClassB = reader.GetBoolean(10);
if (!reader.IsDBNull(11))
result.Breadth = reader.GetInt32(11);
if (!reader.IsDBNull(12))
result.Length = reader.GetInt32(12);
if (!reader.IsDBNull(13))
result.ETA = DateTime.Parse(reader.GetString(13));
if (!reader.IsDBNull(14))
result.LastUpdate = DateTime.Parse(reader.GetString(14));
result.UpdateCount = reader.GetInt32(15);
return result;
}
#endregion
#region overrides
public override string ToString()
{
return string.Format("{0} [{1}]", this.Name, this.MMSI);
}
#endregion
#region IComparable implementation
public int CompareTo(AIS_Target other)
{
return this.Name.CompareTo(other.Name);
}
#endregion
}
}