⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gps.cs

📁 Opennet 发送和接受程序,可用于移动存储设备的开发,请好好查看
💻 CS
📖 第 1 页 / 共 5 页
字号:
		}

		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 + -