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

📄 satellitecontrol.cpp

📁 Powerful and Portable GPS application -- support Linux, Windows, Windows CE GPS navigation and Map m
💻 CPP
字号:
/* *  Roadnav *  SatelliteControl.cpp * *  Copyright (c) 2004 - 2007 Richard L. Lynch <rllynch@users.sourceforge.net> * *  This program is free software; you can redistribute it and/or *  modify it under the terms of version 2 of the GNU General Public License *  as published by the Free Software Foundation. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */ ///////////////////////////////////////////////////////////////////////////////// \file////// Contains the SatelliteControl class - a control that graphically shows the/// detected satellites./////////////////////////////////////////////////////////////////////////////////#ifdef HAVE_CONFIG_H#  include <config.h>#endif#ifdef _MSC_VER#pragma warning(disable: 4786)#endif#include <wx/wx.h>#ifdef HAVE_MATH_H#include <math.h>#endif#include "SatelliteControl.h"#include "libroadnav/Constants.h"#include "libroadnav/wxAntiAliasedDC.h"//////////////////////////////////////////////////////////////////////////////////// SatelliteControl events/////////////////////////////////////////////////////////////////////////////////BEGIN_EVENT_TABLE(SatelliteControl, wxControl)	EVT_PAINT(SatelliteControl::OnPaint)	EVT_ERASE_BACKGROUND(SatelliteControl::OnEraseBackground)	EVT_COMMAND(0, wxEVT_SAFE_REFRESH, SatelliteControl::OnSafeRefresh)END_EVENT_TABLE()IMPLEMENT_DYNAMIC_CLASS(SatelliteControl, wxControl);using namespace std;//////////////////////////////////////////////////////////////////////////////////// \brief Satellite control constructor/////////////////////////////////////////////////////////////////////////////////SatelliteControl::SatelliteControl(){	m_nSatellitesVisible = 0;}//////////////////////////////////////////////////////////////////////////////////// \brief Satellite control constructor/////////////////////////////////////////////////////////////////////////////////SatelliteControl::SatelliteControl(wxWindow* parent, wxWindowID id, wxPoint pt, wxSize sz){	m_nSatellitesVisible = 0;	Create(parent, id, pt, wxSize(200, 200), wxNO_BORDER | wxFULL_REPAINT_ON_RESIZE);	SetMinSize(wxSize(100, 100));}//////////////////////////////////////////////////////////////////////////////////// \brief Control needs to be repainted./////////////////////////////////////////////////////////////////////////////////void SatelliteControl::OnPaint(wxPaintEvent& event){	wxPaintDC realdc(this);	wxAntiAliasedDC<wxMemoryDC> dc;	int iWidth;	int iHeight;	int iRadius;	wxPoint ptCenter;	int iCircle;	int iSatellite;	wxBitmap bmpEmpty(1, 1);		GetSize(&iWidth, &iHeight);	if (iWidth > iHeight)		iRadius = iHeight / 2;	else		iRadius = iWidth / 2;	int iOuterMargin = iRadius / 10;	iRadius -= iOuterMargin;			ptCenter.x = iWidth / 2;	ptCenter.y = iHeight / 2;	wxBitmap bmpDC(iWidth, iHeight);		wxBrush brWindowBackground(GetBackgroundColour(), wxSOLID);	wxPen penForeground(GetForegroundColour());	wxPen penBackground(GetBackgroundColour());	dc.SelectObject(bmpDC);	dc.SetBackground(brWindowBackground);	// fill in background	dc.SetBrush(brWindowBackground);	dc.SetPen(penBackground);	dc.DrawRectangle(0, 0, iWidth, iHeight);	dc.SetPen(penForeground);	// circles	dc.SetBrush(*wxTRANSPARENT_BRUSH);		for (iCircle = 1; iCircle < 4; iCircle++)		dc.DrawCircle(ptCenter, iRadius * iCircle / 3);			// satellites	dc.SetFont(*wxNORMAL_FONT);	dc.SetTextForeground(GetForegroundColour());	for (iSatellite = 0; iSatellite < m_nSatellitesVisible; iSatellite++)	{		wxPoint ptSat;		wxString strText;		wxCoord iTextWidth;		wxCoord iTextHeight;		float fGreen;		float fBackground;		wxColour clrBackground;				fGreen = m_arSatellitesVisible[iSatellite].m_fSNR / 100.0;				wxASSERT(fGreen >= 0);		wxASSERT(fGreen <= 1);				if (fGreen < 0)			fGreen = 0;		if (fGreen > 1)			fGreen = 1;		fBackground = 1 - fGreen;				clrBackground.Set(							(int) (fBackground * GetBackgroundColour().Red()),							(int) (192 * fGreen + GetBackgroundColour().Green () * fBackground),							(int) (fBackground * GetBackgroundColour().Blue())						);		wxBrush brRectBackground(	clrBackground, 									wxSOLID);		int iTextMargin = 4;				ptSat = ptCenter;		ptSat.x += (int) (sin(m_arSatellitesVisible[iSatellite].m_fAzimuth * 2.0 * PI / 360.0) * (90 - m_arSatellitesVisible[iSatellite].m_fElevation) / 90.0 * iRadius);		ptSat.y += (int) (-1 * cos(m_arSatellitesVisible[iSatellite].m_fAzimuth * 2.0 * PI / 360.0) * (90 - m_arSatellitesVisible[iSatellite].m_fElevation) / 90.0 * iRadius);				strText = wxString::Format(wxT("%d"), m_arSatellitesVisible[iSatellite].m_iID);		dc.GetTextExtent(strText, &iTextWidth, &iTextHeight);				dc.SetBrush(brRectBackground);		dc.SetBackground(clrBackground);		dc.DrawRectangle(	ptSat.x - iTextMargin, 							ptSat.y - iTextMargin, 							iTextWidth + iTextMargin * 2, 							iTextHeight + iTextMargin * 2);									dc.DrawText(strText, ptSat);	}	// paint	dc.SelectObject(bmpEmpty);	realdc.DrawBitmap(bmpDC, 0, 0);}//////////////////////////////////////////////////////////////////////////////////// \brief New GPS coordinates are available - record them.////// Parent is responsible for invalidating the control./////////////////////////////////////////////////////////////////////////////////bool SatelliteControl::OnGPSUpdate(wxGPSEvent evGPS){	bool bChanged;		bChanged = false;	if (m_nSatellitesVisible == evGPS.m_nSatellitesVisible)	{		int i;				for (i = 0; i < m_nSatellitesVisible && !bChanged; i++)		{			if (m_arSatellitesVisible[i].m_iID != evGPS.m_arSatellitesVisible[i].m_iID)				bChanged = true;			if (fabs(m_arSatellitesVisible[i].m_fAzimuth - evGPS.m_arSatellitesVisible[i].m_fAzimuth) > 3)				bChanged = true;			if (fabs(m_arSatellitesVisible[i].m_fElevation - evGPS.m_arSatellitesVisible[i].m_fElevation) > 3)				bChanged = true;			if (fabs(m_arSatellitesVisible[i].m_fSNR - evGPS.m_arSatellitesVisible[i].m_fSNR) > 3)				bChanged = true;		}	}	else	{		bChanged = true;	}		if (bChanged)	{		int i;				m_nSatellitesVisible = evGPS.m_nSatellitesVisible;		for (i = 0; i < evGPS.m_nSatellitesVisible; i++)			m_arSatellitesVisible[i] = evGPS.m_arSatellitesVisible[i];		SafeRefresh();	}		return bChanged;}//////////////////////////////////////////////////////////////////////////////////// \brief Called to erase the background of the control. Our function doesn't /// do anything - OnPaint will draw everything/////////////////////////////////////////////////////////////////////////////////void SatelliteControl::OnEraseBackground(wxEraseEvent& event){	// don't do anything .. OnPaint will draw everything}//////////////////////////////////////////////////////////////////////////////////// \brief Trigger a refresh of the entire control in a thread safe manner////// (calling Refresh() in a thread other than the main thread causes the/// UI to hang under GTK)/////////////////////////////////////////////////////////////////////////////////void SatelliteControl::SafeRefresh(){	wxCommandEvent ev(wxEVT_SAFE_REFRESH, 0);	AddPendingEvent(ev);}//////////////////////////////////////////////////////////////////////////////////// \brief Triggered in the main thread by a SafeRefresh() call from any/// thread./////////////////////////////////////////////////////////////////////////////////void SatelliteControl::OnSafeRefresh(wxCommandEvent & event){#if wxCHECK_VERSION(2, 5, 0)	wxMilliSleep(1);#else	wxUsleep(1);#endif	Refresh();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -