📄 gps.cs
字号:
}
public void Stop()
{
if (state!=States.Running) return;
if (!demomodeon)
{
// signal for the thread to exit
setstate=States.Stopping;
}
else
{
// signal for the thread to exit
setstate=States.Stopped;
}
}
/// <summary>
/// calculate distance between a position and another position (in meters)
/// </summary>
/// <param name="pos1">Position 1</param>
/// <param name="pos2">Position 2</param>
/// <param name="unit">Units of measure</param>
/// <returns></returns>
public decimal CalculateDistance(Position pos1, Position pos2, Units unit)
{
double lat1 = (double)pos1.Latitude_Decimal;
double lat2 = (double)pos2.Latitude_Decimal;
double lon1 = (double)pos1.Longitude_Decimal;
double lon2 = (double)pos2.Longitude_Decimal;
double distance;
if ((lat1 == lat2) && (lon1 == lon2))
return 0;
double DEG2RAD = Math.PI/180;
lat1 *= DEG2RAD;
lat2 *= DEG2RAD;
lon1 *= DEG2RAD;
lon2 *= DEG2RAD;
distance = (60.0 * ((Math.Acos((Math.Sin(lat1) * Math.Sin(lat2)) + (Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(lon2 - lon1)))) / DEG2RAD));
switch (unit)
{
case Units.Kilometers:
return Misc.NmToMeters((decimal)distance)/1000;
case Units.Knots:
return Misc.ToDecimal((decimal)distance)/1000;
case Units.Miles:
return Misc.NmToMiles((decimal)distance)/1000;
default:
return 0;
}
}
/// <summary>
/// calculate distance between last position and new position (in km)
/// </summary>
/// <returns></returns>
///
public decimal CalculateDistance(Units unit)
{
// if no move, no distance to add
if (mov.SpeedKnots==0)
return 0;
double lat1mem=(double)pos.Latitude_Decimal_Mem;
double lat2=(double)pos.Latitude_Decimal;
double lon1mem=(double)pos.Longitude_Decimal_Mem;
double lon2=(double)pos.Longitude_Decimal;
// if no move, no distance to add
if ((lat2 == lat1mem) && (lon2 == lon1mem))
return 0;
double lat1;
double lon1;
// the first time
if (InitDistance==true)
lat1 = lat1mem;
else
lat1 = lat2;
pos.Latitude_Decimal_Mem = pos.Latitude_Decimal;
if (InitDistance==true)
lon1 = lon1mem;
else
lon1 = lon2;
pos.Longitude_Decimal_Mem = pos.Longitude_Decimal;
double distance;
if (InitDistance==false) InitDistance=true;
if ((lat1 == lat2) && (lon1 == lon2))
return 0;
double DEG2RAD = Math.PI/180;
lat1 *= DEG2RAD;
lat2 *= DEG2RAD;
lon1 *= DEG2RAD;
lon2 *= DEG2RAD;
distance = (60.0 * ((Math.Acos((Math.Sin(lat1) * Math.Sin(lat2)) + (Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(lon2 - lon1)))) / DEG2RAD));
switch (unit)
{
case Units.Kilometers:
return Misc.NmToMeters((decimal)distance)/1000;
case Units.Knots:
return Misc.ToDecimal((decimal)distance)/1000;
case Units.Miles:
return Misc.NmToMiles((decimal)distance)/1000;
default:
return 0;
}
}
/// <summary>
/// calculate distance with time and average speed (in km)
/// </summary>
/// <param name="TimePC"></param>
/// <param name="TimeSAT"></param>
/// <param name="unit"></param>
/// <returns></returns>
public decimal CalculateDistance(double TimePC,double TimeSAT, Units unit)
{
if (mov.SpeedKnotsAverage==0) return 0;
double TimeInterval;
if (pos.SatTime.TimeOfDay.TotalSeconds!=0)
TimeInterval = pos.SatTime.TimeOfDay.TotalSeconds - TimeSAT;
else
TimeInterval = DateTime.Now.TimeOfDay.TotalSeconds - TimePC;
switch (unit)
{
case Units.Kilometers:
return (Misc.ToDecimal(TimeInterval) * mov.SpeedKphAverage)/3600;
case Units.Knots:
return (Misc.ToDecimal(TimeInterval) * mov.SpeedKnotsAverage)/3600;
case Units.Miles:
return (Misc.ToDecimal(TimeInterval) * mov.SpeedMphAverage)/3600;
default:
return 0;
}
}
/// <summary>
/// calculate bearing between a position and another position (in degrees)
/// </summary>
/// <param name="pos1"></param>
/// <param name="pos2"></param>
/// <returns></returns>
public decimal CalculateBearing(Position pos1,Position pos2)
{
double DEG2RAD = Math.PI/180;
double lat1 = (double)pos1.Latitude_Decimal * DEG2RAD;
double lat2 = (double)pos2.Latitude_Decimal * DEG2RAD;
double lon1 = (double)pos1.Longitude_Decimal * DEG2RAD;
double lon2 = (double)pos2.Longitude_Decimal * DEG2RAD;
double bearing;
if ((lat1 == lat2) && (lon1 == lon2))
return 0;
bearing = (Math.Atan2(Math.Sin(lon2 - lon1) * Math.Cos(lat2),
Math.Cos(lat1) * Math.Sin(lat2) - Math.Sin(lat1) * Math.Cos(lat2) * Math.Cos(lon2 - lon1))) / DEG2RAD;
// returns a value between -180 and 180.
if (bearing < 0.0)
bearing += 360.0;
return (decimal)bearing;
}
#endregion
#region protected methods
protected virtual void OnGpsSentence(GpsSentenceEventArgs e)
{
if (GpsSentence != null) GpsSentence(this, e);
}
protected virtual void OnGpsCommState(GpsCommStateEventArgs e)
{
if (GpsCommState!=null) GpsCommState(this, e);
}
protected virtual void OnPosition(Position pos)
{
if (Position!=null) Position(this,pos);
}
protected virtual void OnMovement(Movement mov)
{
if (Movement!=null) Movement(this,mov);
}
protected virtual void OnSatellites(Satellite[] satellites)
{
if (Satellite!=null) Satellite(this,satellites);
}
protected virtual void OnError(Exception exception,string message,string gps_data)
{
lasterror=message;
if (Error!=null) Error(this,exception,message,gps_data);
}
protected virtual void OnAutoDiscovery(OpenNETCF.IO.Serial.GPS.AutoDiscoverStates state, string port, OpenNETCF.IO.Serial.BaudRates bauds)
{
if (GpsAutoDiscovery!=null) GpsAutoDiscovery(this,state,port,bauds);
}
protected virtual void OnDataReceived(string data)
{
if (DataReceived!=null) DataReceived(this,data);
}
#endregion
#region events
public event GpsSentenceEventHandler GpsSentence;
public event GpsCommStateEventHandler GpsCommState;
public event PositionEventHandler Position;
public event MovementEventHandler Movement;
public event SatelliteEventHandler Satellite;
public event ErrorEventHandler Error;
public event GpsAutoDiscoveryEventHandler GpsAutoDiscovery;
private event DataReceivedEventHandler DataReceived;
#endregion
#region delegates
public delegate void GpsSentenceEventHandler(object sender, GpsSentenceEventArgs e);
public delegate void GpsCommStateEventHandler(object sender, GpsCommStateEventArgs e);
public delegate void GpsStatusEventHandler(object sender, StatusType GpsStatus);
public delegate void PositionEventHandler(object sender,Position pos);
public delegate void MovementEventHandler(object sender,Movement mov);
public delegate void SatelliteEventHandler(object sender,Satellite[] satellites);
public delegate void ErrorEventHandler(object sender,Exception exception,string message,string gps_data);
public delegate void GpsAutoDiscoveryEventHandler(object sender, OpenNETCF.IO.Serial.GPS.AutoDiscoverStates state, string port, OpenNETCF.IO.Serial.BaudRates bauds);
private delegate void DataReceivedEventHandler(object sender, string data);
#endregion
#region properties
public bool AutoDiscovery
{
set
{
autodiscovery=value;
}
get
{
return autodiscovery;
}
}
public Satellite[] Satellites
{
get
{
return satellites;
}
}
public Position Pos
{
get
{
return pos;
}
}
private Movement Mov
{
get
{
return mov;
}
}
public bool TraceOn
{
set
{
traceon=value;
}
get
{
return traceon;
}
}
public bool DemoModeOn
{
set
{
demomodeon=value;
}
}
public string DemoFile
{
set
{
demofile=value;
}
get
{
return demofile;
}
}
public string TraceFile
{
set
{
tracefile=value;
}
get
{
return tracefile;
}
}
public States State
{
get
{
return state;
}
}
public StatusType GpsState
{
get
{
return gpsstatus;
}
}
private States setstate
{
set
{
state=value;
this.OnGpsCommState(new GpsCommStateEventArgs(value));
}
}
public string ComPort
{
set
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -