diff --git a/GMap.NET.WindowsMobile/GMap.NET.GPS/GPS.cs b/GMap.NET.WindowsMobile/GMap.NET.GPS/GPS.cs deleted file mode 100644 --- a/GMap.NET.WindowsMobile/GMap.NET.GPS/GPS.cs +++ /dev/null @@ -1,390 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// -// Use of this sample source code is subject to the terms of the Microsoft -// license agreement under which you licensed this sample source code. If -// you did not accept the terms of the license agreement, you are not -// authorized to use this sample source code. For the terms of the license, -// please see the license agreement between you and Microsoft or, if applicable, -// see the LICENSE.RTF on your install media or the root of your tools installation. -// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES. -// -using System; -using System.Runtime.InteropServices; -using System.Text; - -#if PocketPC -using OpenNETCF.ComponentModel; -using OpenNETCF.Threading; -using Thread=OpenNETCF.Threading.Thread2; -using System.Diagnostics; -#endif - -namespace GMap.NET.GPS -{ - public delegate void LocationChangedEventHandler(object sender, GpsPosition args); - public delegate void DeviceStateChangedEventHandler(object sender, GpsDeviceState args); - - /// - /// Summary description for GPS. - /// - public class Gps - { - // handle to the gps device - IntPtr gpsHandle = IntPtr.Zero; - - // handle to the native event that is signalled when the GPS - // devices gets a new location - IntPtr newLocationHandle = IntPtr.Zero; - - // handle to the native event that is signalled when the GPS - // device state changes - IntPtr deviceStateChangedHandle = IntPtr.Zero; - - // handle to the native event that we use to stop our event - // thread - IntPtr stopHandle = IntPtr.Zero; - - // holds our event thread instance - Thread gpsEventThread = null; - - - event LocationChangedEventHandler locationChanged; - - /// - /// Event that is raised when the GPS locaction data changes - /// - public event LocationChangedEventHandler LocationChanged - { - add - { - locationChanged += value; - - // create our event thread only if the user decides to listen - CreateGpsEventThread(); - } - remove - { - locationChanged -= value; - } - } - - - event DeviceStateChangedEventHandler deviceStateChanged; - - /// - /// Event that is raised when the GPS device state changes - /// - public event DeviceStateChangedEventHandler DeviceStateChanged - { - add - { - deviceStateChanged += value; - - // create our event thread only if the user decides to listen - CreateGpsEventThread(); - } - remove - { - deviceStateChanged -= value; - } - } - - /// - /// True: The GPS device has been opened. False: It has not been opened - /// - public bool Opened - { - get - { - return gpsHandle != IntPtr.Zero; - } - } - - ~Gps() - { - // make sure that the GPS was closed. - Close(); - } - - /// - /// Opens the GPS device and prepares to receive data from it. - /// - public void Open() - { - if(!Opened) - { - // create handles for GPS events - newLocationHandle = CreateEvent(IntPtr.Zero, 0, 0, null); - deviceStateChangedHandle = CreateEvent(IntPtr.Zero, 0, 0, null); - stopHandle = CreateEvent(IntPtr.Zero, 0, 0, null); - - gpsHandle = GPSOpenDevice(newLocationHandle, deviceStateChangedHandle, null, 0); - - // if events were hooked up before the device was opened, we'll need - // to create the gps event thread. - if(locationChanged != null || deviceStateChanged != null) - { - CreateGpsEventThread(); - } - } - } - - /// - /// Closes the gps device. - /// - public void Close() - { - if(gpsHandle != IntPtr.Zero) - { - GPSCloseDevice(gpsHandle); - gpsHandle = IntPtr.Zero; - } - - // Set our native stop event so we can exit our event thread. - if(stopHandle != IntPtr.Zero) - { - EventModify(stopHandle, eventSet); - } - - // wait exit - if(gpsEventThread != null && gpsEventThread.IsAlive) - { - //gpsEventThread.Join(4444); - } - } - - /// - /// Get the position reported by the GPS receiver - /// - /// GpsPosition class with all the position details - public GpsPosition GetPosition() - { - return GetPosition(TimeSpan.Zero); - } - - /// - /// Get the position reported by the GPS receiver that is no older than - /// the maxAge passed in - /// - /// Max age of the gps position data that you want back. - /// If there is no data within the required age, null is returned. - /// if maxAge == TimeSpan.Zero, then the age of the data is ignored - /// GpsPosition class with all the position details - public GpsPosition GetPosition(TimeSpan maxAge) - { - GpsPosition gpsPosition = null; - if(Opened) - { - // allocate the necessary memory on the native side. We have a class (GpsPosition) that - // has the same memory layout as its native counterpart - IntPtr ptr = Utils.LocalAlloc(Marshal.SizeOf(typeof(GpsPosition))); - - // fill in the required fields - gpsPosition = new GpsPosition(); - gpsPosition.dwVersion = 1; - gpsPosition.dwSize = Marshal.SizeOf(typeof(GpsPosition)); - - // Marshal our data to the native pointer we allocated. - Marshal.StructureToPtr(gpsPosition, ptr, false); - - // call native method passing in our native buffer - int result = GPSGetPosition(gpsHandle, ptr, 500000, 0); - if(result == 0) - { - // native call succeeded, marshal native data to our managed data - gpsPosition = (GpsPosition) Marshal.PtrToStructure(ptr, typeof(GpsPosition)); - - if(maxAge != TimeSpan.Zero) - { - // check to see if the data is recent enough. - if(!gpsPosition.Time.HasValue || DateTime.UtcNow - maxAge > gpsPosition.Time) - { - gpsPosition = null; - } - } - } - - // free our native memory - Utils.LocalFree(ptr); - } - - return gpsPosition; - } - - /// - /// Queries the device state. - /// - /// Device state information - public GpsDeviceState GetDeviceState() - { - GpsDeviceState device = null; - - // allocate a buffer on the native side. Since the - IntPtr pGpsDevice = Utils.LocalAlloc(GpsDeviceState.GpsDeviceStructureSize); - - // GPS_DEVICE structure has arrays of characters, it's easier to just - // write directly into memory rather than create a managed structure with - // the same layout. - Marshal.WriteInt32(pGpsDevice, 1); // write out GPS version of 1 - Marshal.WriteInt32(pGpsDevice, 4, GpsDeviceState.GpsDeviceStructureSize); // write out dwSize of structure - - int result = GPSGetDeviceState(pGpsDevice); - - if(result == 0) - { - // instantiate the GpsDeviceState class passing in the native pointer - device = new GpsDeviceState(pGpsDevice); - } - - // free our native memory - Utils.LocalFree(pGpsDevice); - - return device; - } - - /// - /// Creates our event thread that will receive native events - /// - private void CreateGpsEventThread() - { - // we only want to create the thread if we don't have one created already - // and we have opened the gps device - if(gpsEventThread == null && gpsHandle != IntPtr.Zero) - { - // Create and start thread to listen for GPS events - gpsEventThread = new Thread(new System.Threading.ThreadStart(WaitForGpsEvents)); - gpsEventThread.IsBackground = false; - gpsEventThread.Name = "GMap.NET GpsEvents"; - gpsEventThread.Start(); - } - } - - /// - /// Method used to listen for native events from the GPS. - /// - private void WaitForGpsEvents() - { - //lock (this) - { - bool listening = true; - // allocate 3 handles worth of memory to pass to WaitForMultipleObjects - IntPtr handles = Utils.LocalAlloc(12); - - // write the three handles we are listening for. - Marshal.WriteInt32(handles, 0, stopHandle.ToInt32()); - Marshal.WriteInt32(handles, 4, deviceStateChangedHandle.ToInt32()); - Marshal.WriteInt32(handles, 8, newLocationHandle.ToInt32()); - - while(listening) - { - int obj = WaitForMultipleObjects(3, handles, 0, -1); - if(obj != waitFailed) - { - switch(obj) - { - case 0: - // we've been signalled to stop - listening = false; - break; - - case 1: - // device state has changed - if(deviceStateChanged != null) - { - deviceStateChanged(this, GetDeviceState()); - } - break; - - case 2: - // location has changed - if(locationChanged != null) - { - locationChanged(this, GetPosition()); - } - break; - } - } - } - - // free the memory we allocated for the native handles - Utils.LocalFree(handles); - - if(newLocationHandle != IntPtr.Zero) - { - CloseHandle(newLocationHandle); - newLocationHandle = IntPtr.Zero; - } - - if(deviceStateChangedHandle != IntPtr.Zero) - { - CloseHandle(deviceStateChangedHandle); - deviceStateChangedHandle = IntPtr.Zero; - } - - if(stopHandle != IntPtr.Zero) - { - CloseHandle(stopHandle); - stopHandle = IntPtr.Zero; - } - - // clear our gpsEventThread so that we can recreate this thread again - // if the events are hooked up again. - gpsEventThread = null; - - Debug.WriteLine("gps device stopped..."); - } - } - - public double GetDistance(double p1Lat, double p1Lng, double p2Lat, double p2Lng) - { - double dLat1InRad = p1Lat * (Math.PI / 180); - double dLong1InRad = p1Lng * (Math.PI / 180); - double dLat2InRad = p2Lat * (Math.PI / 180); - double dLong2InRad = p2Lng * (Math.PI / 180); - double dLongitude = dLong2InRad - dLong1InRad; - double dLatitude = dLat2InRad - dLat1InRad; - double a = Math.Pow(Math.Sin(dLatitude / 2), 2) + Math.Cos(dLat1InRad) * Math.Cos(dLat2InRad) * Math.Pow(Math.Sin(dLongitude / 2), 2); - double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a)); - double dDistance = EarthRadiusKm * c; - return dDistance; - } - - /// - /// Radius of the Earth - /// - public double EarthRadiusKm = 6378.137; // WGS-84 - - #region PInvokes to gpsapi.dll - [DllImport("gpsapi.dll")] - static extern IntPtr GPSOpenDevice(IntPtr hNewLocationData, IntPtr hDeviceStateChange, string szDeviceName, int dwFlags); - - [DllImport("gpsapi.dll")] - static extern int GPSCloseDevice(IntPtr hGPSDevice); - - [DllImport("gpsapi.dll")] - static extern int GPSGetPosition(IntPtr hGPSDevice, IntPtr pGPSPosition, int dwMaximumAge, int dwFlags); - - [DllImport("gpsapi.dll")] - static extern int GPSGetDeviceState(IntPtr pGPSDevice); - #endregion - - #region PInvokes to coredll.dll - [DllImport("coredll.dll")] - static extern IntPtr CreateEvent(IntPtr lpEventAttributes, int bManualReset, int bInitialState, StringBuilder lpName); - - [DllImport("coredll.dll")] - static extern int CloseHandle(IntPtr hObject); - - const int waitFailed = -1; - [DllImport("coredll.dll")] - static extern int WaitForMultipleObjects(int nCount, IntPtr lpHandles, int fWaitAll, int dwMilliseconds); - - const int eventSet = 3; - [DllImport("coredll.dll")] - static extern int EventModify(IntPtr hHandle, int dwFunc); - - #endregion - } -}