// //Show the user selected icon for the gps device on the WorldView public void ShowOverlay(GPSRenderInformation renderInformation) { lock ("RenderAccess") { if (renderInformation.gpsTrack!=null) { //Resize array if necessary if (renderInformation.iIndex >= m_uTrackResize) { m_uTrackResize = (uint)renderInformation.iIndex+1; Array.Resize(ref m_gpsTrack, (int)m_uTrackResize); } if (m_gpsTrack[renderInformation.iIndex]==null) m_gpsTrack[renderInformation.iIndex] = new GPSTrackLine(ParentApplication.WorldWindow.CurrentWorld, renderInformation.sDescription); m_gpsTrack[renderInformation.iIndex].Initialize(this.drawArgs); m_gpsTrack[renderInformation.iIndex].SetTrack(this, renderInformation.gpsTrack, renderInformation.sDescription, renderInformation.colorTrack, renderInformation.sIcon, renderInformation.bShowInfo); Add(m_gpsTrack[renderInformation.iIndex]); } else { if (renderInformation.bPOI==false) { int iIndex; for (iIndex=0; iIndex<m_iGpsIconIndex; iIndex++) if (renderInformation.sDescription==m_gpsIcons[iIndex].m_RenderInfo.sDescription) break; if (iIndex==m_iGpsIconIndex) { //Resize array if necessary if (m_iGpsIconIndex>=m_uIconResize) { m_uIconResize+=5; Array.Resize(ref m_gpsIcons, (int)m_uIconResize); } m_gpsIcons[iIndex] = new GPSIcon(this, renderInformation, ParentApplication.WorldWindow.CurrentWorld); m_gpsIcons[iIndex].Initialize(this.drawArgs); Add(m_gpsIcons[iIndex]); m_iGpsIconIndex++; } if (m_gpsIcons[iIndex].m_bTrack) Plugin.pluginWorldWindowGotoLatLonHeading(renderInformation.fLat,renderInformation.fLon,renderInformation.fHeading,renderInformation.iStartAltitud); m_gpsIcons[iIndex].SetGpsData(drawArgs, renderInformation); } else { //Resize array if necessary if (m_iGpsPOIIndex >= m_uPOIResize) { m_uPOIResize += 5; Array.Resize(ref m_gpsPOI, (int)m_uPOIResize); } if (m_gpsPOI[m_iGpsPOIIndex]==null) { m_gpsPOI[m_iGpsPOIIndex] = new GPSIcon(this, renderInformation.iIndex,renderInformation, ParentApplication.WorldWindow.CurrentWorld); m_gpsPOI[m_iGpsPOIIndex].Initialize(this.drawArgs); Add(m_gpsPOI[m_iGpsPOIIndex]); } m_iGpsPOIIndex++; } } } }
//Show the user selected icon for the gps device on the WorldView public void pluginShowOverlay(GPSRenderInformation renderInformation) { renderInformation.iActiveTrack=gpsTracker.GetActiveTrack(); gpsOverlay.ShowOverlay(renderInformation); }
//Update the icon position from the latest gps data public void SetGpsData(DrawArgs drawArgs, GPSRenderInformation renderInformation) { this.m_RenderInfo=renderInformation; if (m_bSignalDistance) { for (int i=0; i<m_gpsTrackerOverlay.m_iGpsPOIIndex; i++) { m_gpsTrackerOverlay.m_gpsPOI[i].m_fLatitudeFrom=m_RenderInfo.fLat; m_gpsTrackerOverlay.m_gpsPOI[i].m_fLongitudeFrom=m_RenderInfo.fLon; m_gpsTrackerOverlay.m_gpsPOI[i].m_sDescriptionFrom=m_RenderInfo.sDescription; } } if (renderInformation.bRestartTrack) { m_uVerticesCount=0; m_uPointCount=0; m_uTotalPointCount=0; m_fTotalDistance=0; } else if (m_fVerticalExaggeration != World.Settings.VerticalExaggeration) { //There was a change in vertical exaggeration, recalculate track uint uPoint; if (m_uVerticesCount==0) uPoint=m_uPointCount; else uPoint=50000; for (uint uVertices=0; uVertices<=m_uVerticesCount; uVertices++) { for (uint uP=0; uP<uPoint; uP++) { float elevation = (float)(m_parentWorld.TerrainAccessor.GetElevationAt(this.vertices[uVertices].fLat[uP], this.vertices[uVertices].fLon[uP], (double)241)); if (this.vertices[m_uVerticesCount].fAlt[uP] < elevation) this.vertices[m_uVerticesCount].fAlt[uP] = elevation; Vector3 v=MathEngine.SphericalToCartesian(this.vertices[uVertices].fLat[uP], this.vertices[uVertices].fLon[uP], this.m_parentWorld.EquatorialRadius + (this.vertices[uVertices].fAlt[uP] * World.Settings.VerticalExaggeration)); this.vertices[uVertices].vertices[uP].X = v.X; this.vertices[uVertices].vertices[uP].Y = v.Y; this.vertices[uVertices].vertices[uP].Z = v.Z; } if (uVertices == m_uVerticesCount) uPoint = m_uPointCount; } m_fVerticalExaggeration = World.Settings.VerticalExaggeration; } if (m_uPointCount>=50000) { m_uVerticesCount++; m_uPointCount=0; } if (m_uPointCount==0) { this.vertices[m_uVerticesCount] = new GPSTrackVertices(); this.vertices[m_uVerticesCount].vertices = new CustomVertex.PositionColored[50000]; this.vertices[m_uVerticesCount].fLat = new double[50000]; this.vertices[m_uVerticesCount].fLon = new double[50000]; this.vertices[m_uVerticesCount].fAlt = new double[50000]; } float elev = (float)(m_parentWorld.TerrainAccessor.GetElevationAt(renderInformation.fLat, renderInformation.fLon, (double)241)); if (renderInformation.fAlt < elev) renderInformation.fAlt = elev; Vector3 vTrack=MathEngine.SphericalToCartesian(renderInformation.fLat, renderInformation.fLon, this.m_parentWorld.EquatorialRadius + (renderInformation.fAlt * World.Settings.VerticalExaggeration)); this.vertices[m_uVerticesCount].vertices[m_uPointCount].X = vTrack.X; this.vertices[m_uVerticesCount].vertices[m_uPointCount].Y = vTrack.Y; this.vertices[m_uVerticesCount].vertices[m_uPointCount].Z = vTrack.Z; this.vertices[m_uVerticesCount].vertices[m_uPointCount].Color =m_RenderInfo.colorTrack.ToArgb(); this.vertices[m_uVerticesCount].fLat[m_uPointCount] = renderInformation.fLat; this.vertices[m_uVerticesCount].fLon[m_uPointCount] = renderInformation.fLon; this.vertices[m_uVerticesCount].fAlt[m_uPointCount] = renderInformation.fAlt; m_uPointCount++; if (m_uTotalPointCount>0) { double dDistance = CalculateDistance(m_fLatFrom, m_fLonFrom, renderInformation.fLat, renderInformation.fLon); if (double.IsNaN(dDistance)==false) m_fTotalDistance=m_fTotalDistance+(float)dDistance; } m_fLatFrom=renderInformation.fLat; m_fLonFrom=renderInformation.fLon; m_uTotalPointCount++; }
//static int VK_RCONTROL = 0xA3; //static int VK_LALT = 0xA4; //static int VK_RALT = 0xA5; //float fFeetToMeter = 31F/100F; public GPSIcon( GPSTrackerOverlay gpsTrackerOverlay, int iIndex, GPSRenderInformation renderInformation, World parentWorld) : base(renderInformation.sDescription, parentWorld.Position, Quaternion.RotationYawPitchRoll(0,0,0)) { m_fVerticalExaggeration = World.Settings.VerticalExaggeration; m_RenderInfo=renderInformation; m_RenderInfo.bPOI=true; this.m_gpsTrackerOverlay=gpsTrackerOverlay; m_RenderInfo.iIndex=iIndex; this.m_parentWorld = parentWorld; this.m_textureFileName = m_RenderInfo.sIcon; this.m_iTextureWidth = 32; this.m_iTextureHeight = 32; this.m_iIconWidth = 32; this.m_iIconHeight = 32; this.m_iIconWidthHalf = m_iIconWidth/2; this.m_iIconHeightHalf = m_iIconHeight/2; this.m_bTrack=renderInformation.fTrack; m_bShowInfo = m_RenderInfo.bShowInfo; m_fLatitudeFrom=1000F; m_fLongitudeFrom=1000F; m_sDescriptionFrom=""; m_bSignalDistance=false; m_uVerticesCount=0; m_uPointCount=0; m_fTotalDistance=0; m_uTotalPointCount=0; this.RenderPriority = RenderPriority.Icons; }
public GPSIcon( GPSTrackerOverlay gpsTrackerOverlay, GPSRenderInformation renderInformation, World parentWorld) : base(renderInformation.sDescription, parentWorld.Position, Quaternion.RotationYawPitchRoll(0,0,0)) { m_fVerticalExaggeration = World.Settings.VerticalExaggeration; m_RenderInfo=renderInformation; m_RenderInfo.bPOI=false; this.m_gpsTrackerOverlay=gpsTrackerOverlay; this.m_parentWorld = parentWorld; this.m_textureFileName = m_RenderInfo.sIcon; this.m_iTextureWidth = 32; this.m_iTextureHeight = 32; this.m_iIconWidth = 32; this.m_iIconHeight = 32; this.m_iIconWidthHalf = m_iIconWidth/2; this.m_iIconHeightHalf = m_iIconHeight/2; m_bSignalDistance=false; this.m_bTrack=renderInformation.fTrack; m_bShowInfo = m_RenderInfo.bShowInfo; m_bTrackLine = m_RenderInfo.bTrackLine; m_bTrackHeading = gpsTrackerOverlay.Plugin.gpsTracker.m_bTrackHeading; m_fLastAlt=-1000000F; m_fLastRoll=-1000F; m_fLastDepth=-1000000F; m_fLastPitch=-1000F; m_fLastSpeed=-1F; m_fLastESpeed=-1000000F; m_fLastNSpeed=-1000000F; m_fLastVSpeed=-1000000F; m_fLastHeading=-1F; m_iLastHour=-1; m_iLastMin=-1; m_fLastSec=(float)-1; m_iLastDay=-1; m_iLastMonth=-1; m_iLastYear=-1; m_fLatitudeFrom=1000F; m_fLongitudeFrom=1000F; m_sDescriptionFrom=""; m_uVerticesCount=0; m_uPointCount=0; m_fTotalDistance=0; m_uTotalPointCount=0; for (int i=0; i<m_gpsTrackerOverlay.m_iGpsIconIndex; i++) if (m_gpsTrackerOverlay.m_gpsIcons[i].m_RenderInfo.iIndex==m_RenderInfo.iIndex && m_gpsTrackerOverlay.m_gpsIcons[i].m_bTrack && m_bTrack) m_bTrack=false; this.RenderPriority = RenderPriority.Icons; }
public void threadStartFile() { int iIndex = Int32.Parse(Thread.CurrentThread.Name); GPSSource gpsSource = (GPSSource)m_GpsTracker.m_gpsSourceList[iIndex]; bool bShowError = true; while (m_GpsTracker.m_fCloseThreads == false) { gpsSource.GpsPos.m_gpsTrack = null; try { string sFileName = ""; lock ("threadStartFile") { m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo("GPSTracker: Downloading " + gpsSource.sFileName); WebClient myWebClient = new WebClient(); sFileName = GpsTrackerPlugin.m_sPluginDirectory + "\\DownloadedFile" + Convert.ToString(iIndex) + ".gpsTracker"; if (File.Exists(sFileName)) { File.Delete(sFileName); } string sWebReload = ""; if (!File.Exists(gpsSource.sFileName)) { sWebReload = "?r=" + System.Guid.NewGuid().ToString(); } myWebClient.DownloadFile(gpsSource.sFileName + sWebReload, sFileName); } if (File.Exists(sFileName)) { gpsSource.bBabelNMEA = false; lock ("threadStartFile") { //Convert files to a known format switch (gpsSource.saGpsBabelFormat[0]) { case "nasabaloon": if (m_GpsTracker.m_NMEA.CheckConvertNasaBaloon(sFileName, gpsSource.sFileName)) { sFileName = sFileName + ".NMEAText"; } break; case "aprs": case "nmea": case "GpsTracker": case "Unknown": //Nothing to convert break; default: //Use GpsBabel string sBabelCommandLine; if (gpsSource.bWaypoints) { sBabelCommandLine = "-w;"; } else { sBabelCommandLine = "-t;-r;"; } sBabelCommandLine += "-i;" + gpsSource.saGpsBabelFormat[0] + ";"; sBabelCommandLine += "-f;" + sFileName + ";"; if (gpsSource.bWaypoints) { sBabelCommandLine += "-o;csv;-F;" + sFileName + ".WaypointsCSV;"; if (File.Exists(sFileName + ".WaypointsCSV")) { File.Delete(sFileName + ".WaypointsCSV"); } } else { sBabelCommandLine += "-o;nmea;-F;" + sFileName + ".NMEAText;"; if (File.Exists(sFileName + ".NMEAText")) { File.Delete(sFileName + ".NMEAText"); } } m_GpsBabel.Execute(sBabelCommandLine); if (gpsSource.bWaypoints && File.Exists(sFileName + ".WaypointsCSV")) { FileInfo fInfo = new FileInfo(sFileName + ".WaypointsCSV"); if (fInfo.Length > 0) { sFileName += ".WaypointsCSV"; } } else if (gpsSource.bWaypoints == false && File.Exists(sFileName + ".NMEAText")) { FileInfo fInfo = new FileInfo(sFileName + ".NMEAText"); if (fInfo.Length > 0) { sFileName += ".NMEAText"; gpsSource.bBabelNMEA = true; } } break; } } if (gpsSource.bTrackAtOnce != true && !m_GpsTracker.m_File.IsTrackAtOnce(sFileName)) { if (!gpsSource.bWaypoints) { m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo(""); m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo("GPSTracker: Active"); gpsSource.sFileNameSession = sFileName; gpsSource.iFilePlaySpeed = gpsSource.iPlaySpeed; threadFile(); } else { m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo(""); m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo("GPSTracker: Active"); ArrayList listWaypoints = new ArrayList(); StreamReader sReader = null; try { sReader = File.OpenText(sFileName); string sLine; do { sLine = sReader.ReadLine(); if (sLine != null) { listWaypoints.Add(sLine); } } while(sLine != null); } catch (Exception) { } if (sReader != null) { sReader.Close(); } if (listWaypoints.Count > 0) { char [] cSep = { ',' }; bool bTrack = gpsSource.bTrack; for (int i = 0; i < listWaypoints.Count; i++) { string sFormat = (string)listWaypoints[i]; string [] sWaypointData; sWaypointData = sFormat.Split(cSep); if (sWaypointData.Length == 3) { try { m_GpsTracker.AddPOI(sWaypointData[2], Convert.ToDouble(sWaypointData[0]), Convert.ToDouble(sWaypointData[1]), false, gpsSource); if (gpsSource.bTrack) { gpsSource.bTrack = false; } } catch (Exception) { Thread.Sleep(200); } } } gpsSource.bTrack = bTrack; } } } else { if (gpsSource.iReload > 0 && File.Exists(sFileName + ".TrackAtOnce")) { File.Delete(sFileName + ".TrackAtOnce"); } lock ("threadStartFile") { //track at once m_GpsTracker.m_File.PreprocessFile(iIndex, sFileName, gpsSource.sFileName, false, gpsSource.bForcePreprocessing); } GPSRenderInformation renderInfo = new GPSRenderInformation(); renderInfo.bPOI = false; renderInfo.iIndex = iIndex; renderInfo.sDescription = gpsSource.sDescription; renderInfo.fFix = false; renderInfo.bShowInfo = m_GpsTracker.m_bInfoText; renderInfo.bTrackLine = false; renderInfo.gpsTrack = gpsSource.GpsPos.m_gpsTrack; renderInfo.bRestartTrack = false; renderInfo.iDay = gpsSource.GpsPos.m_iDay; renderInfo.iMonth = gpsSource.GpsPos.m_iMonth; renderInfo.iYear = gpsSource.GpsPos.m_iYear; renderInfo.colorTrack = gpsSource.colorTrack; renderInfo.sIcon = gpsSource.sIconPath; // while (m_GpsTracker.m_fCloseThreads == false) // { m_GpsTracker.m_gpsTrackerPlugin.pluginShowOverlay(renderInfo); if (gpsSource.bTrack == true) { m_GpsTracker.m_gpsTrackerPlugin.pluginWorldWindowGotoLatLonHeading(gpsSource.GpsPos.m_gpsTrack.m_fLat[0], gpsSource.GpsPos.m_gpsTrack.m_fLon[0], -1F, gpsSource.iStartAltitud); } if (gpsSource.iStartAltitud > 0) { gpsSource.iStartAltitud = 0; } // Thread.Sleep(3000); // } } } if (gpsSource.iReload == 0 || m_GpsTracker.m_fCloseThreads == true) { break; } else { for (int i = 0; i < gpsSource.iReload && m_GpsTracker.m_fCloseThreads == false; i++) { Thread.Sleep(1000); } } } catch (Exception) { if (bShowError) { lock ("threadStartFile") { bShowError = false; m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo("GPSTracker: Unable to Download " + gpsSource.sFileName + ". Retrying in the background."); for (int i = 0; i < 5 && m_GpsTracker.m_fCloseThreads == false; i++) { Thread.Sleep(1000); } m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo(""); m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo("GPSTracker: Active"); } for (int i = 0; i < 60 && m_GpsTracker.m_fCloseThreads == false; i++) { Thread.Sleep(1000); } } else { m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo(""); m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo("GPSTracker: Active"); for (int i = 0; i < 60 && m_GpsTracker.m_fCloseThreads == false; i++) { Thread.Sleep(1000); } } } } gpsSource.eventThreadSync.Set(); }
private void threadPOI() { try { bool bStartAltitud = false; Thread.Sleep(500); while (!m_fCloseThreads) { lock (LockPOI) { for (int i = 0; i < m_gpsSourceList.Count; i++) { GPSSource gpsSource = (GPSSource)m_gpsSourceList[i]; Thread.Sleep(100); if (!gpsSource.bSetup) continue; if (gpsSource.sType == "POI" && gpsSource.bPOISet == false) //Point of interest { gpsSource.bPOISet = true; GPSRenderInformation renderInfo = new GPSRenderInformation(); renderInfo.bPOI = true; renderInfo.iIndex = i; renderInfo.sDescription=gpsSource.sDescription.Trim(); renderInfo.fFix = false; renderInfo.fLat = gpsSource.fLat; renderInfo.fLon = gpsSource.fLon; renderInfo.sIcon = gpsSource.sIconPath; renderInfo.bShowInfo = m_bInfoText; renderInfo.bTrackLine = m_bTrackLine; renderInfo.gpsTrack = gpsSource.GpsPos.m_gpsTrack; renderInfo.bRestartTrack = false; renderInfo.iDay = gpsSource.GpsPos.m_iDay; renderInfo.iMonth = gpsSource.GpsPos.m_iMonth; renderInfo.iYear = gpsSource.GpsPos.m_iYear; renderInfo.colorTrack = gpsSource.colorTrack; m_gpsTrackerPlugin.pluginShowOverlay(renderInfo); if (gpsSource.bTrack) { if (bStartAltitud == true) gpsSource.iStartAltitud = 0; m_gpsTrackerPlugin.pluginWorldWindowGotoLatLonHeading(Convert.ToSingle(gpsSource.fLat), Convert.ToSingle(gpsSource.fLon), -1F, gpsSource.iStartAltitud); } } else if (gpsSource.sType == "POI" && gpsSource.bTrack) { if (bStartAltitud == true) gpsSource.iStartAltitud = 0; m_gpsTrackerPlugin.pluginWorldWindowGotoLatLonHeading(Convert.ToSingle(gpsSource.fLat), Convert.ToSingle(gpsSource.fLon), -1F, gpsSource.iStartAltitud); } if (gpsSource.iStartAltitud > 0 && bStartAltitud==false) { Thread.Sleep(3000); bStartAltitud = true; gpsSource.iStartAltitud = 0; } if (m_fCloseThreads) break; } } if (!m_fCloseThreads) Thread.Sleep(1000); } m_eventPOIThreadSync.Set(); } catch (Exception) { } }
//Show the GPS icon in he World View public bool ShowGPSIcon(char [] cNMEAMessage, int iMsgLength, bool fCheck, int iIndex, bool bRestartTrack, bool bParse) { bool bRet=false; lock(LockShowIcon) { GPSSource gpsSource = (GPSSource)m_gpsSourceList[iIndex]; #if !DEBUG try #endif { if (bParse) bRet=m_NMEA.ParseGPSMessage(cNMEAMessage,iMsgLength,fCheck,iIndex); else bRet=true; if (bRet==true && m_fInitialized==true) { if(m_swRecorder!=null) { String sMsg = new String(cNMEAMessage); char [] cAny = new char[3]; cAny[0]='\r'; cAny[1]='\n'; cAny[2]='\0'; int iEnd=sMsg.IndexOfAny(cAny); if (iEnd>0) sMsg=sMsg.Substring(0,iEnd); sMsg = Convert.ToString(iIndex) + "," + sMsg; m_swRecorder.WriteLine(sMsg); } string sNMEAMsg = ""; if (gpsSource.bNMEAExport) sNMEAMsg = m_NMEA.ConvertToGPGGA(gpsSource.GpsPos); //Export to a raw NMEA file is selected if (gpsSource.bNMEAExport && sNMEAMsg != "") { if (gpsSource.swExport == null) { try { string sPath = textBoxNMEAExportPath.Text; if (sPath == "") sPath = GpsTrackerPlugin.m_sPluginDirectory + "\\NMEAExport\\" + gpsSource.sDescription + ".txt"; else { if (sPath.EndsWith("\\")) sPath = sPath + gpsSource.sDescription + ".txt"; else sPath = sPath + "\\" + gpsSource.sDescription + ".txt"; } gpsSource.swExport = File.CreateText(sPath); } catch (Exception) { gpsSource.swExport = null; } } try { if (gpsSource.swExport != null) { gpsSource.swExport.WriteLine(sNMEAMsg); gpsSource.swExport.Flush(); } } catch (Exception) { } } m_gpsTrackerPlugin.pluginLocked(true); //Show the user selected icon for the gps device on the WorldView string sPortInfo=gpsSource.sType; switch (sPortInfo) { case "UDP": sPortInfo += ": Port " + Convert.ToString(gpsSource.iUDPPort); break; case "COM": sPortInfo += ": Port " + Convert.ToString(gpsSource.iCOMPort); break; case "USB": sPortInfo += ": USB Device " + gpsSource.sUSBDevice; break; case "TCP": sPortInfo += ": IP:Port " + gpsSource.sTCPAddress + ":" + Convert.ToString(gpsSource.iTCPPort); break; case "File": //Do not display port info for an IXSEA file. string sFileName=gpsSource.sFileName; int iIndexName = sFileName.LastIndexOf('\\'); if (iIndexName>=0 && iIndexName<sFileName.Length-1) sFileName=sFileName.Substring(iIndexName+1); sPortInfo += ": " + sFileName; break; } if (m_fInitialized==true) { GPSRenderInformation renderInfo = new GPSRenderInformation(); renderInfo.fTrack=gpsSource.bTrack; renderInfo.bPOI=false; renderInfo.iIndex=iIndex; if (gpsSource.GpsPos.m_sName != "") renderInfo.sDescription = gpsSource.GpsPos.m_sName; else renderInfo.sDescription=gpsSource.sDescription; renderInfo.sComment = gpsSource.GpsPos.m_sComment; renderInfo.iAPRSIconTable = gpsSource.GpsPos.m_iAPRSIconTable; renderInfo.iAPRSIconCode = gpsSource.GpsPos.m_iAPRSIconCode; renderInfo.fFix=true; renderInfo.fLat = gpsSource.GpsPos.m_fLat; renderInfo.fLon = gpsSource.GpsPos.m_fLon; renderInfo.fAlt = gpsSource.GpsPos.m_fAlt; renderInfo.fRoll = gpsSource.GpsPos.m_fRoll; renderInfo.fPitch = gpsSource.GpsPos.m_fPitch; renderInfo.fDepth = gpsSource.GpsPos.m_fDepth; renderInfo.sAltUnit = gpsSource.GpsPos.m_sAltUnit; renderInfo.sSpeedUnit = gpsSource.GpsPos.m_sSpeedUnit; renderInfo.fSpeed = gpsSource.GpsPos.m_fSpeed; renderInfo.fESpeed = gpsSource.GpsPos.m_fESpeed; renderInfo.fNSpeed = gpsSource.GpsPos.m_fNSpeed; renderInfo.fVSpeed = gpsSource.GpsPos.m_fVSpeed; renderInfo.fHeading = gpsSource.GpsPos.m_fHeading; if (gpsSource.GpsPos.m_iAPRSIconCode >= 0 && gpsSource.GpsPos.m_iAPRSIconTable >= 0) { string sPath=""; if (gpsSource.GpsPos.m_iAPRSIconTable == Convert.ToInt32('/')) sPath = GpsTrackerPlugin.m_sPluginDirectory + "\\aprs\\primary"; if (gpsSource.GpsPos.m_iAPRSIconTable == Convert.ToInt32('\\')) sPath = GpsTrackerPlugin.m_sPluginDirectory + "\\aprs\\secondary"; if (sPath!="") { string sFileName = String.Format("{0:000}", gpsSource.GpsPos.m_iAPRSIconCode) + ".png"; if (File.Exists(sPath + "\\" + sFileName)) sPath=sPath + "\\" + sFileName; else sPath=gpsSource.sIconPath; } else sPath=gpsSource.sIconPath; renderInfo.sIcon=sPath; } else renderInfo.sIcon=gpsSource.sIconPath; renderInfo.iStartAltitud=gpsSource.iStartAltitud; renderInfo.sPortInfo=sPortInfo; renderInfo.iHour = gpsSource.GpsPos.m_iHour; renderInfo.iMin = gpsSource.GpsPos.m_iMin; renderInfo.fSec = gpsSource.GpsPos.m_iSec; renderInfo.bShowInfo=m_bInfoText; renderInfo.bTrackLine=m_bTrackLine; renderInfo.gpsTrack = gpsSource.GpsPos.m_gpsTrack; renderInfo.bRestartTrack=bRestartTrack; renderInfo.iDay = gpsSource.GpsPos.m_iDay; renderInfo.iMonth = gpsSource.GpsPos.m_iMonth; renderInfo.iYear = gpsSource.GpsPos.m_iYear; renderInfo.colorTrack=gpsSource.colorTrack; m_gpsTrackerPlugin.pluginShowOverlay(renderInfo); //GeoFence Check lock ("GeoFenceAccess") { for (int iFence = 0; iFence < m_gpsSourceList.Count; iFence++) { GPSSource gpsSourceFence = (GPSSource)m_gpsSourceList[iFence]; if (gpsSourceFence.sType == "GeoFence" && (gpsSourceFence.GeoFence.sSource == gpsSource.sDescription || gpsSourceFence.GeoFence.sSource == "All Gps Sources")) { bool bSourceIn = false; int i = 0; int j = 0; for (i = 0; i < gpsSourceFence.GeoFence.arrayLat.Count; i++) { j++; if (j == gpsSourceFence.GeoFence.arrayLat.Count) j = 0; if ((float)gpsSourceFence.GeoFence.arrayLat[i] < gpsSource.GpsPos.m_fLat && (float)gpsSourceFence.GeoFence.arrayLat[j] >= gpsSource.GpsPos.m_fLat || (float)gpsSourceFence.GeoFence.arrayLat[j] < gpsSource.GpsPos.m_fLat && (float)gpsSourceFence.GeoFence.arrayLat[i] >= gpsSource.GpsPos.m_fLat) { if ((float)gpsSourceFence.GeoFence.arrayLon[i] + (gpsSource.GpsPos.m_fLat - (float)gpsSourceFence.GeoFence.arrayLat[i]) / ((float)gpsSourceFence.GeoFence.arrayLat[j] - (float)gpsSourceFence.GeoFence.arrayLat[i]) * ((float)gpsSourceFence.GeoFence.arrayLon[j] - (float)gpsSourceFence.GeoFence.arrayLon[i]) < gpsSource.GpsPos.m_fLon) bSourceIn = !bSourceIn; } } for (i = 0; i < gpsSourceFence.GeoFence.SourcesIn.Count; i++) { string sSourceIn = (string)gpsSourceFence.GeoFence.SourcesIn[i]; if (sSourceIn == gpsSource.sDescription && bSourceIn == false) { gpsSourceFence.GeoFence.SourcesIn.RemoveAt(i); gpsSourceFence.GeoFence.SourcesOut.Add(gpsSource.sDescription); // Signal current source is going OUT SignalGeoFence(false, gpsSourceFence.GeoFence, gpsSource); break; } } for (i = 0; i < gpsSourceFence.GeoFence.SourcesOut.Count; i++) { string sSourceOut = (string)gpsSourceFence.GeoFence.SourcesOut[i]; if (sSourceOut == gpsSource.sDescription && bSourceIn == true) { gpsSourceFence.GeoFence.SourcesOut.RemoveAt(i); gpsSourceFence.GeoFence.SourcesIn.Add(gpsSource.sDescription); // Signal current source is going IN SignalGeoFence(true, gpsSourceFence.GeoFence, gpsSource); break; } } if (gpsSourceFence.GeoFence.SourcesIn.Count == 0 && bSourceIn == true) { gpsSourceFence.GeoFence.SourcesIn.Add(gpsSource.sDescription); // Signal current source is going IN SignalGeoFence(true, gpsSourceFence.GeoFence, gpsSource); } else if (gpsSourceFence.GeoFence.SourcesOut.Count == 0 && bSourceIn == false) { gpsSourceFence.GeoFence.SourcesOut.Add(gpsSource.sDescription); // Signal current source is going OUT SignalGeoFence(false, gpsSourceFence.GeoFence, gpsSource); } } } } if (gpsSource.iStartAltitud>0) { Thread.Sleep(3000); gpsSource.iStartAltitud=0; } } m_iLocked++; } //Display Message in Message Monitor try { if (m_MessageMonitor!=null && bRet) m_MessageMonitor.AddMessage(cNMEAMessage, iMsgLength); } catch (Exception) { m_MessageMonitor=null; } } #if !DEBUG catch (Exception) { } #endif } return bRet; }
// //Start all the necessary threads for processing all the selected gps sources private bool Start() { bool fRet=false; GPSSource gpsSource; if (m_fInitialized) { progressBarSetup.Visible=false; labelSettingup.Visible=false; m_iLocked=0; m_iPrevLocked=0; m_fCloseThreads=false; m_fVerticalExaggeration=World.Settings.VerticalExaggeration; if (checkBoxVExaggeration.Checked==true) World.Settings.VerticalExaggeration=0F; labelSettingup.Visible=true; labelSettingup.Update(); progressBarSetup.Visible=true; progressBarSetup.Update(); progressBarSetup.Maximum=m_gpsSourceList.Count+1; if (m_fPlayback==false) { for (int i=0; i<m_gpsSourceList.Count; i++) { gpsSource=(GPSSource)m_gpsSourceList[i]; gpsSource.datePosition = new DateTime(1771,6,9); if (checkBoxSetAltitud.Checked && gpsSource.bTrack) gpsSource.iStartAltitud = Convert.ToInt32(numericUpDownAltitud.Value); else gpsSource.iStartAltitud=0; if (!gpsSource.bSetup) continue; gpsSource.GpsPos.m_gpsTrack = null; if (gpsSource.bSave && (i + 1 <= progressBarSetup.Maximum)) progressBarSetup.Value=i+1; if (gpsSource.sType == "COM" && gpsSource.GpsCOM.IsOpen) gpsSource.GpsCOM.StartRx(); else if (gpsSource.sType=="POI") //Point of interest { if (m_hPOIThread==null) { m_eventPOIThreadSync = new AutoResetEvent(false); m_hPOIThread = new Thread(new ThreadStart(this.threadPOI)); m_hPOIThread.IsBackground = true; m_hPOIThread.Priority = System.Threading.ThreadPriority.Normal; m_hPOIThread.Start(); } } else { if (gpsSource.sType=="TCP") { SecurityOptions options; if (gpsSource.bSecureSocket) options = new SecurityOptions( SecureProtocol.Ssl3 | SecureProtocol.Tls1, // use SSL3 or TLS1 null, // do not use client authentication ConnectionEnd.Client, // this is the client side CredentialVerification.None, // do not check the certificate -- this should not be used in a real-life application :-) null, // not used with automatic certificate verification gpsSource.sTCPAddress, // this is the common name of the Microsoft web server SecurityFlags.Default, // use the default security flags SslAlgorithms.SECURE_CIPHERS, // only use secure ciphers null); else options = new SecurityOptions(SecureProtocol.None, null, ConnectionEnd.Client); SecureSocket socketTCP = new SecureSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp, options); IPHostEntry IPHost = Dns.GetHostEntry(gpsSource.sTCPAddress); IPEndPoint ipEndPoint = new IPEndPoint(IPHost.AddressList[0], gpsSource.iTCPPort); socketTCP.Blocking = true ; AsyncCallback callbackProc = new AsyncCallback(m_UDPTCP.TcpConnectCallback); gpsSource.tcpSockets = new TCPSockets(); gpsSource.tcpSockets.sStream = ""; gpsSource.tcpSockets.socket = socketTCP; gpsSource.tcpSockets.iDeviceIndex = i; gpsSource.tcpSockets.byTcpBuffer = new byte[1024]; gpsSource.tcpSockets.socket.BeginConnect(ipEndPoint, callbackProc, gpsSource.tcpSockets); } else if (gpsSource.sType=="UDP") { // //This thread starts the UDP lisenter gpsSource.eventThreadSync = new AutoResetEvent(false); gpsSource.fileThread = new Thread(new ThreadStart(threadUDP)); gpsSource.fileThread.IsBackground = true; gpsSource.fileThread.Priority = System.Threading.ThreadPriority.Normal; gpsSource.fileThread.Name = i.ToString(); gpsSource.fileThread.Start(); } else if (gpsSource.sType=="File") { gpsSource.eventThreadSync = new AutoResetEvent(false); gpsSource.fileThread = new Thread(new ThreadStart(m_File.threadStartFile)); gpsSource.fileThread.IsBackground = true; gpsSource.fileThread.Priority = System.Threading.ThreadPriority.Normal; gpsSource.fileThread.Name= i.ToString(); gpsSource.fileThread.Start(); } else if (gpsSource.sType=="APRS Internet") { gpsSource.eventThreadSync = new AutoResetEvent(false); gpsSource.aprsThread = new Thread(new ThreadStart(m_APRS.threadAPRSIS)); gpsSource.aprsThread.IsBackground = true; gpsSource.aprsThread.Name = i.ToString(); gpsSource.aprsThread.Start(); } else if (gpsSource.sType=="USB") { gpsSource.eventThreadSync = new AutoResetEvent(false); gpsSource.usbThread = new Thread(new ThreadStart(m_File.threadStartUSB)); gpsSource.usbThread.IsBackground = true; gpsSource.usbThread.Priority = System.Threading.ThreadPriority.Normal; gpsSource.usbThread.Name= i.ToString(); gpsSource.usbThread.Start(); } else if (gpsSource.sType=="GeoFence") { gpsSource.GeoFence.sName = gpsSource.sDescription; gpsSource.GeoFence.bShowInfo = checkBoxInformationText.Checked; m_gpsTrackerPlugin.pluginAddGeoFence(gpsSource.GeoFence); } } } } else { for (int i=0; i<m_gpsSourceList.Count; i++) { gpsSource=(GPSSource)m_gpsSourceList[i]; gpsSource.iReload=0; gpsSource.datePosition = new DateTime(1771,6,9); if (checkBoxSetAltitud.Checked && gpsSource.bTrack) gpsSource.iStartAltitud = Convert.ToInt32(numericUpDownAltitud.Value); else gpsSource.iStartAltitud=0; if (!gpsSource.bSetup) continue; gpsSource.GpsPos.m_gpsTrack = null; if ((i + 1 <= progressBarSetup.Maximum)) progressBarSetup.Value=i+1; if (gpsSource.sType=="POI") //Point of interest { if (m_hPOIThread==null) { m_eventPOIThreadSync = new AutoResetEvent(false); m_hPOIThread = new Thread(new ThreadStart(this.threadPOI)); m_hPOIThread.IsBackground = true; m_hPOIThread.Priority = System.Threading.ThreadPriority.Normal; m_hPOIThread.Start(); } } else { if (gpsSource.bTrackAtOnce!=true) { gpsSource.eventThreadSync = new AutoResetEvent(false); gpsSource.fileThread = new Thread(new ThreadStart(m_File.threadFile)); gpsSource.fileThread.IsBackground = true; gpsSource.fileThread.Priority = System.Threading.ThreadPriority.Normal; gpsSource.fileThread.Name = i.ToString(); gpsSource.sFileNameSession=m_sPlaybackFile; if (gpsSource.sType=="File") gpsSource.iFilePlaySpeed=gpsSource.iPlaySpeed; else gpsSource.iFilePlaySpeed=1; gpsSource.fileThread.Start(); } else { gpsSource.sFileName=gpsSource.sFileName.Replace("*PLUGINDIR*",GpsTrackerPlugin.m_sPluginDirectory); if (File.Exists(gpsSource.sFileName)) { //track at once m_File.PreprocessFile(i,gpsSource.sFileName,gpsSource.sFileName,true,gpsSource.bForcePreprocessing); GPSRenderInformation renderInfo = new GPSRenderInformation(); renderInfo.bPOI=false; renderInfo.iIndex=i; renderInfo.sDescription=gpsSource.sDescription; renderInfo.fFix=false; renderInfo.bShowInfo=m_bInfoText; renderInfo.bTrackLine=false; renderInfo.gpsTrack = gpsSource.GpsPos.m_gpsTrack; renderInfo.bRestartTrack=false; renderInfo.iDay = gpsSource.GpsPos.m_iDay; renderInfo.iMonth = gpsSource.GpsPos.m_iMonth; renderInfo.iYear = gpsSource.GpsPos.m_iYear; renderInfo.colorTrack=gpsSource.colorTrack; m_gpsTrackerPlugin.pluginShowOverlay(renderInfo); if (gpsSource.bTrack==true) m_gpsTrackerPlugin.pluginWorldWindowGotoLatLonHeading(gpsSource.GpsPos.m_gpsTrack.m_fLat[0], gpsSource.GpsPos.m_gpsTrack.m_fLat[0], -1F, gpsSource.iStartAltitud); if (gpsSource.iStartAltitud>0) { Thread.Sleep(3000); gpsSource.iStartAltitud=0; } } } } } } if (m_gpsSourceList.Count + 1 <= progressBarSetup.Maximum) progressBarSetup.Value=m_gpsSourceList.Count+1; if (m_timerLocked==null) m_timerLocked = new System.Threading.Timer(new TimerCallback(timerCallbackLocked),0, 500, 5000); fRet=true; } return fRet; }
public void threadStartFile() { int iIndex= Int32.Parse(Thread.CurrentThread.Name); GPSSource gpsSource = (GPSSource)m_GpsTracker.m_gpsSourceList[iIndex]; bool bShowError=true; while(m_GpsTracker.m_fCloseThreads==false) { gpsSource.GpsPos.m_gpsTrack = null; try { string sFileName=""; lock("threadStartFile") { m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo("GPSTracker: Downloading " + gpsSource.sFileName); WebClient myWebClient = new WebClient(); sFileName = GpsTrackerPlugin.m_sPluginDirectory + "\\DownloadedFile" + Convert.ToString(iIndex) + ".gpsTracker"; if (File.Exists(sFileName)) File.Delete(sFileName); string sWebReload=""; if (!File.Exists(gpsSource.sFileName)) sWebReload="?r=" + System.Guid.NewGuid().ToString(); myWebClient.DownloadFile(gpsSource.sFileName + sWebReload, sFileName); } if (File.Exists(sFileName)) { gpsSource.bBabelNMEA=false; lock("threadStartFile") { //Convert files to a known format switch (gpsSource.saGpsBabelFormat[0]) { case "nasabaloon": if (m_GpsTracker.m_NMEA.CheckConvertNasaBaloon(sFileName, gpsSource.sFileName)) sFileName=sFileName + ".NMEAText"; break; case "aprs": case "nmea": case "GpsTracker": case "Unknown": //Nothing to convert break; default: //Use GpsBabel string sBabelCommandLine; if (gpsSource.bWaypoints) sBabelCommandLine = "-w;"; else sBabelCommandLine = "-t;-r;"; sBabelCommandLine+="-i;" + gpsSource.saGpsBabelFormat[0] + ";"; sBabelCommandLine+="-f;" + sFileName + ";"; if (gpsSource.bWaypoints) { sBabelCommandLine+="-o;csv;-F;" + sFileName + ".WaypointsCSV;"; if (File.Exists(sFileName + ".WaypointsCSV")) File.Delete(sFileName + ".WaypointsCSV"); } else { sBabelCommandLine+="-o;nmea;-F;" + sFileName + ".NMEAText;"; if (File.Exists(sFileName + ".NMEAText")) File.Delete(sFileName + ".NMEAText"); } m_GpsBabel.Execute(sBabelCommandLine); if (gpsSource.bWaypoints && File.Exists(sFileName + ".WaypointsCSV")) { FileInfo fInfo = new FileInfo(sFileName + ".WaypointsCSV"); if (fInfo.Length>0) sFileName+=".WaypointsCSV"; } else if (gpsSource.bWaypoints==false && File.Exists(sFileName + ".NMEAText")) { FileInfo fInfo = new FileInfo(sFileName + ".NMEAText"); if (fInfo.Length>0) { sFileName+=".NMEAText"; gpsSource.bBabelNMEA=true; } } break; } } if (gpsSource.bTrackAtOnce!=true && !m_GpsTracker.m_File.IsTrackAtOnce(sFileName)) { if (!gpsSource.bWaypoints) { m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo(""); m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo("GPSTracker: Active"); gpsSource.sFileNameSession=sFileName; gpsSource.iFilePlaySpeed=gpsSource.iPlaySpeed; threadFile(); } else { m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo(""); m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo("GPSTracker: Active"); ArrayList listWaypoints = new ArrayList(); StreamReader sReader = null; try { sReader = File.OpenText(sFileName); string sLine; do { sLine=sReader.ReadLine(); if (sLine!=null) listWaypoints.Add(sLine); } while(sLine!=null); } catch(Exception) { } if (sReader!=null) sReader.Close(); if (listWaypoints.Count>0) { char [] cSep = { ',' }; bool bTrack = gpsSource.bTrack; for (int i=0; i<listWaypoints.Count; i++) { string sFormat = (string)listWaypoints[i]; string [] sWaypointData; sWaypointData = sFormat.Split(cSep); if (sWaypointData.Length == 3) { try { m_GpsTracker.AddPOI(sWaypointData[2], Convert.ToDouble(sWaypointData[0]), Convert.ToDouble(sWaypointData[1]), false, gpsSource); if (gpsSource.bTrack) gpsSource.bTrack=false; } catch(Exception) { Thread.Sleep(200); } } } gpsSource.bTrack = bTrack; } } } else { if (gpsSource.iReload>0 && File.Exists(sFileName + ".TrackAtOnce")) File.Delete(sFileName + ".TrackAtOnce"); lock("threadStartFile") { //track at once m_GpsTracker.m_File.PreprocessFile(iIndex,sFileName,gpsSource.sFileName,false,gpsSource.bForcePreprocessing); } GPSRenderInformation renderInfo = new GPSRenderInformation(); renderInfo.bPOI=false; renderInfo.iIndex=iIndex; renderInfo.sDescription=gpsSource.sDescription; renderInfo.fFix=false; renderInfo.bShowInfo=m_GpsTracker.m_bInfoText; renderInfo.bTrackLine=false; renderInfo.gpsTrack=gpsSource.GpsPos.m_gpsTrack; renderInfo.bRestartTrack=false; renderInfo.iDay=gpsSource.GpsPos.m_iDay; renderInfo.iMonth=gpsSource.GpsPos.m_iMonth; renderInfo.iYear=gpsSource.GpsPos.m_iYear; renderInfo.colorTrack=gpsSource.colorTrack; renderInfo.sIcon = gpsSource.sIconPath; // while (m_GpsTracker.m_fCloseThreads == false) // { m_GpsTracker.m_gpsTrackerPlugin.pluginShowOverlay(renderInfo); if (gpsSource.bTrack == true) m_GpsTracker.m_gpsTrackerPlugin.pluginWorldWindowGotoLatLonHeading(gpsSource.GpsPos.m_gpsTrack.m_fLat[0], gpsSource.GpsPos.m_gpsTrack.m_fLon[0], -1F, gpsSource.iStartAltitud); if (gpsSource.iStartAltitud > 0) gpsSource.iStartAltitud = 0; // Thread.Sleep(3000); // } } } if (gpsSource.iReload==0 || m_GpsTracker.m_fCloseThreads==true) break; else { for (int i=0; i<gpsSource.iReload && m_GpsTracker.m_fCloseThreads==false; i++) Thread.Sleep(1000); } } catch(Exception) { if (bShowError) { lock("threadStartFile") { bShowError=false; m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo("GPSTracker: Unable to Download " + gpsSource.sFileName + ". Retrying in the background."); for (int i=0; i<5 && m_GpsTracker.m_fCloseThreads==false; i++) Thread.Sleep(1000); m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo(""); m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo("GPSTracker: Active"); } for (int i=0; i<60 && m_GpsTracker.m_fCloseThreads==false; i++) Thread.Sleep(1000); } else { m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo(""); m_GpsTracker.m_gpsTrackerPlugin.pluginShowFixInfo("GPSTracker: Active"); for (int i=0; i<60 && m_GpsTracker.m_fCloseThreads==false; i++) Thread.Sleep(1000); } } } gpsSource.eventThreadSync.Set(); }