54#include <wx/stdpaths.h>
55#include <wx/tokenzr.h>
56#include <wx/display.h>
57#include <wx/jsonreader.h>
59#include "model/ais_decoder.h"
61#include "model/ais_target_data.h"
63#include "model/comm_drv_factory.h"
65#include "model/comm_n0183_output.h"
67#include "model/comm_vars.h"
68#include "model/config_vars.h"
69#include "model/cutil.h"
70#include "model/georef.h"
72#include "model/idents.h"
75#include "model/multiplexer.h"
77#include "model/nav_object_database.h"
78#include "model/navutil_base.h"
80#include "model/own_ship.h"
83#include "model/routeman.h"
84#include "model/select.h"
86#include "model/track.h"
88#include "dialog_alert.h"
92#include "ais_info_gui.h"
93#include "AISTargetAlertDialog.h"
94#include "AISTargetListDialog.h"
95#include "AISTargetQueryDialog.h"
96#include "CanvasConfig.h"
98#include "chart_ctx_factory.h"
102#include "color_handler.h"
105#include "connections_dlg.h"
106#include "ConfigMgr.h"
111#include "glChartCanvas.h"
112#include "GoToPositionDialog.h"
114#include "iENCToolbar.h"
116#include "load_errors_dlg.h"
119#include "N2KParser.h"
123#include "OCPN_AUIManager.h"
124#include "ocpn_frame.h"
125#include "OCPNPlatform.h"
126#include "OCPN_Sound.h"
128#include "pluginmanager.h"
129#include "print_dialog.h"
130#include "printout_chart.h"
131#include "routemanagerdialog.h"
132#include "routeman_gui.h"
133#include "route_point_gui.h"
134#include "RoutePropDlgImpl.h"
137#include "S57QueryDialog.h"
138#include "SystemCmdSound.h"
142#include "TrackPropDlg.h"
143#include "waypointman_gui.h"
144#include "CanvasOptions.h"
148#include "androidUTIL.h"
154WX_DEFINE_ARRAY_PTR(
ChartCanvas *, arrayofCanvasPtr);
162extern arrayofCanvasPtr g_canvasArray;
175extern About *g_pAboutDlgLegacy;
178extern double vLat, vLon;
179extern wxString g_locale;
180extern ColorScheme global_color_scheme;
185GLenum g_texture_rectangle_format;
188#if wxUSE_XLOCALE || !wxCHECK_VERSION(3, 0, 0)
189extern wxLocale *plocale_def_lang;
196extern s52plib *ps52plib;
200extern bool g_b_legacy_input_filter_behaviour;
201extern bool g_bTrackActive;
203extern bool g_bmasterToolbarFull;
204extern int g_nAutoHideToolbar;
205extern bool g_bAutoHideToolbar;
206extern bool g_bshowToolbar;
207extern int g_maintoolbar_x;
208extern int g_maintoolbar_y;
209extern wxString g_toolbarConfig;
210extern float g_toolbar_scalefactor;
211extern float g_compass_scalefactor;
212extern bool g_bShowMenuBar;
213extern bool g_bShowCompassWin;
215extern bool g_benable_rotate;
216extern int g_GUIScaleFactor;
217extern int g_ChartScaleFactor;
218extern int g_last_ChartScaleFactor;
219extern int g_ShipScaleFactor;
220extern float g_ShipScaleFactorExp;
221extern int g_ENCTextScaleFactor;
223extern bool g_bShowTide;
224extern bool g_bShowCurrent;
225extern bool g_bUIexpert;
226extern RouteList *pRouteList;
227extern wxString g_default_wp_icon;
228extern std::vector<std::string> TideCurrentDataSet;
229extern wxString g_TCData_Dir;
231extern char nmea_tick_chars[];
232extern double AnchorPointMinDist;
233extern bool AnchorAlertOn1, AnchorAlertOn2;
234extern wxString g_AW1GUID;
235extern wxString g_AW2GUID;
236extern bool g_bCruising;
237extern double g_COGAvg;
238extern int g_COGAvgSec;
240extern std::vector<Track *> g_TrackList;
241extern double gQueryVar;
242extern int g_ChartUpdatePeriod;
243extern int g_SkewCompUpdatePeriod;
244extern bool g_bCourseUp;
245extern bool g_bLookAhead;
246extern bool g_bskew_comp;
247extern bool g_bPauseTest;
249extern bool g_bPlayShipsBells;
250extern wxDateTime g_loglast_time;
251extern int g_nAWDefault;
253extern bool g_bDeferredStartTrack;
254extern bool bDBUpdateInProgress;
258extern bool g_bDeferredInitDone;
259extern int options_lastPage;
260extern int options_subpage;
261extern bool b_reloadForPlugins;
263extern int g_NeedDBUpdate;
264extern bool g_bFullscreen;
265extern wxString gWorldMapLocation, gDefaultWorldMapLocation;
266extern ChartGroupArray *g_pGroupArray;
267extern bool g_bEnableZoomToCursor;
268extern double g_display_size_mm;
269extern std::vector<size_t> g_config_display_size_mm;
270extern wxString ChartListFileName;
271extern bool g_bFullscreenToolbar;
272extern arrayofCanvasPtr g_canvasArray;
273extern wxString g_lastAppliedTemplateGUID;
274extern wxPoint options_lastWindowPos;
275extern wxSize options_lastWindowSize;
276extern unsigned int g_canvasConfig;
277extern bool g_bFullScreenQuilt;
278extern bool g_bQuiltEnable;
279extern wxString *pInit_Chart_Dir;
280extern bool g_bShowOutlines;
281extern bool g_bTempShowMenuBar;
282extern bool g_bShowStatusBar;
283extern bool g_FlushNavobjChanges;
284extern int g_FlushNavobjChangesTimeout;
285extern bool g_bShowChartBar;
286extern double g_plus_minus_zoom_factor;
287extern int g_nframewin_x;
288extern int g_nframewin_y;
289extern int g_nframewin_posx;
290extern int g_nframewin_posy;
291extern bool g_bframemax;
292extern LayerList *pLayerList;
293extern bool g_bAutoAnchorMark;
294extern wxDateTime g_start_time;
295extern bool g_bcompression_wait;
296extern bool g_bquiting;
297extern bool b_inCloseWindow;
298extern bool b_inCompressAllCharts;
299extern long g_maintoolbar_orient;
300extern wxAuiDefaultDockArt *g_pauidockart;
301extern int g_click_stop;
302extern wxString g_CmdSoundString;
303extern std::vector<OcpnSound *> bells_sound;
304extern char bells_sound_file_name[2][12];
305extern int g_sticky_chart;
306extern int g_sticky_projection;
307extern wxArrayPtrVoid *UserColourHashTableArray;
308extern wxColorHashMap *pcurrent_user_color_hash;
311extern bool g_own_ship_sog_cog_calc;
312extern int g_own_ship_sog_cog_calc_damp_sec;
313extern bool g_bHasHwClock;
314extern bool s_bSetSystemTime;
315extern bool bVelocityValid;
316extern int gHDx_Watchdog;
319extern bool g_bUseGLL;
320extern int g_MemFootMB;
323extern int g_chart_zoom_modifier_vector;
324extern bool g_config_display_size_manual;
325extern bool g_PrintingInProgress;
326extern bool g_disable_main_toolbar;
327extern bool g_btenhertz;
328extern bool g_declutter_anchorage;
333typedef DWORD(WINAPI *SetSysColors_t)(DWORD, DWORD *, DWORD *);
334typedef DWORD(WINAPI *GetSysColor_t)(DWORD);
336SetSysColors_t pSetSysColors;
337GetSysColor_t pGetSysColor;
339void SaveSystemColors(
void);
340void RestoreSystemColors(
void);
345DWORD color_3ddkshadow;
347DWORD color_activecaption;
348DWORD color_gradientactivecaption;
349DWORD color_captiontext;
350DWORD color_windowframe;
351DWORD color_inactiveborder;
356#include <wx/msw/msvcrt.h>
360static const long long lNaN = 0xfff8000000000000;
361#define NAN (*(double *)&lNaN)
364static wxArrayPtrVoid *UserColorTableArray = 0;
367double gLat_gt, gLon_gt;
368double gLat_gt_m1, gLon_gt_m1;
370uint64_t fix_time_gt_last;
372double gSog_gt, gCog_gt, gHdt_gt;
373double gCog_gt_m1, gHdt_gt_m1;
375double cog_rate_gt, hdt_rate_gt;
378void appendOSDirSlash(wxString *pString);
380void InitializeUserColors(
void);
381void DeInitializeUserColors(
void);
382void SetSystemColors(ColorScheme cs);
384static bool LoadAllPlugIns(
bool load_enabled) {
385 AbstractPlatform::ShowBusySpinner();
386 bool b = PluginLoader::GetInstance()->
LoadAllPlugIns(load_enabled);
387 AbstractPlatform::HideBusySpinner();
391static void LaunchLocalHelp(
void) {
393 androidLaunchHelpView();
395 wxString def_lang_canonical = _T(
"en_US");
398 if (plocale_def_lang)
399 def_lang_canonical = plocale_def_lang->GetCanonicalName();
402 wxString help_locn = g_Platform->GetSharedDataDir() + _T(
"doc/help_");
404 wxString help_try = help_locn + def_lang_canonical + _T(
".html");
406 if (!::wxFileExists(help_try)) {
407 help_try = help_locn + _T(
"en_US") + _T(
".html");
409 if (!::wxFileExists(help_try)) {
410 help_try = help_locn + _T(
"web") + _T(
".html");
413 if (!::wxFileExists(help_try))
return;
416 wxLaunchDefaultBrowser(wxString(_T(
"file:///")) + help_try);
420static void DoHelpDialog(
void) {
425 g_pAboutDlg->SetFocus();
430 if (!g_pAboutDlgLegacy)
431 g_pAboutDlgLegacy =
new About(gFrame, g_Platform->GetSharedDataDir(),
432 [] { LaunchLocalHelp(); });
434 g_pAboutDlgLegacy->SetFocus();
435 g_pAboutDlgLegacy->Show();
444#if defined(__WXGTK__) || defined(__WXQT__)
445#include "bitmaps/opencpn.xpm"
460int g_iENCToolbarPosX;
461int g_iENCToolbarPosY;
463void BuildiENCToolbar(
bool bnew) {
464 if (g_bInlandEcdis) {
467 wxPoint locn = g_iENCToolbar->GetToolbarPosition();
468 wxPoint tbp_incanvas =
471 g_iENCToolbarPosY = tbp_incanvas.y;
472 g_iENCToolbarPosX = tbp_incanvas.x;
474 delete g_iENCToolbar;
479 if (!g_iENCToolbar) {
480 wxPoint posn(g_iENCToolbarPosX, g_iENCToolbarPosY);
484 if ((g_iENCToolbarPosY > g_maintoolbar_y) &&
486 g_maintoolbar_y + g_MainToolbar->GetToolSize().y))
487 g_iENCToolbarPosY = -1;
490 if ((g_iENCToolbarPosX < 0) || (g_iENCToolbarPosY < 0)) {
496 wxPoint(g_maintoolbar_x + g_MainToolbar->GetToolbarSize().x + 4,
500 double tool_scale_factor =
501 g_Platform->GetToolbarScaleFactor(g_GUIScaleFactor);
504 new iENCToolbar(gFrame, posn, wxTB_HORIZONTAL, tool_scale_factor);
505 g_iENCToolbar->SetColorScheme(global_color_scheme);
506 g_iENCToolbar->EnableSubmerge(
false);
509 delete g_iENCToolbar;
510 g_iENCToolbar = NULL;
514bool ShowNavWarning() {
517OpenCPN is distributed in the hope that it will be useful, \
518but WITHOUT ANY WARRANTY; without even the implied \
519warranty of MERCHANTABILITY or FITNESS FOR A \
520PARTICULAR PURPOSE.\n\n\
521See the GNU General Public License for more details.\n\n\
522OpenCPN must only be used in conjunction with approved \
523paper charts and traditional methods of navigation.\n\n\
524DO NOT rely upon OpenCPN for safety of life or property.\n\n\
525Please click \"Agree\" and proceed, or \"Cancel\" to quit.\n"));
527 wxString vs = wxString::Format(wxT(
" .. Version %s"), VERSION_FULL);
530 androidShowDisclaimer(_(
"OpenCPN for Android") + vs, msg);
533 msg.Replace(
"\n",
"<br>");
535 std::stringstream html;
536 html <<
"<html><body><p>";
537 html << msg.ToStdString();
538 html <<
"</p></body></html>";
540 std::string title = _(
"Welcome to OpenCPN").ToStdString();
541 std::string action = _(
"Agree").ToStdString();
543 info_dlg.SetInitialSize();
544 info_dlg.AddHtmlContent(html);
545 int agreed = info_dlg.ShowModal();
546 return agreed == wxID_OK;
551 if (chart ==
nullptr)
return false;
554 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
556 if (cc && cc->m_singleChart == chart) {
563#if defined(__WXGTK__) && defined(OCPN_HAVE_X11)
566static char *get_X11_property(Display *disp, Window win, Atom xa_prop_type,
567 const char *prop_name) {
571 unsigned long ret_nitems;
572 unsigned long ret_bytes_after;
573 unsigned char *ret_prop;
575 xa_prop_name = XInternAtom(disp, prop_name, False);
583 if (XGetWindowProperty(disp, win, xa_prop_name, 0, 1024, False, xa_prop_type,
584 &xa_ret_type, &ret_format, &ret_nitems,
585 &ret_bytes_after, &ret_prop) != Success)
588 if (xa_ret_type != xa_prop_type) {
592 return (
char *)ret_prop;
597static bool isTransparentToolbarInOpenGLOK(
void) {
604 if (!g_bdisable_opengl) {
605 Display *disp = XOpenDisplay(NULL);
607 if ((sup_window = (Window *)get_X11_property(disp, DefaultRootWindow(disp),
609 "_NET_SUPPORTING_WM_CHECK")) ||
610 (sup_window = (Window *)get_X11_property(disp, DefaultRootWindow(disp),
612 "_WIN_SUPPORTING_WM_CHECK"))) {
615 if ((wm_name = get_X11_property(disp, *sup_window,
616 XInternAtom(disp,
"UTF8_STRING", False),
618 (wm_name = get_X11_property(disp, *sup_window, XA_STRING,
621 if (strstr(wm_name,
"Xfwm4") || strstr(wm_name,
"Compiz"))
642wxDEFINE_EVENT(BELLS_PLAYED_EVTYPE, wxCommandEvent);
644BEGIN_EVENT_TABLE(
MyFrame, wxFrame)
645EVT_CLOSE(MyFrame::OnCloseWindow)
646EVT_MENU(wxID_EXIT, MyFrame::OnExit)
647EVT_SIZE(MyFrame::OnSize)
648EVT_MOVE(MyFrame::OnMove)
649EVT_ICONIZE(MyFrame::OnIconize)
650EVT_MENU(-1, MyFrame::OnToolLeftClick)
651EVT_TIMER(INIT_TIMER, MyFrame::OnInitTimer)
652EVT_TIMER(FRAME_TIMER_1, MyFrame::OnFrameTimer1)
653EVT_TIMER(FRAME_TC_TIMER, MyFrame::OnFrameTCTimer)
654EVT_TIMER(FRAME_COG_TIMER, MyFrame::OnFrameCOGTimer)
655EVT_TIMER(MEMORY_FOOTPRINT_TIMER, MyFrame::OnMemFootTimer)
656EVT_TIMER(FRANE_TENHZ_TIMER, MyFrame::OnFrameTenHzTimer)
657EVT_MAXIMIZE(MyFrame::OnMaximize)
658EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_TOOL_RCLICKED,
659 MyFrame::RequestNewToolbarArgEvent)
660EVT_ERASE_BACKGROUND(MyFrame::OnEraseBackground)
662EVT_TIMER(RECAPTURE_TIMER, MyFrame::OnRecaptureTimer)
663EVT_TIMER(TOOLBAR_ANIMATE_TIMER, MyFrame::OnToolbarAnimateTimer)
664EVT_COMMAND(wxID_ANY, BELLS_PLAYED_EVTYPE, MyFrame::OnBellsFinished)
666#ifdef wxHAS_POWER_EVENTS
667EVT_POWER_SUSPENDING(MyFrame::OnSuspending)
668EVT_POWER_SUSPENDED(MyFrame::OnSuspended)
669EVT_POWER_SUSPEND_CANCEL(MyFrame::OnSuspendCancel)
670EVT_POWER_RESUME(MyFrame::OnResume)
681static
void onBellsFinishedCB(
void *ptr) {
682 auto framePtr =
static_cast<MyFrame *
>(ptr);
684 wxCommandEvent ev(BELLS_PLAYED_EVTYPE);
685 wxPostEvent(framePtr, ev);
690 auto msg = ev.GetString().ToStdString();
691 auto ¬eman = NotificationManager::GetInstance();
692 noteman.AddNotification(NotificationSeverity::kInformational, msg, 60);
695static NmeaLog *GetDataMonitor() {
696 auto w = wxWindow::FindWindowByName(kDataMonitorWindowName);
697 return dynamic_cast<NmeaLog *
>(w);
701MyFrame::MyFrame(wxFrame *frame,
const wxString &title,
const wxPoint &pos,
702 const wxSize &size,
long style)
703 : wxFrame(frame, -1, title, pos, size, style, kTopLevelWindowName),
704 comm_overflow_dlg(this),
705 m_connections_dlg(nullptr),
707 g_current_monitor = wxDisplay::GetFromWindow(
this);
713 g_current_monitor_dip_px_ratio =
714 g_monitor_info[g_current_monitor].width_px /
715 g_monitor_info[g_current_monitor].width;
718 m_last_track_rotation_ts = 0;
719 m_ulLastNMEATicktime = 0;
720 m_data_monitor->Hide();
722 m_StatusBarFieldCount = g_Platform->GetStatusBarFieldCount();
726 m_load_errors_dlg_ctrl = std::make_unique<LoadErrorsDlgCtrl>(
this);
729 InitTimer.SetOwner(
this, INIT_TIMER);
731 m_initializing =
false;
734 FrameTimer1.SetOwner(
this, FRAME_TIMER_1);
737 FrameTCTimer.SetOwner(
this, FRAME_TC_TIMER);
740 FrameCOGTimer.SetOwner(
this, FRAME_COG_TIMER);
743 MemFootTimer.SetOwner(
this, MEMORY_FOOTPRINT_TIMER);
746 ToolbarAnimateTimer.SetOwner(
this, TOOLBAR_ANIMATE_TIMER);
748 FrameTenHzTimer.SetOwner(
this, FRANE_TENHZ_TIMER);
757 m_bTimeIsSet =
false;
760 m_bdefer_resize =
false;
763 for (
int i = 0; i < MAX_COGSOG_FILTER_SECONDS; i++) {
764 COGFilterTable[i] = NAN;
765 SOGFilterTable[i] = NAN;
767 m_last_bGPSValid =
false;
768 m_last_bVelocityValid =
false;
778 for (
int i = 0; i < MAX_COG_AVERAGE_SECONDS; i++) COGTable[i] = NAN;
783 double process_noise_std = 1.0;
784 double measurement_noise_std = 0.5;
786 m_ChartUpdatePeriod = 1;
791 log_callbacks.log_is_active = [&]() {
792 auto log = GetDataMonitor();
793 return log && log->IsVisible();
795 log_callbacks.log_message = [&](
Logline ll) {
796 NmeaLog *monitor = GetDataMonitor();
799 g_pMUX =
new Multiplexer(log_callbacks, g_b_legacy_input_filter_behaviour);
802 ais_callbacks.confirm_stop_track = []() {
803 int r = OCPNMessageBox(
805 _(
"This AIS target has Persistent tracking selected by MMSI "
807 "A Persistent track recording will therefore be restarted for this "
809 "Do you instead want to stop Persistent tracking for this target?"),
810 _(
"OpenCPN Info"), wxYES_NO | wxCENTER, 60);
811 return r == wxID_YES;
813 ais_callbacks.get_target_mmsi = []() {
814 auto alert_dlg_active =
816 assert(alert_dlg_active);
817 return alert_dlg_active->Get_Dialog_MMSI();
825 wxLogMessage(
" **** Connect stuff");
831 Connect(wxEVT_OCPN_MSG,
832 (wxObjectEventFunction)(wxEventFunction)&MyFrame::OnEvtPlugInMessage);
839 Connect(wxEVT_OCPN_BUILDSENCTHREAD,
840 (wxObjectEventFunction)(wxEventFunction)&MyFrame::OnSENCEvtThread);
848#if defined(__WXGTK__) || defined(__WXQT__)
849 wxIcon app_icon(opencpn);
857 wxDynamicLibrary dllUser32(_T(
"user32.dll"));
859 pSetSysColors = (SetSysColors_t)dllUser32.GetSymbol(wxT(
"SetSysColors"));
860 pGetSysColor = (GetSysColor_t)dllUser32.GetSymbol(wxT(
"GetSysColor"));
865 m_next_available_plugin_tool_id = ID_PLUGIN_BASE;
868 g_sticky_projection = -1;
871 m_resizeTimer.SetOwner(
this, RESIZE_TIMER);
872 m_recaptureTimer.SetOwner(
this, RECAPTURE_TIMER);
874 assert(g_pRouteMan != 0 &&
"g_pRouteMan not available");
876 [&](wxCommandEvent) { Refresh(); });
877 m_evt_drv_msg_listener.Init(CommDriverRegistry::GetInstance().evt_driver_msg,
882 EnableFullScreenView();
888 FrameTenHzTimer.Stop();
895 wxRouteListNode *node = pRouteList->GetFirst();
898 Route *pRouteDelete = node->GetData();
901 node = node->GetNext();
908 (wxObjectEventFunction)(wxEventFunction)&MyFrame::OnEvtPlugInMessage);
916 switch (event.type) {
917 case SENC_BUILD_STARTED:
920 case SENC_BUILD_DONE_NOERROR:
922 chart =
event.m_ticket->m_chart;
924 chart->PostInit(FULL_INIT, global_color_scheme);
926 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
928 if (cc) cc->ClearS52PLIBStateHash();
933 delete event.m_ticket;
935 case SENC_BUILD_DONE_ERROR:
943void MyFrame::RebuildChartDatabase() {
944 bool b_SetInitialPoint =
false;
947 ArrayOfCDI ChartDirArray;
948 pConfig->LoadChartDirArray(ChartDirArray);
950 if (ChartDirArray.GetCount()) {
953 if (g_NeedDBUpdate == 1) {
955 _(
"OpenCPN needs to update the chart database from config file "
959 wxICON_INFORMATION | wxOK);
967 _(
"Rebuilding chart database from configuration file entries..."));
971 wxString dummy1 = _(
"Elapsed time : ");
972 wxString dummy2 = _(
"Estimated time : ");
973 wxString dummy3 = _(
"Remaining time : ");
974 wxGenericProgressDialog *pprog =
new wxGenericProgressDialog(
975 _(
"OpenCPN Chart Update"), line, 100, NULL,
976 wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
977 wxPD_REMAINING_TIME);
979 ChartData->
Create(ChartDirArray, pprog);
980 ChartData->SaveBinary(ChartListFileName);
985 ChartData->ApplyGroupArray(g_pGroupArray);
990void MyFrame::OnBellsFinished(wxCommandEvent &event) {
991 int bells = wxMin(m_BellsToPlay, 2);
992 if (bells <= 0)
return;
994 wxString soundfile = _T(
"sounds");
995 appendOSDirSlash(&soundfile);
996 soundfile += wxString(bells_sound_file_name[bells - 1], wxConvUTF8);
997 soundfile.Prepend(g_Platform->GetSharedDataDir());
998 wxLogMessage(_T(
"Using bells sound file: ") + soundfile);
1000 OcpnSound *sound = bells_sound[bells - 1];
1001 sound->SetFinishedCallback(onBellsFinishedCB,
this);
1002 auto cmd_sound =
dynamic_cast<SystemCmdSound *
>(sound);
1003 if (cmd_sound) cmd_sound->SetCmd(g_CmdSoundString.mb_str(wxConvUTF8));
1004 sound->Load(soundfile);
1005 if (!sound->IsOk()) {
1006 wxLogMessage(_T(
"Failed to load bells sound file: ") + soundfile);
1010 m_BellsToPlay -= bells;
1013void MyFrame::OnEraseBackground(wxEraseEvent &event) {}
1015void MyFrame::OnMaximize(wxMaximizeEvent &event) {
1022ColorScheme GetColorScheme() {
return global_color_scheme; }
1024ColorScheme MyFrame::GetColorScheme() {
return global_color_scheme; }
1026void MyFrame::ReloadAllVP() {
1027 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1029 if (cc) cc->ReloadVP();
1033void MyFrame::SetAndApplyColorScheme(ColorScheme cs) {
1034 global_color_scheme = cs;
1036 wxString SchemeName;
1038 case GLOBAL_COLOR_SCHEME_DAY:
1039 SchemeName = _T(
"DAY");
1041 case GLOBAL_COLOR_SCHEME_DUSK:
1042 SchemeName = _T(
"DUSK");
1044 case GLOBAL_COLOR_SCHEME_NIGHT:
1045 SchemeName = _T(
"NIGHT");
1048 SchemeName = _T(
"DAY");
1052 g_pauidockart->SetMetric(wxAUI_DOCKART_GRADIENT_TYPE, wxAUI_GRADIENT_NONE);
1054 g_pauidockart->SetColour(wxAUI_DOCKART_BORDER_COLOUR, wxColour(0, 0, 0));
1055 g_pauidockart->SetMetric(wxAUI_DOCKART_PANE_BORDER_SIZE, 1);
1056 g_pauidockart->SetColour(wxAUI_DOCKART_SASH_COLOUR, wxColour(0, 0, 0));
1057 g_pauidockart->SetMetric(wxAUI_DOCKART_SASH_SIZE, 0);
1058 g_pauidockart->SetColour(wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR,
1060 g_pauidockart->SetColour(wxAUI_DOCKART_BACKGROUND_COLOUR, wxColour(0, 0, 0));
1089 g_pauidockart->SetColour(wxAUI_DOCKART_SASH_COLOUR, wxColour(0, 0, 0));
1090 g_pauidockart->SetMetric(wxAUI_DOCKART_SASH_SIZE, 6);
1092 g_pauimgr->Update();
1094 g_StyleManager->GetCurrentStyle()->SetColorScheme(cs);
1097 unsigned Usercolortable_index = 0;
1098 for (
unsigned int i = 0; i < UserColorTableArray->GetCount(); i++) {
1099 colTable *ct = (colTable *)UserColorTableArray->Item(i);
1100 if (SchemeName.IsSameAs(*ct->tableName)) {
1101 Usercolortable_index = i;
1106 if (ps52plib) ps52plib->SetPLIBColorScheme(SchemeName, ChartCtxFactory());
1109 pcurrent_user_color_hash =
1110 (wxColorHashMap *)UserColourHashTableArray->Item(Usercolortable_index);
1112 SetSystemColors(cs);
1115 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1118 cc->SetColorScheme(cs);
1119 cc->GetWorldBackgroundChart()->SetColorScheme(cs);
1120 cc->HideChartInfoWindow();
1121 cc->SetQuiltChartHiLiteIndex(-1);
1127 .SetColorScheme(cs, g_Platform->GetDisplayDPmm());
1128 if (ChartData) ChartData->ApplyColorSchemeToCachedCharts(cs);
1131 g_options->SetColorScheme(cs);
1135 console->SetColorScheme(cs);
1139 g_pRouteMan->SetColorScheme(cs, g_Platform->GetDisplayDPmm());
1142 if (g_pMarkInfoDialog) {
1143 g_pMarkInfoDialog->SetColorScheme(cs);
1146 if (pRoutePropDialog) {
1147 pRoutePropDialog->SetColorScheme(cs);
1152 if (g_pais_query_dialog_active) {
1153 bool b_isshown = g_pais_query_dialog_active->IsShown();
1154 int n_mmsi = g_pais_query_dialog_active->GetMMSI();
1155 if (b_isshown) g_pais_query_dialog_active->Show(
false);
1157 g_pais_query_dialog_active->Close();
1160 g_pais_query_dialog_active->
Create(
1161 this, -1, _(
"AIS Target Query"),
1162 wxPoint(g_ais_query_dialog_x, g_ais_query_dialog_y));
1163 g_pais_query_dialog_active->SetMMSI(n_mmsi);
1164 g_pais_query_dialog_active->UpdateText();
1165 if (b_isshown) g_pais_query_dialog_active->Show();
1168 if (pRouteManagerDialog) pRouteManagerDialog->SetColorScheme();
1170 if (g_pAISTargetList) g_pAISTargetList->SetColorScheme();
1172 if (g_pObjectQueryDialog) g_pObjectQueryDialog->SetColorScheme();
1174 ApplyGlobalColorSchemetoStatusBar();
1176 UpdateAllToolbars(cs);
1178 if (g_MainToolbar) {
1179 if (g_MainToolbar->GetColorScheme() != cs) {
1181 bool btoolbarFull = g_bmasterToolbarFull;
1183 g_MainToolbar->SetColorScheme(cs);
1187 if (!btoolbarFull) {
1189 RequestNewMasterToolbar();
1190 g_MainToolbar->SetColorScheme(cs);
1191 CollapseGlobalToolbar();
1194 RequestNewMasterToolbar();
1195 g_MainToolbar->SetColorScheme(cs);
1200 if (g_pi_manager) g_pi_manager->SetColorSchemeForAllPlugIns(cs);
1203void MyFrame::ApplyGlobalColorSchemetoStatusBar(
void) {
1204 if (m_pStatusBar != NULL) {
1205 m_pStatusBar->SetBackgroundColour(GetGlobalColor(_T(
"UIBDR")));
1206 m_pStatusBar->ClearBackground();
1211 if (g_canvasArray.GetCount() > 0)
1212 return g_canvasArray.Item(0);
1216void MyFrame::CancelAllMouseRoute() {
1218 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1220 if (cc) cc->CancelMouseRoute();
1224void MyFrame::NotifyChildrenResize() {}
1226void MyFrame::CreateCanvasLayout(
bool b_useStoredSize) {
1228 if (ChartData) ChartData->PurgeCache();
1231 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1234 g_pauimgr->DetachPane(cc);
1239 for (
unsigned int i = 1; i < g_canvasArray.GetCount(); i++) {
1248 auto &config_array = ConfigMgr::Get().GetCanvasConfigArray();
1251 for (
unsigned int i = 1; i < config_array.GetCount(); i++) {
1252 config_array.Item(i)->canvas = NULL;
1258 for (
unsigned int i = 1; i < g_canvasArray.GetCount(); i++) {
1259 g_canvasArray.RemoveAt(i);
1263 switch (g_canvasConfig) {
1266 if (!g_canvasArray.GetCount() || !config_array.Item(0)) {
1269 g_canvasArray.Add(cc);
1271 cc = g_canvasArray[0];
1277 if (!cc->GetglCanvas()) cc->SetupGlCanvas();
1278 cc->GetglCanvas()->Show();
1281 config_array.Item(0)->canvas = cc;
1285 cc->ApplyCanvasConfig(config_array.Item(0));
1289 cc->ConfigureChartBar();
1290 cc->SetColorScheme(global_color_scheme);
1291 cc->GetCompass()->SetScaleFactor(g_compass_scalefactor);
1292 cc->SetShowGPS(
true);
1294 g_pauimgr->AddPane(cc);
1295 g_pauimgr->GetPane(cc).Name(_T(
"ChartCanvas"));
1296 g_pauimgr->GetPane(cc).Fixed();
1297 g_pauimgr->GetPane(cc).CaptionVisible(
false);
1298 g_pauimgr->GetPane(cc).CenterPane();
1303 if (!g_canvasArray.GetCount() || !g_canvasArray[0]) {
1305 g_canvasArray.Add(cc);
1307 cc = g_canvasArray[0];
1313 if (!cc->GetglCanvas()) cc->SetupGlCanvas();
1316 config_array.Item(0)->canvas = cc;
1318 cc->ApplyCanvasConfig(config_array.Item(0));
1321 cc->ConfigureChartBar();
1322 cc->SetColorScheme(global_color_scheme);
1323 cc->GetCompass()->SetScaleFactor(g_compass_scalefactor);
1324 cc->SetShowGPS(
false);
1326 g_pauimgr->AddPane(cc);
1327 g_pauimgr->GetPane(cc).Name(_T(
"ChartCanvas"));
1328 g_pauimgr->GetPane(cc)
1329 .CaptionVisible(
false)
1331 .CloseButton(
false);
1333 g_pauimgr->GetPane(cc).CenterPane();
1336 g_canvasArray.Add(cc);
1340 if (config_array.GetCount() < 2) {
1342 pcc->configIndex = 1;
1346 pcc->
canvasSize = wxSize(GetClientSize().x / 2, GetClientSize().y);
1347 config_array.Add(pcc);
1350 config_array.Item(1)->canvas = cc;
1352 cc->ApplyCanvasConfig(config_array.Item(1));
1355 cc->ConfigureChartBar();
1356 cc->SetColorScheme(global_color_scheme);
1357 cc->SetShowGPS(
true);
1360 g_pauimgr->AddPane(cc);
1361 g_pauimgr->GetPane(cc).Name(_T(
"ChartCanvas2"));
1362 g_pauimgr->GetPane(cc)
1363 .CaptionVisible(
false)
1365 .CloseButton(
false);
1366 g_pauimgr->GetPane(cc).RightDockable(
true);
1367 g_pauimgr->GetPane(cc).Right();
1370 config_array.Item(1)->canvasSize =
1371 wxSize(GetClientSize().x / 2, GetClientSize().y);
1372 g_pauimgr->GetPane(cc).BestSize(GetClientSize().x / 2, GetClientSize().y);
1377 if (b_useStoredSize) {
1378 int ccw = config_array.Item(1)->canvasSize.x;
1379 int cch = config_array.Item(1)->canvasSize.y;
1382 if (ccw < GetClientSize().x / 10) {
1383 ccw = GetClientSize().x / 2;
1384 cch = GetClientSize().y;
1387 g_pauimgr->GetPane(cc).BestSize(ccw, cch);
1388 cc->SetSize(ccw, cch);
1399 g_focusCanvas = GetPrimaryCanvas();
1402void MyFrame::RequestNewToolbars(
bool bforcenew) {
1403 if (b_inCloseWindow) {
1407 BuildiENCToolbar(bforcenew);
1408 PositionIENCToolbar();
1417void MyFrame::UpdateAllToolbars(ColorScheme cs) {
1418 if (g_iENCToolbar) g_iENCToolbar->SetColorScheme(cs);
1423void MyFrame::SetAllToolbarScale() {
1424 g_toolbar_scalefactor = g_Platform->GetToolbarScaleFactor(g_GUIScaleFactor);
1427void MyFrame::SetGPSCompassScale() {
1428 g_compass_scalefactor = g_Platform->GetCompassScaleFactor(g_GUIScaleFactor);
1432 wxPoint screenPoint = ::wxGetMousePosition();
1435 switch (g_canvasConfig) {
1437 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(0);
1440 if (canvas->GetScreenRect().Contains(
1444 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(1);
1447 if (canvas->GetScreenRect().Contains(
1454 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(0);
1457 if (canvas->GetScreenRect().Contains(
1458 canvas->ScreenToClient(screenPoint)))
1466int MyFrame::GetCanvasIndexUnderMouse() {
1467 wxPoint screenPoint = ::wxGetMousePosition();
1470 switch (g_canvasConfig) {
1472 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(0);
1475 if (canvas->GetScreenRect().Contains(
1479 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(1);
1482 if (canvas->GetScreenRect().Contains(
1489 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(0);
1492 if (canvas->GetScreenRect().Contains(
1493 canvas->ScreenToClient(screenPoint)))
1501bool MyFrame::DropMarker(
bool atOwnShip) {
1508 if (!canvas)
return false;
1515 new RoutePoint(lat, lon, g_default_wp_icon, wxEmptyString, wxEmptyString);
1517 pSelect->AddSelectableRoutePoint(lat, lon, pWP);
1518 pConfig->AddNewWayPoint(pWP, -1);
1522 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
1523 pRouteManagerDialog->UpdateWptListCtrl();
1528 RefreshAllCanvas(
false);
1533void MyFrame::SwitchKBFocus(
ChartCanvas *pCanvas) {
1534 if (g_canvasConfig != 0) {
1537 int nTargetGTK = -1;
1539 wxWindow *source = FindFocus();
1545 switch (g_canvasConfig) {
1547 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(0);
1550 if (canvas && (canvas == test)) {
1555 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(1);
1558 if (canvas && (canvas == test)) {
1566 int nfinalTarget = nTarget;
1568 nfinalTarget = nTargetGTK;
1570 target = ConfigMgr::Get()
1571 .GetCanvasConfigArray()
1576 target->Refresh(
true);
1587void MyFrame::FastClose() {
1589 FrameTenHzTimer.Stop();
1591 FrameTimer1.Start(1);
1595void MyFrame::OnExit(wxCommandEvent &event) {
1599void MyFrame::OnCloseWindow(wxCloseEvent &event) {
1602 if (b_inCloseWindow) {
1612 if (!g_bDeferredInitDone)
return;
1625 if (b_inCompressAllCharts) {
1629 if (bDBUpdateInProgress)
return;
1631 b_inCloseWindow =
true;
1633 ::wxSetCursor(wxCURSOR_WAIT);
1637 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1639 if (cc && cc->IsMeasureActive()) {
1640 cc->CancelMeasureRoute();
1645 SendPreShutdownHookToPlugins();
1649 if (g_pAISTargetList) {
1650 wxAuiPaneInfo &pane = g_pauimgr->GetPane(g_pAISTargetList);
1651 g_AisTargetList_perspective = g_pauimgr->SavePaneInfo(pane);
1652 g_pauimgr->DetachPane(g_pAISTargetList);
1663 pConfig->SetPath(_T (
"/AUI" ));
1664 pConfig->Write(_T (
"AUIPerspective" ), g_pauimgr->SavePerspective());
1671 if (g_glTextureManager) {
1672 g_glTextureManager->PurgeJobList();
1674 if (g_glTextureManager->GetRunningJobCount()) g_bcompression_wait =
true;
1679 SetCursor(wxCURSOR_WAIT);
1681 RefreshAllCanvas(
true);
1687 RestoreScreenBrightness();
1696 if (g_iENCToolbar) {
1697 wxPoint locn = g_iENCToolbar->GetPosition();
1698 wxPoint tbp_incanvas = GetPrimaryCanvas()->ScreenToClient(locn);
1699 g_iENCToolbarPosY = tbp_incanvas.y;
1700 g_iENCToolbarPosX = tbp_incanvas.x;
1704 g_bframemax = IsMaximized();
1707 FrameTenHzTimer.Stop();
1709 FrameCOGTimer.Stop();
1723 if (g_bAutoAnchorMark) {
1724 bool watching_anchor =
false;
1725 if (pAnchorWatchPoint1)
1726 watching_anchor = (pAnchorWatchPoint1->GetIconName().StartsWith(
1728 if (pAnchorWatchPoint2)
1729 watching_anchor |= (pAnchorWatchPoint2->GetIconName().StartsWith(
1732 wxDateTime now = wxDateTime::Now();
1733 wxTimeSpan uptime = now.Subtract(g_start_time);
1735 if (!watching_anchor && (g_bCruising) && (gSog < 0.5) &&
1736 (uptime.IsLongerThan(wxTimeSpan(0, 30, 0, 0))))
1741 if (g_declutter_anchorage) {
1742 wxRoutePointListNode *node =
1743 pWayPointMan->GetWaypointList()->GetFirst();
1746 if (pr->GetName().StartsWith(_T(
"Anchorage"))) {
1747 double a = gLat - pr->m_lat;
1748 double b = gLon - pr->m_lon;
1749 double l = sqrt((a * a) + (b * b));
1752 if ((l * 60. * 1852.) < (.25 * 1852.)) {
1753 pConfig->DeleteWayPoint(pr);
1754 pSelect->DeleteSelectablePoint(pr, SELTYPE_ROUTEPOINT);
1760 node = node->GetNext();
1764 wxString name = now.Format();
1765 name.Prepend(_(
"Anchorage created "));
1767 new RoutePoint(gLat, gLon, _T(
"anchorage"), name, wxEmptyString);
1771 pConfig->AddNewWayPoint(pWP, -1);
1776 pConfig->UpdateSettings();
1780 wxLogMessage(
"opencpn::MyFrame exiting cleanly.");
1784 pConfig->UpdateNavObj();
1786 pConfig->m_pNavObjectChangesSet->reset();
1788 NavObj_dB::GetInstance().Close();
1792 pConfig->DeleteGroup(_T (
"/Routes" ));
1793 pConfig->DeleteGroup(_T (
"/Marks" ));
1796 if (g_pAboutDlg) g_pAboutDlg->Destroy();
1797 if (g_pAboutDlgLegacy) g_pAboutDlgLegacy->Destroy();
1802 if (g_pCM93OffsetDialog) {
1803 g_pCM93OffsetDialog->Destroy();
1804 g_pCM93OffsetDialog = NULL;
1812 if (g_iENCToolbar) {
1819 if (g_pAISTargetList) {
1820 g_pAISTargetList->Disconnect_decoder();
1821 g_pAISTargetList->Destroy();
1828 if (RouteManagerDialog::getInstanceFlag()) {
1829 if (pRouteManagerDialog) {
1830 pRouteManagerDialog->Destroy();
1831 pRouteManagerDialog = NULL;
1836 if (ChartData) ChartData->PurgeCache();
1842 g_focusCanvas = NULL;
1845 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1847 if (cc) cc->Destroy();
1850 g_canvasArray.Clear();
1852 g_pauimgr->UnInit();
1862 if (ChartData) ChartData->PurgeCachePlugins();
1867 delete g_pi_manager;
1868 g_pi_manager = NULL;
1871 MyApp &app = wxGetApp();
1872 app.m_comm_bridge.SaveConfig();
1892 auto ®istry = CommDriverRegistry::GetInstance();
1893 registry.CloseAllDrivers();
1896 for (
auto *cp : TheConnectionParams()) {
1901 LayerList::iterator it;
1902 while (pLayerList->GetCount()) {
1903 Layer *lay = pLayerList->GetFirst()->GetData();
1908 ReleaseApiListeners();
1910 g_MainToolbar = NULL;
1911 g_bTempShowMenuBar =
false;
1913#define THREAD_WAIT_SECONDS 5
1919 if (g_bopengl && g_glTextureManager &&
1920 g_glTextureManager->GetRunningJobCount()) {
1921 g_glTextureManager->ClearAllRasterTextures();
1923 wxLogMessage(_T(
"Starting compressor pool drain"));
1924 wxDateTime now = wxDateTime::Now();
1925 time_t stall = now.GetTicks();
1926 time_t end = stall + THREAD_WAIT_SECONDS;
1929 while (stall < end) {
1930 wxDateTime later = wxDateTime::Now();
1931 stall = later.GetTicks();
1934 msg.Printf(_T(
"Time: %d Job Count: %d"), n_comploop,
1935 g_glTextureManager->GetRunningJobCount());
1937 if (!g_glTextureManager->GetRunningJobCount())
break;
1943 fmsg.Printf(_T(
"Finished compressor pool drain..Time: %d Job Count: %d"),
1944 n_comploop, g_glTextureManager->GetRunningJobCount());
1947 delete g_glTextureManager;
1949 uninitIXNetSystem();
1953 wxLogMessage(_T(
"gFrame destroyed."));
1956#ifndef USE_ANDROID_GLES2
1957 qDebug() <<
"Calling OnExit()";
1961 wxTheApp->ExitMainLoop();
1964void MyFrame::OnMove(wxMoveEvent &event) {
1965 auto idx = wxDisplay::GetFromWindow(
this);
1966 if (idx != wxNOT_FOUND && g_current_monitor !=
static_cast<size_t>(idx) &&
1967 static_cast<size_t>(idx) < g_monitor_info.size()) {
1968 g_current_monitor = idx;
1974 g_current_monitor_dip_px_ratio =
1975 g_monitor_info[idx].width_px / g_monitor_info[idx].width;
1978 DEBUG_LOG <<
"Moved to " << idx
1979#if wxCHECK_VERSION(3, 1, 6)
1980 <<
" PPI: " << wxDisplay(idx).GetPPI().GetX() <<
"x"
1981 << wxDisplay(idx).GetPPI().GetY()
1982 <<
" SF wxDisplay: " << wxDisplay(idx).GetScaleFactor()
1984 <<
" Size wxDisplay: " << wxDisplay(idx).GetGeometry().GetWidth()
1985 <<
"x" << wxDisplay(idx).GetGeometry().GetHeight()
1986 <<
" MM wxDisplay: " << wxGetDisplaySizeMM().GetX() <<
"x"
1987 << wxGetDisplaySizeMM().GetY()
1988 <<
" Name wxDisplay: " << wxDisplay(idx).GetName().c_str()
1989 <<
" Real: " << g_monitor_info[idx].width_mm <<
"x"
1990 << g_monitor_info[idx].height_mm <<
"mm "
1991 << g_monitor_info[idx].width_mm <<
"x"
1992 << g_monitor_info[idx].height_mm <<
"mm "
1993 << g_monitor_info[idx].width <<
"x" << g_monitor_info[idx].height
1994 <<
"DIP " << g_monitor_info[idx].width_px <<
"x"
1995 << g_monitor_info[idx].height_px <<
"px"
1996 << g_monitor_info[idx].scale <<
"%";
1997 if (g_config_display_size_manual) {
1998 if (g_config_display_size_mm.size() >
static_cast<size_t>(idx)) {
1999 g_display_size_mm = g_config_display_size_mm[idx];
2002 g_display_size_mm = g_monitor_info[idx].width_mm;
2006 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2009 cc->SetMUIBarPosition();
2018 UpdateGPSCompassStatusBoxes();
2020 if (console && console->IsShown()) PositionConsole();
2028 PositionIENCToolbar();
2034 g_nframewin_posx = GetPosition().x;
2035 g_nframewin_posy = GetPosition().y;
2038void MyFrame::ProcessCanvasResize(
void) {
2039 UpdateGPSCompassStatusBoxes(
true);
2041 if (console && console->IsShown()) PositionConsole();
2043 PositionIENCToolbar();
2046 TriggerRecaptureTimer();
2050void MyFrame::TriggerRecaptureTimer() {
2051 m_recaptureTimer.Start(
2052 1000, wxTIMER_ONE_SHOT);
2055void MyFrame::OnRecaptureTimer(wxTimerEvent &event) { Raise(); }
2057void MyFrame::SetCanvasSizes(wxSize frameSize) {
2058 if (!g_canvasArray.GetCount())
return;
2061 int cccw = frameSize.x;
2062 int ccch = frameSize.y;
2066 switch (g_canvasConfig) {
2070 cc = g_canvasArray.Item(0);
2072 cc->GetSize( &cur_width, &cur_height );
2073 if( ( cur_width != cccw ) || ( cur_height != ccch ) ) {
2074 if( g_pauimgr->GetPane( cc ).IsOk() )
2075 g_pauimgr->GetPane( cc ).BestSize( cccw, ccch );
2077 cc->SetSize( 0, 0, cccw, ccch );
2085 cc = g_canvasArray.Item(1);
2087 int ccw = g_canvasConfigArray.Item(1)->canvasSize.x;
2088 int cch = g_canvasConfigArray.Item(1)->canvasSize.y;
2090 ccw = wxMin(ccw, cccw * 8 / 10);
2091 ccw = wxMax(ccw, cccw * 2 / 10);
2095 g_canvasConfigArray.Item(1)->canvasSize = wxSize(ccw, cch);
2102 g_pauimgr->GetPane(cc).MinSize(ccw, cch);
2103 g_pauimgr->GetPane(cc).Fixed();
2104 g_pauimgr->Update();
2107 g_pauimgr->GetPane(cc).Resizable();
2119void MyFrame::OnIconize(wxIconizeEvent &event) {
2121 if (g_MainToolbar) {
2122 g_MainToolbar->Show(!event.IsIconized());
2124 if (g_iENCToolbar) {
2125 g_iENCToolbar->Show(!event.IsIconized());
2129 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2131 if (cc && cc->GetMUIBar()) {
2132 if (cc->GetMUIBar()->GetCanvasOptions()) {
2133 if (cc->GetMUIBar()->GetCanvasOptions()->IsShown()) {
2134 cc->GetMUIBar()->PushCanvasOptions();
2143void MyFrame::OnSize(wxSizeEvent &event) { ODoSetSize(); }
2145void MyFrame::ODoSetSize(
void) {
2147 GetClientSize(&x, &y);
2150 if (m_pStatusBar != NULL) {
2151 m_StatusBarFieldCount = g_Platform->GetStatusBarFieldCount();
2152 int currentCount = m_pStatusBar->GetFieldsCount();
2153 if (currentCount != m_StatusBarFieldCount) {
2154 if ((currentCount > 0) && (currentCount < 7)) {
2157 int widths[] = {2, 2, 2, 2, 2, 2};
2158 m_pStatusBar->SetStatusWidths(currentCount, widths);
2161 m_pStatusBar->SetFieldsCount(m_StatusBarFieldCount);
2164 if (m_StatusBarFieldCount) {
2169 if (m_StatusBarFieldCount > 2) {
2170 int widths[] = {-6, -5, -5, -6, -4};
2171 m_pStatusBar->SetStatusWidths(m_StatusBarFieldCount, widths);
2172 }
else if (m_StatusBarFieldCount == 2) {
2173 int cwidth = x * 90 / 100;
2174 int widths[] = {100, 100};
2175 widths[0] = cwidth * 6.4 / 10.0;
2176 widths[1] = cwidth * 3.6 / 10.0;
2177 m_pStatusBar->SetStatusWidths(m_StatusBarFieldCount, widths);
2179 int widths[] = {100, 100};
2180 widths[0] = x * 90 / 100;
2181 m_pStatusBar->SetStatusWidths(m_StatusBarFieldCount, widths);
2184 int styles[] = {wxSB_FLAT, wxSB_FLAT, wxSB_FLAT,
2185 wxSB_FLAT, wxSB_FLAT, wxSB_FLAT};
2186 m_pStatusBar->SetStatusStyles(m_StatusBarFieldCount, styles);
2188 wxString sogcog(_T(
"SOG --- ") + getUsrSpeedUnit() + +_T(
" ") +
2189 _T(
" COG ---\u00B0"));
2190 m_pStatusBar->SetStatusText(sogcog, STAT_FIELD_SOGCOG);
2198 m_pStatusBar->GetFieldRect(0, stat_box);
2201 int max_font_size = wxMin((stat_box.width / 28), (stat_box.height));
2203 wxFont sys_font = *wxNORMAL_FONT;
2204 int try_font_size = sys_font.GetPointSize();
2207 int min_font_size = 10;
2217 wxFont *statusBarFont =
2218 FontMgr::Get().
GetFont(_(
"StatusBar"), try_font_size);
2219 int font_size = statusBarFont->GetPointSize();
2221 font_size = wxMin(font_size,
2224 wxMax(font_size, min_font_size);
2227 font_size = statusBarFont->GetPointSize();
2234 font_size, statusBarFont->GetFamily(), statusBarFont->GetStyle(),
2235 statusBarFont->GetWeight(),
false, statusBarFont->GetFaceName());
2237 int min_height = stat_box.height;
2239 m_pStatusBar->SetFont(*pstat_font);
2240 m_pStatusBar->SetForegroundColour(
2241 FontMgr::Get().GetFontColor(_(
"StatusBar")));
2243 min_height = (pstat_font->GetPointSize() * getAndroidDisplayDensity()) + 10;
2245 (min_height >> 1) * 2;
2246 m_pStatusBar->SetMinHeight(min_height);
2255 SetCanvasSizes(GetClientSize());
2257 UpdateGPSCompassStatusBoxes(
true);
2259 if (console) PositionConsole();
2262 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2264 if (cc) cc->FormatPianoKeys();
2268 if (g_MainToolbar) {
2269 wxSize szBefore = g_MainToolbar->GetToolbarSize();
2270 g_MainToolbar->SetGeometry(GetPrimaryCanvas()->GetCompass()->IsShown(),
2271 GetPrimaryCanvas()->GetCompass()->GetRect());
2272 g_MainToolbar->Realize();
2274 if (szBefore != g_MainToolbar->GetToolbarSize())
2275 g_MainToolbar->RefreshToolbar();
2284 if (g_pi_manager) g_pi_manager->SendResizeEventToAllPlugIns(x, y);
2297 options_lastWindowSize = wxSize(0, 0);
2298 options_lastWindowPos = wxPoint(0, 0);
2305 if (!b_inCloseWindow) {
2306 if (g_options) g_options->Raise();
2308 resizeAndroidPersistents();
2313 if (g_pauimgr) g_pauimgr->Update();
2316void MyFrame::PositionConsole(
void) {
2317 if (NULL == GetPrimaryCanvas())
return;
2319 int ccx, ccy, ccsx, ccsy, consx, consy;
2321 if (g_canvasConfig > 0) consoleHost = g_canvasArray[1];
2324 consoleHost->GetSize(&ccsx, &ccsy);
2325 consoleHost->GetPosition(&ccx, &ccy);
2327 GetPrimaryCanvas()->GetSize(&ccsx, &ccsy);
2328 GetPrimaryCanvas()->GetPosition(&ccx, &ccy);
2329 consoleHost = GetPrimaryCanvas();
2334 if (consoleHost->GetCompass()) {
2335 wxRect compass_rect = consoleHost->GetCompass()->
GetRect();
2337 if (compass_rect.y < 100)
2338 yOffset = compass_rect.y + compass_rect.height + 45;
2342 console->GetSize(&consx, &consy);
2344 wxPoint screen_pos =
2345 ClientToScreen(wxPoint(ccx + ccsx - consx - 2, ccy + yOffset));
2346 console->Move(screen_pos);
2349void MyFrame::UpdateAllFonts() {
2351 console->UpdateFonts();
2358 DestroyPersistentDialogs();
2360 if (pWayPointMan) pWayPointMan->ClearRoutePointFonts();
2365void MyFrame::DestroyPersistentDialogs() {
2366 if (g_pais_query_dialog_active) {
2367 g_pais_query_dialog_active->Hide();
2368 g_pais_query_dialog_active->Destroy();
2369 g_pais_query_dialog_active = NULL;
2372 if (RoutePropDlgImpl::getInstanceFlag() && pRoutePropDialog) {
2373 pRoutePropDialog->Hide();
2374 pRoutePropDialog->Destroy();
2375 pRoutePropDialog = NULL;
2378 if (TrackPropDlg::getInstanceFlag() && pTrackPropDialog) {
2379 pTrackPropDialog->Hide();
2380 pTrackPropDialog->Destroy();
2381 pTrackPropDialog = NULL;
2384 if (g_pMarkInfoDialog) {
2385 g_pMarkInfoDialog->Hide();
2386 g_pMarkInfoDialog->Destroy();
2387 g_pMarkInfoDialog = NULL;
2390 if (g_pObjectQueryDialog) {
2391 g_pObjectQueryDialog->Hide();
2392 g_pObjectQueryDialog->Destroy();
2393 g_pObjectQueryDialog = NULL;
2397void MyFrame::RefreshGroupIndices(
void) {
2399 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2401 if (cc) cc->canvasRefreshGroupIndex();
2405void MyFrame::OnToolLeftClick(wxCommandEvent &event) {
2406 if (g_MainToolbar) g_MainToolbar->HideTooltip();
2408 switch (event.GetId()) {
2409 case ID_MENU_SCALE_OUT:
2410 DoStackDelta(GetPrimaryCanvas(), 1);
2414 case ID_MENU_SCALE_IN:
2415 DoStackDelta(GetPrimaryCanvas(), -1);
2419 case ID_MENU_ZOOM_IN: {
2420 if (GetFocusCanvas()) {
2421 GetFocusCanvas()->
ZoomCanvas(g_plus_minus_zoom_factor,
false);
2426 case ID_MENU_ZOOM_OUT: {
2427 if (GetFocusCanvas()) {
2428 GetFocusCanvas()->
ZoomCanvas(1.0 / g_plus_minus_zoom_factor,
false);
2433 case ID_MENU_ROUTE_NEW: {
2434 if (GetFocusCanvas()) {
2435 if (0 == GetFocusCanvas()->m_routeState) {
2436 GetFocusCanvas()->StartRoute();
2438 GetFocusCanvas()->FinishRoute();
2444 case ID_MENU_TOOL_MEASURE: {
2445 GetPrimaryCanvas()->StartMeasureRoute();
2449 case ID_MENU_TOOL_NMEA_DBG_LOG:
2450 m_data_monitor->Show();
2451 m_data_monitor->Raise();
2454 case ID_MENU_TOOL_IO_MONITOR:
2455 m_data_monitor->Show();
2458 case ID_MENU_MARK_BOAT: {
2463 case ID_MENU_MARK_CURSOR: {
2468 case ID_MENU_NAV_FOLLOW: {
2469 if (gFrame->GetPrimaryCanvas())
2470 gFrame->GetPrimaryCanvas()->TogglebFollow();
2474 case ID_MENU_CHART_OUTLINES: {
2475 ToggleChartOutlines(GetFocusCanvas());
2479 case ID_MENU_CHART_QUILTING: {
2480 ToggleQuiltMode(GetFocusCanvas());
2484 case ID_MENU_UI_CHARTBAR: {
2485 ToggleChartBar(GetFocusCanvas());
2489 case ID_MENU_ENC_TEXT:
2491 ToggleENCText(GetFocusCanvas());
2494 case ID_MENU_ENC_LIGHTS: {
2495 ToggleLights(GetFocusCanvas());
2498 case ID_MENU_ENC_SOUNDINGS: {
2499 ToggleSoundings(GetFocusCanvas());
2502 case ID_MENU_ENC_ANCHOR: {
2503 ToggleAnchor(GetFocusCanvas());
2506 case ID_MENU_ENC_DATA_QUALITY: {
2507 ToggleDataQuality(GetFocusCanvas());
2510 case ID_MENU_SHOW_NAVOBJECTS: {
2511 ToggleNavobjects(GetFocusCanvas());
2515 case ID_MENU_AIS_TARGETS: {
2516 ToggleAISDisplay(GetFocusCanvas());
2519 case ID_MENU_AIS_MOORED_TARGETS: {
2520 g_bHideMoored = !g_bHideMoored;
2523 case ID_MENU_AIS_SCALED_TARGETS: {
2524 ToggleAISMinimizeTargets(GetFocusCanvas());
2528 case ID_MENU_AIS_TARGETLIST: {
2529 if (GetPrimaryCanvas()) GetPrimaryCanvas()->ShowAISTargetList();
2533 case ID_MENU_AIS_TRACKS: {
2534 g_bAISShowTracks = !g_bAISShowTracks;
2535 SetMenubarItemState(ID_MENU_AIS_TRACKS, g_bAISShowTracks);
2539 case ID_MENU_AIS_CPADIALOG: {
2540 g_bAIS_CPA_Alert = !g_bAIS_CPA_Alert;
2541 SetMenubarItemState(ID_MENU_AIS_CPADIALOG, g_bAIS_CPA_Alert);
2542 m_pMenuBar->Enable(ID_MENU_AIS_CPASOUND, g_bAIS_CPA_Alert);
2543 if (g_bAIS_CPA_Alert) {
2544 SetMenubarItemState(ID_MENU_AIS_CPASOUND, g_bAIS_CPA_Alert_Audio);
2549 case ID_MENU_AIS_CPASOUND: {
2550 g_bAIS_CPA_Alert_Audio = !g_bAIS_CPA_Alert_Audio;
2551 SetMenubarItemState(ID_MENU_AIS_CPASOUND, g_bAIS_CPA_Alert_Audio);
2555 case ID_MENU_AIS_CPAWARNING: {
2556 if (GetPrimaryCanvas()) GetPrimaryCanvas()->ToggleCPAWarn();
2557 SetMenubarItemState(ID_MENU_AIS_CPAWARNING, g_bCPAWarn);
2561 case wxID_PREFERENCES:
2563 g_MainToolbar->HideTooltip();
2568 case ID_SETTINGS_NEW: {
2573 case ID_SETTINGS_DELETE: {
2575 g_options =
nullptr;
2579 case ID_MENU_SETTINGS_BASIC: {
2582 androidDisableFullScreen();
2583 g_MainToolbar->HideTooltip();
2584 DoAndroidPreferences();
2591 case ID_MENU_UI_FULLSCREEN: {
2596 case ID_MENU_SHOW_CURRENTS: {
2597 GetFocusCanvas()->ShowCurrents(!GetFocusCanvas()->GetbShowCurrent());
2598 GetFocusCanvas()->ReloadVP();
2599 GetFocusCanvas()->Refresh(
false);
2603 case ID_MENU_SHOW_TIDES: {
2604 GetFocusCanvas()->ShowTides(!GetFocusCanvas()->GetbShowTide());
2605 GetFocusCanvas()->ReloadVP();
2606 GetFocusCanvas()->Refresh(
false);
2626 case ID_MENU_UI_COLSCHEME:
2627 case ID_COLSCHEME: {
2628 ToggleColorScheme();
2637 case ID_MENU_OQUIT: {
2642 case ID_MENU_ROUTE_MANAGER:
2643 case ID_ROUTEMANAGER: {
2644 pRouteManagerDialog = RouteManagerDialog::getInstance(
2647 if (pRouteManagerDialog->IsShown())
2648 pRouteManagerDialog->Hide();
2650 pRouteManagerDialog->UpdateRouteListCtrl();
2651 pRouteManagerDialog->UpdateTrkListCtrl();
2652 pRouteManagerDialog->UpdateWptListCtrl();
2653 pRouteManagerDialog->UpdateLayListCtrl();
2655 pRouteManagerDialog->Show();
2659 pRouteManagerDialog->Centre();
2660 pRouteManagerDialog->Raise();
2666 case ID_MENU_NAV_TRACK:
2668 if (!g_bTrackActive) {
2670 g_bTrackCarryOver =
true;
2673 if (pConfig && pConfig->IsChangesFileDirty()) {
2674 pConfig->UpdateNavObj(
true);
2676 g_bTrackCarryOver =
false;
2677 RefreshAllCanvas(
true);
2682 case ID_MENU_CHART_NORTHUP: {
2683 SetUpMode(GetPrimaryCanvas(), NORTH_UP_MODE);
2686 case ID_MENU_CHART_COGUP: {
2687 SetUpMode(GetPrimaryCanvas(), COURSE_UP_MODE);
2690 case ID_MENU_CHART_HEADUP: {
2691 SetUpMode(GetPrimaryCanvas(), HEAD_UP_MODE);
2695 case ID_MENU_MARK_MOB:
2701 case ID_MASTERTOGGLE: {
2702 if (g_MainToolbar) {
2703 wxString tip = _(
"Show Toolbar");
2704 if (!g_bmasterToolbarFull) tip = _(
"Hide Toolbar");
2705 if (g_MainToolbar->GetToolbar())
2706 g_MainToolbar->GetToolbar()->SetToolShortHelp(ID_MASTERTOGGLE, tip);
2708 g_bmasterToolbarFull = !g_bmasterToolbarFull;
2711 if (g_bmasterToolbarFull)
2712 m_nMasterToolCountShown =
2713 g_MainToolbar->GetToolCount() -
2716 m_nMasterToolCountShown = 2;
2718 m_nMasterToolCountShown =
2719 g_MainToolbar->GetToolShowCount();
2721 ToolbarAnimateTimer.Start(10, wxTIMER_ONE_SHOT);
2729 case ID_CMD_SELECT_CHART_TYPE: {
2730 selectChartDisplay(event.GetExtraLong(), -1);
2734 case ID_CMD_SELECT_CHART_FAMILY: {
2735 selectChartDisplay(-1, event.GetExtraLong());
2739 case ID_CMD_APPLY_SETTINGS: {
2740 applySettingsString(event.GetString());
2742 androidRestoreFullScreen();
2748 case ID_CMD_NULL_REFRESH: {
2753 case ID_CMD_SETVP: {
2754 setStringVP(event.GetString());
2758 case ID_CMD_INVALIDATE: {
2764 case ID_CMD_POST_JSON_TO_PLUGINS: {
2770 int numErrors = reader.
Parse(event.GetString(), &root);
2771 if (numErrors == 0) {
2772 if (root[_T(
"MessageID")].IsString()) {
2773 wxString MsgID = root[_T(
"MessageID")].
AsString();
2784 if (g_iENCToolbar) {
2785 g_iENCToolbar->OnToolLeftClick(event);
2795 g_MainToolbar->HideTooltip();
2797 ArrayOfPlugInToolbarTools tool_array =
2798 g_pi_manager->GetPluginToolbarToolArray();
2799 for (
unsigned int i = 0; i < tool_array.size(); i++) {
2801 if (event.GetId() == pttc->id) {
2802 if (pttc->m_pplugin)
2821 if (g_MainToolbar) g_MainToolbar->Realize();
2824bool MyFrame::SetGlobalToolbarViz(
bool viz) {
2825 bool viz_now = g_bmasterToolbarFull;
2827 g_MainToolbar->HideTooltip();
2828 wxString tip = _(
"Show Toolbar");
2830 tip = _(
"Hide Toolbar");
2831 if (g_MainToolbar->GetToolbar())
2832 g_MainToolbar->GetToolbar()->SetToolShortHelp(ID_MASTERTOGGLE, tip);
2835 bool toggle =
false;
2836 if (viz && !g_bmasterToolbarFull)
2839 else if (!viz && g_bmasterToolbarFull)
2843 g_bmasterToolbarFull = !g_bmasterToolbarFull;
2846 if (g_bmasterToolbarFull)
2847 m_nMasterToolCountShown =
2848 g_MainToolbar->GetToolCount() -
2851 m_nMasterToolCountShown = 2;
2853 m_nMasterToolCountShown =
2854 g_MainToolbar->GetToolShowCount();
2856 ToolbarAnimateTimer.Start(10, wxTIMER_ONE_SHOT);
2862void MyFrame::ScheduleDeleteSettingsDialog() {
2863 wxCommandEvent evt(wxEVT_COMMAND_MENU_SELECTED);
2864 evt.SetId(ID_SETTINGS_DELETE);
2865 GetEventHandler()->AddPendingEvent(evt);
2868void MyFrame::ScheduleSettingsDialog() {
2869 wxCommandEvent evt(wxEVT_COMMAND_MENU_SELECTED);
2870 evt.SetId(ID_SETTINGS);
2871 GetEventHandler()->AddPendingEvent(evt);
2874void MyFrame::ScheduleSettingsDialogNew() {
2875 wxCommandEvent evt(wxEVT_COMMAND_MENU_SELECTED);
2876 evt.SetId(ID_SETTINGS_NEW);
2877 GetEventHandler()->AddPendingEvent(evt);
2880void MyFrame::ScheduleReconfigAndSettingsReload(
bool reload,
bool new_dialog) {
2881 UpdateCanvasConfigDescriptors();
2883 if ((g_canvasConfig > 0) && (last_canvasConfig == 0))
2884 CreateCanvasLayout(
true);
2886 CreateCanvasLayout();
2888 g_pauimgr->Update();
2890 ConfigureStatusBar();
2891 wxSize lastOptSize = options_lastWindowSize;
2896 options_lastWindowSize = lastOptSize;
2900 ScheduleSettingsDialogNew();
2902 ScheduleSettingsDialog();
2907 if ((g_canvasConfig != 0) && g_focusCanvas)
2908 return g_focusCanvas;
2910 return GetPrimaryCanvas();
2913void MyFrame::OnToolbarAnimateTimer(wxTimerEvent &event) {
2914 if (g_bmasterToolbarFull) {
2915#ifndef OCPN_TOOLBAR_ANIMATE
2916 m_nMasterToolCountShown = (int)g_MainToolbar->GetToolCount();
2919 if (m_nMasterToolCountShown < (
int)g_MainToolbar->GetToolCount()) {
2920 m_nMasterToolCountShown++;
2921 g_MainToolbar->SetToolShowCount(m_nMasterToolCountShown);
2922 g_MainToolbar->Realize();
2923 g_MainToolbar->RefreshToolbar();
2925 ToolbarAnimateTimer.Start(20, wxTIMER_ONE_SHOT);
2927 g_MainToolbar->SetToolShowCount(m_nMasterToolCountShown);
2928 g_MainToolbar->GetToolbar()->InvalidateBitmaps();
2929 g_MainToolbar->Realize();
2930 g_MainToolbar->RefreshToolbar();
2933#ifndef OCPN_TOOLBAR_ANIMATE
2934 m_nMasterToolCountShown = 1;
2936 if (m_nMasterToolCountShown > 1) {
2937 m_nMasterToolCountShown--;
2938 g_MainToolbar->SetToolShowCount(m_nMasterToolCountShown);
2939 g_MainToolbar->Realize();
2940 g_MainToolbar->RefreshToolbar();
2941 ToolbarAnimateTimer.Start(10, wxTIMER_ONE_SHOT);
2943 g_MainToolbar->SetToolShowCount(m_nMasterToolCountShown);
2944 g_MainToolbar->GetToolbar()->InvalidateBitmaps();
2945 g_MainToolbar->Realize();
2946 g_MainToolbar->RefreshToolbar();
2951void MyFrame::InvalidateAllGL() {
2954 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2964void MyFrame::RefreshAllCanvas(
bool bErase) {
2966 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2969 cc->Refresh(bErase);
2974void MyFrame::setStringVP(wxString VPS) {
2979 wxStringTokenizer tkz(VPS, _T(
";"));
2981 wxString token = tkz.GetNextToken();
2983 token.ToDouble(&lat);
2985 token = tkz.GetNextToken();
2987 token.ToDouble(&lon);
2989 token = tkz.GetNextToken();
2991 token.ToDouble(&scale_ppm);
2993 cc->
SetViewPoint(lat, lon, scale_ppm, 0, cc->GetVPRotation());
2996void MyFrame::DoSettingsNew() {
2998 g_options =
nullptr;
3003void MyFrame::DoSettings() {
3007 ApplyGlobalSettings(
true);
3010 bool b_loadHarmonics =
false;
3011 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
3014 if (cc->GetbShowCurrent() || cc->GetbShowTide()) b_loadHarmonics =
true;
3017 if (b_loadHarmonics) LoadHarmonics();
3025 g_bShowChartBar = !g_bShowChartBar;
3027 if (g_bShowChartBar) cc->m_brepaint_piano =
true;
3032 if (g_bShowChartBar) {
3034 UpdateControlBar(cc);
3037 SetMenubarItemState(ID_MENU_UI_CHARTBAR, g_bShowChartBar);
3040void MyFrame::ToggleColorScheme() {
3041 static bool lastIsNight;
3042 ColorScheme s = GetColorScheme();
3045 if (lastIsNight && is == 3)
3048 lastIsNight =
false;
3050 if (lastIsNight) is = 2;
3051 if (is == 3) lastIsNight =
true;
3052 s = (ColorScheme)is;
3053 if (s == N_COLOR_SCHEMES) s = GLOBAL_COLOR_SCHEME_RGB;
3055 SetAndApplyColorScheme(s);
3058void MyFrame::ToggleFullScreen() {
3059 bool to = !IsFullScreen();
3064 long style = wxFULLSCREEN_NOBORDER | wxFULLSCREEN_NOCAPTION;
3066 ShowFullScreen(to, style);
3069 UpdateAllToolbars(global_color_scheme);
3071 UpdateControlBar(GetPrimaryCanvas());
3073 TriggerRecaptureTimer();
3076void MyFrame::ActivateMOB(
void) {
3078 wxDateTime mob_time = wxDateTime::Now();
3079 wxString mob_label(_(
"MAN OVERBOARD"));
3080 mob_label += _(
" on ");
3081 mob_label += ocpn::toUsrDateTimeFormat(mob_time);
3084 new RoutePoint(gLat, gLon, _T (
"mob" ), mob_label, wxEmptyString);
3085 pWP_MOB->SetShared(
true);
3087 pWP_MOB->SetWaypointArrivalRadius(
3089 pWP_MOB->SetUseSca(
false);
3090 pSelect->AddSelectableRoutePoint(gLat, gLon, pWP_MOB);
3091 pConfig->AddNewWayPoint(pWP_MOB, -1);
3093 if (bGPSValid && !std::isnan(gCog) && !std::isnan(gSog)) {
3096 ll_gc_ll(gLat, gLon, gCog, 1.0, &zlat, &zlon);
3099 new RoutePoint(zlat, zlon, g_default_wp_icon,
3100 wxString(_(
"1.0 NM along COG")), wxEmptyString);
3101 pSelect->AddSelectableRoutePoint(zlat, zlon, pWP_src);
3104 pRouteList->Append(temp_route);
3106 temp_route->AddPoint(pWP_src);
3107 temp_route->AddPoint(pWP_MOB);
3109 pSelect->AddSelectableRouteSegment(gLat, gLon, zlat, zlon, pWP_src, pWP_MOB,
3119 temp_route->SetRouteArrivalRadius(-1.0);
3121 if (g_pRouteMan->GetpActiveRoute()) g_pRouteMan->DeactivateRoute();
3125 v[_T(
"GUID")] = temp_route->
m_GUID;
3126 wxString msg_id(_T(
"OCPN_MAN_OVERBOARD"));
3127 SendJSONMessageToAllPlugins(msg_id, v);
3130 if (RouteManagerDialog::getInstanceFlag()) {
3131 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
3132 pRouteManagerDialog->UpdateRouteListCtrl();
3133 pRouteManagerDialog->UpdateWptListCtrl();
3138 RefreshAllCanvas(
false);
3140 wxString mob_message(_(
"MAN OVERBOARD"));
3141 mob_message += _(
" Time: ");
3142 mob_message += ocpn::toUsrDateTimeFormat(mob_time);
3143 mob_message += _(
" Position: ");
3144 mob_message += toSDMM(1, gLat);
3145 mob_message += _T(
" ");
3146 mob_message += toSDMM(2, gLon);
3147 wxLogMessage(mob_message);
3149void MyFrame::TrackOn(
void) {
3150 g_bTrackActive =
true;
3153 g_TrackList.push_back(g_pActiveTrack);
3154 if (pConfig) pConfig->AddNewTrack(g_pActiveTrack);
3155 NavObj_dB::GetInstance().AddNewTrack(g_pActiveTrack);
3156 g_pActiveTrack->Start();
3159 SetMasterToolbarItemState(ID_TRACK, g_bTrackActive);
3161 g_MainToolbar->SetToolShortHelp(ID_TRACK, _(
"Disable Tracking"));
3163 SetMenubarItemState(ID_MENU_NAV_TRACK, g_bTrackActive);
3166 androidSetTrackTool(
true);
3169 if (RouteManagerDialog::getInstanceFlag()) {
3170 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
3171 pRouteManagerDialog->UpdateTrkListCtrl();
3172 pRouteManagerDialog->UpdateRouteListCtrl();
3177 wxString name = g_pActiveTrack->GetName();
3178 if (name.IsEmpty()) {
3179 TrackPoint *tp = g_pActiveTrack->GetPoint(0);
3184 name = _(
"(Unnamed Track)");
3186 v[_T(
"Name")] = name;
3187 v[_T(
"GUID")] = g_pActiveTrack->m_GUID;
3188 wxString msg_id(_T(
"OCPN_TRK_ACTIVATED"));
3189 SendJSONMessageToAllPlugins(msg_id, v);
3190 g_FlushNavobjChangesTimeout =
3194Track *MyFrame::TrackOff(
bool do_add_point) {
3195 Track *return_val = g_pActiveTrack;
3197 if (g_pActiveTrack) {
3199 wxString msg_id(_T(
"OCPN_TRK_DEACTIVATED"));
3200 v[_T(
"GUID")] = g_pActiveTrack->m_GUID;
3201 SendJSONMessageToAllPlugins(msg_id, v);
3203 g_pActiveTrack->Stop(do_add_point);
3205 if (g_pActiveTrack->GetnPoints() < 2) {
3206 NavObj_dB::GetInstance().DeleteTrack(g_pActiveTrack);
3207 RoutemanGui(*g_pRouteMan).DeleteTrack(g_pActiveTrack);
3210 if (g_bTrackDaily) {
3211 Track *pExtendTrack = g_pActiveTrack->DoExtendDaily();
3213 NavObj_dB::GetInstance().DeleteTrack(g_pActiveTrack);
3214 RoutemanGui(*g_pRouteMan).DeleteTrack(g_pActiveTrack);
3215 return_val = pExtendTrack;
3219 g_pActiveTrack = NULL;
3222 g_bTrackActive =
false;
3224 if (RouteManagerDialog::getInstanceFlag()) {
3225 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
3226 pRouteManagerDialog->UpdateTrkListCtrl();
3227 pRouteManagerDialog->UpdateRouteListCtrl();
3231 SetMasterToolbarItemState(ID_TRACK, g_bTrackActive);
3233 g_MainToolbar->SetToolShortHelp(ID_TRACK, _(
"Enable Tracking"));
3234 SetMenubarItemState(ID_MENU_NAV_TRACK, g_bTrackActive);
3237 androidSetTrackTool(
false);
3240 g_FlushNavobjChangesTimeout =
3246bool MyFrame::ShouldRestartTrack(
void) {
3247 if (!g_pActiveTrack || !g_bTrackDaily)
return false;
3248 time_t now = wxDateTime::Now().GetTicks();
3249 time_t today = wxDateTime::Today().GetTicks();
3251 switch (g_track_rotate_time_type) {
3253 rotate_at = g_track_rotate_time + wxRound(gLon * 3600. / 15.);
3255 case TIME_TYPE_COMPUTER:
3256 rotate_at = g_track_rotate_time;
3260 wxDateTime::Now().GetTicks() - wxDateTime::Now().ToUTC().GetTicks();
3261 rotate_at = g_track_rotate_time + utc_offset;
3264 if (rotate_at > 86400)
3266 else if (rotate_at < 0)
3268 if (now >= m_last_track_rotation_ts + 86400 - 3600 &&
3269 now - today >= rotate_at) {
3270 if (m_last_track_rotation_ts == 0) {
3271 if (now - today > rotate_at)
3272 m_last_track_rotation_ts = today + rotate_at;
3274 m_last_track_rotation_ts = today + rotate_at - 86400;
3277 m_last_track_rotation_ts = now;
3283void MyFrame::TrackDailyRestart(
void) {
3284 if (!g_pActiveTrack)
return;
3286 Track *pPreviousTrack = TrackOff(
true);
3287 if (pConfig && pConfig->IsChangesFileDirty()) {
3288 pConfig->UpdateNavObj(
true);
3297 if (pPreviousTrack) {
3298 TrackPoint *pMidnightPoint = pPreviousTrack->GetLastPoint();
3299 g_pActiveTrack->AdjustCurrentTrackPoint(pMidnightPoint);
3302 if (RouteManagerDialog::getInstanceFlag()) {
3303 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
3304 pRouteManagerDialog->UpdateTrkListCtrl();
3305 pRouteManagerDialog->UpdateRouteListCtrl();
3310void MyFrame::SetUpMode(
ChartCanvas *cc,
int mode) {
3312 cc->SetUpMode(mode);
3314 SetMenubarItemState(ID_MENU_CHART_COGUP, mode == COURSE_UP_MODE);
3315 SetMenubarItemState(ID_MENU_CHART_NORTHUP, mode == NORTH_UP_MODE);
3316 SetMenubarItemState(ID_MENU_CHART_HEADUP, mode == HEAD_UP_MODE);
3319 m_pMenuBar->SetLabel(ID_MENU_CHART_NORTHUP, _(
"North Up Mode"));
3324 cc->SetShowENCText(!cc->GetShowENCText());
3326 SetMenubarItemState(ID_MENU_ENC_TEXT, cc->GetShowENCText());
3334void MyFrame::SetENCDisplayCategory(
ChartCanvas *cc,
enum _DisCat nset) {
3337 cc->SetENCDisplayCategory(nset);
3339 UpdateGlobalMenuItems();
3350 cc->SetShowENCDepth(!cc->GetShowENCDepth());
3352 SetMenubarItemState(ID_MENU_ENC_SOUNDINGS, cc->GetShowENCDepth());
3361 cc->SetShowENCLights(!cc->GetShowENCLights());
3363 SetMenubarItemState(ID_MENU_ENC_LIGHTS, cc->GetShowENCLights());
3365 if (g_pi_manager) g_pi_manager->SendS52ConfigToAllPlugIns(
true);
3373void MyFrame::ToggleRocks(
void )
3379 for(
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount(); iPtr++ ) {
3380 OBJLElement *pOLE = (OBJLElement *) ( ps52plib->pOBJLArray->Item( iPtr ) );
3381 if( !strncmp( pOLE->OBJLName,
"UWTROC", 6 ) ) {
3382 pOLE->nViz = !pOLE->nViz;
3386 for(
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount(); iPtr++ ) {
3387 OBJLElement *pOLE = (OBJLElement *) ( ps52plib->pOBJLArray->Item( iPtr ) );
3388 if( !strncmp( pOLE->OBJLName,
"OBSTRN", 6 ) ) {
3391 if( !strncmp( pOLE->OBJLName,
"WRECKS", 6 ) ) {
3395 ps52plib->GenerateStateHash();
3402 cc->SetShowENCAnchor(!cc->GetShowENCAnchor());
3404 SetMenubarItemState(ID_MENU_ENC_ANCHOR, cc->GetShowENCAnchor());
3406 if (g_pi_manager) g_pi_manager->SendS52ConfigToAllPlugIns();
3412 cc->SetShowENCDataQual(!cc->GetShowENCDataQual());
3414 SetMenubarItemState(ID_MENU_ENC_DATA_QUALITY, cc->GetShowENCDataQual());
3416 if (g_pi_manager) g_pi_manager->SendS52ConfigToAllPlugIns();
3429 cc->m_bShowNavobjects = !cc->m_bShowNavobjects;
3430 SetMenubarItemState(ID_MENU_SHOW_NAVOBJECTS, cc->m_bShowNavobjects);
3435 cc->SetShowAIS(!cc->GetShowAIS());
3436 SetMenubarItemState(ID_MENU_AIS_TARGETS, cc->GetShowAIS());
3440void MyFrame::ToggleAISMinimizeTargets(
ChartCanvas *cc) {
3441 cc->SetAttenAIS(!cc->GetAttenAIS());
3442 SetMenubarItemState(ID_MENU_AIS_SCALED_TARGETS, cc->GetAttenAIS());
3448 cc->m_bFollow =
true;
3451 SetMenubarItemState(ID_MENU_NAV_FOLLOW,
true);
3455 SetChartUpdatePeriod();
3463 cc->m_bFollow =
false;
3465 SetMenubarItemState(ID_MENU_NAV_FOLLOW,
false);
3469 SetChartUpdatePeriod();
3472void MyFrame::ToggleChartOutlines(
ChartCanvas *cc) {
3473 cc->SetShowOutlines(!cc->GetShowOutlines());
3475 RefreshAllCanvas(
false);
3479 if (g_bopengl) InvalidateAllGL();
3482 SetMenubarItemState(ID_MENU_CHART_OUTLINES, cc->GetShowOutlines());
3485void MyFrame::ToggleTestPause(
void) { g_bPauseTest = !g_bPauseTest; }
3487void MyFrame::SetMenubarItemState(
int item_id,
bool state) {
3489 bool enabled = m_pMenuBar->IsEnabled(item_id);
3490 m_pMenuBar->Enable(item_id,
false);
3491 m_pMenuBar->Check(item_id, state);
3492 m_pMenuBar->Enable(item_id, enabled);
3496void MyFrame::SetMasterToolbarItemState(
int tool_id,
bool state) {
3497 if (g_MainToolbar && g_MainToolbar->GetToolbar()) {
3498 g_MainToolbar->GetToolbar()->ToggleTool(tool_id, state);
3499 g_MainToolbar->Realize();
3503void MyFrame::SetToolbarItemBitmaps(
int tool_id, wxBitmap *bmp,
3504 wxBitmap *bmpRollover) {
3505 if (g_MainToolbar && g_MainToolbar->GetToolbar()) {
3506 g_MainToolbar->GetToolbar()->SetToolBitmaps(tool_id, bmp, bmpRollover);
3507 g_MainToolbar->Realize();
3511void MyFrame::SetToolbarItemSVG(
int tool_id, wxString normalSVGfile,
3512 wxString rolloverSVGfile,
3513 wxString toggledSVGfile) {
3514 if (g_MainToolbar && g_MainToolbar->GetToolbar()) {
3515 g_MainToolbar->GetToolbar()->SetToolBitmapsSVG(
3516 tool_id, normalSVGfile, rolloverSVGfile, toggledSVGfile);
3520void MyFrame::ConfigureStatusBar() {
3522 m_StatusBarFieldCount = g_Platform->GetStatusBarFieldCount();
3525 UseNativeStatusBar(
false);
3528 if (g_bShowStatusBar) {
3529 if (!m_pStatusBar) {
3531 CreateStatusBar(m_StatusBarFieldCount, 0);
3532 ApplyGlobalColorSchemetoStatusBar();
3537 m_pStatusBar->Destroy();
3538 m_pStatusBar = NULL;
3544void MyFrame::ApplyGlobalSettings(
bool bnewtoolbar) {
3545 ConfigureStatusBar();
3547 wxSize lastOptSize = options_lastWindowSize;
3553 options_lastWindowSize = lastOptSize;
3555 if (bnewtoolbar) UpdateAllToolbars(global_color_scheme);
3558wxString _menuText(wxString name, wxString shortcut) {
3562 menutext << _T(
"\t") << shortcut;
3567void MyFrame::BuildMenuBar(
void) {
3573 bool showMenuBar =
true;
3575 bool showMenuBar = g_bShowMenuBar;
3587 m_pMenuBar =
new wxMenuBar();
3588 RegisterGlobalMenuItems();
3589 SetMenuBar(m_pMenuBar);
3593 UpdateGlobalMenuItems();
3598 m_pMenuBar->Destroy();
3604void MyFrame::RegisterGlobalMenuItems() {
3605 if (!m_pMenuBar)
return;
3607 wxMenu *nav_menu =
new wxMenu();
3608 nav_menu->AppendCheckItem(ID_MENU_NAV_FOLLOW,
3609 _menuText(_(
"Auto Follow"), _T(
"Ctrl-A")));
3610 nav_menu->AppendCheckItem(ID_MENU_NAV_TRACK, _(
"Enable Tracking"));
3611 nav_menu->AppendSeparator();
3612 nav_menu->AppendRadioItem(ID_MENU_CHART_NORTHUP, _(
"North Up Mode"));
3613 nav_menu->AppendRadioItem(ID_MENU_CHART_COGUP, _(
"Course Up Mode"));
3614 nav_menu->AppendRadioItem(ID_MENU_CHART_HEADUP, _(
"Head Up Mode"));
3615 nav_menu->AppendSeparator();
3617 nav_menu->Append(ID_MENU_ZOOM_IN, _menuText(_(
"Zoom In"), _T(
"+")));
3618 nav_menu->Append(ID_MENU_ZOOM_OUT, _menuText(_(
"Zoom Out"), _T(
"-")));
3620 nav_menu->Append(ID_MENU_ZOOM_IN, _menuText(_(
"Zoom In"), _T(
"Alt-+")));
3621 nav_menu->Append(ID_MENU_ZOOM_OUT, _menuText(_(
"Zoom Out"), _T(
"Alt--")));
3623 nav_menu->AppendSeparator();
3624 nav_menu->Append(ID_MENU_SCALE_IN,
3625 _menuText(_(
"Larger Scale Chart"), _T(
"Ctrl-Left")));
3626 nav_menu->Append(ID_MENU_SCALE_OUT,
3627 _menuText(_(
"Smaller Scale Chart"), _T(
"Ctrl-Right")));
3629 nav_menu->AppendSeparator();
3630 nav_menu->Append(ID_MENU_OQUIT, _menuText(_(
"Exit OpenCPN"), _T(
"Ctrl-Q")));
3632 m_pMenuBar->Append(nav_menu, _(
"&Navigate"));
3634 wxMenu *view_menu =
new wxMenu();
3636 view_menu->AppendCheckItem(ID_MENU_CHART_QUILTING,
3637 _menuText(_(
"Enable Chart Quilting"), _T(
"Q")));
3638 view_menu->AppendCheckItem(ID_MENU_CHART_OUTLINES,
3639 _menuText(_(
"Show Chart Outlines"), _T(
"O")));
3641 view_menu->AppendCheckItem(
3642 ID_MENU_CHART_QUILTING,
3643 _menuText(_(
"Enable Chart Quilting"), _T(
"Alt-Q")));
3644 view_menu->AppendCheckItem(ID_MENU_CHART_OUTLINES,
3645 _menuText(_(
"Show Chart Outlines"), _T(
"Alt-O")));
3647 view_menu->AppendCheckItem(ID_MENU_UI_CHARTBAR,
3648 _menuText(_(
"Show Chart Bar"), _T(
"Ctrl-B")));
3650 view_menu->AppendSeparator();
3652 view_menu->AppendCheckItem(ID_MENU_ENC_TEXT,
3653 _menuText(_(
"Show ENC text"), _T(
"T")));
3654 view_menu->AppendCheckItem(ID_MENU_ENC_LIGHTS,
3655 _menuText(_(
"Show ENC Lights"), _T(
"L")));
3656 view_menu->AppendCheckItem(ID_MENU_ENC_SOUNDINGS,
3657 _menuText(_(
"Show ENC Soundings"), _T(
"S")));
3658 view_menu->AppendCheckItem(ID_MENU_ENC_ANCHOR,
3659 _menuText(_(
"Show ENC Anchoring Info"), _T(
"A")));
3660 view_menu->AppendCheckItem(ID_MENU_ENC_DATA_QUALITY,
3661 _menuText(_(
"Show ENC Data Quality"), _T(
"U")));
3662 view_menu->AppendCheckItem(ID_MENU_SHOW_NAVOBJECTS,
3663 _menuText(_(
"Show Navobjects"), _T(
"V")));
3665 view_menu->AppendCheckItem(ID_MENU_ENC_TEXT,
3666 _menuText(_(
"Show ENC text"), _T(
"Alt-T")));
3667 view_menu->AppendCheckItem(ID_MENU_ENC_LIGHTS,
3668 _menuText(_(
"Show ENC Lights"), _T(
"Alt-L")));
3669 view_menu->AppendCheckItem(ID_MENU_ENC_SOUNDINGS,
3670 _menuText(_(
"Show ENC Soundings"), _T(
"Alt-S")));
3671 view_menu->AppendCheckItem(
3672 ID_MENU_ENC_ANCHOR, _menuText(_(
"Show ENC Anchoring Info"), _T(
"Alt-A")));
3673 view_menu->AppendCheckItem(
3674 ID_MENU_ENC_DATA_QUALITY,
3675 _menuText(_(
"Show ENC Data Quality"), _T(
"Alt-U")));
3676 view_menu->AppendCheckItem(ID_MENU_SHOW_NAVOBJECTS,
3677 _menuText(_(
"Show Navobjects"), _T(
"Alt-V")));
3679 view_menu->AppendSeparator();
3680 view_menu->AppendCheckItem(ID_MENU_SHOW_TIDES, _(
"Show Tides"));
3681 view_menu->AppendCheckItem(ID_MENU_SHOW_CURRENTS, _(
"Show Currents"));
3682 view_menu->AppendSeparator();
3684 view_menu->Append(ID_MENU_UI_COLSCHEME,
3685 _menuText(_(
"Change Color Scheme"), _T(
"C")));
3687 view_menu->Append(ID_MENU_UI_COLSCHEME,
3688 _menuText(_(
"Change Color Scheme"), _T(
"Alt-C")));
3691 view_menu->AppendSeparator();
3693 view_menu->Append(ID_MENU_UI_FULLSCREEN,
3694 _menuText(_(
"Toggle Full Screen"), _T(
"F11")));
3696 m_pMenuBar->Append(view_menu, _(
"&View"));
3698 wxMenu *ais_menu =
new wxMenu();
3699 ais_menu->AppendCheckItem(ID_MENU_AIS_TARGETS, _(
"Show AIS Targets"));
3700 ais_menu->AppendCheckItem(ID_MENU_AIS_SCALED_TARGETS,
3701 _(
"Attenuate less critical AIS targets"));
3702 ais_menu->AppendSeparator();
3703 ais_menu->AppendCheckItem(ID_MENU_AIS_MOORED_TARGETS,
3704 _(
"Hide Moored AIS Targets"));
3705 ais_menu->AppendCheckItem(ID_MENU_AIS_TRACKS, _(
"Show AIS Target Tracks"));
3706 ais_menu->AppendCheckItem(ID_MENU_AIS_CPADIALOG, _(
"Show CPA Alert Dialogs"));
3707 ais_menu->AppendCheckItem(ID_MENU_AIS_CPASOUND, _(
"Sound CPA Alarms"));
3710 ais_menu->AppendCheckItem(ID_MENU_AIS_CPAWARNING,
3711 _menuText(_(
"Show CPA Warnings"), _T(
"W")));
3713 ais_menu->AppendCheckItem(ID_MENU_AIS_CPAWARNING,
3714 _menuText(_(
"Show CPA Warnings"), _T(
"Alt-W")));
3717 ais_menu->AppendSeparator();
3718 ais_menu->Append(ID_MENU_AIS_TARGETLIST, _(
"AIS target list") + _T(
"..."));
3719 m_pMenuBar->Append(ais_menu, _(
"&AIS"));
3721 wxMenu *tools_menu =
new wxMenu();
3722 tools_menu->Append(ID_MENU_TOOL_NMEA_DBG_LOG,
3723 _menuText(_(
"Data Monitor"),
"Alt-C"));
3725 tools_menu->Append(ID_MENU_TOOL_MEASURE,
3726 _menuText(_(
"Measure Distance"), _T(
"M")));
3728 tools_menu->Append(ID_MENU_TOOL_MEASURE,
3729 _menuText(_(
"Measure Distance"), _T(
"Alt-M")));
3732 tools_menu->AppendSeparator();
3733 tools_menu->Append(ID_MENU_ROUTE_MANAGER, _(
"Route && Mark Manager..."));
3734 tools_menu->Append(ID_MENU_ROUTE_NEW,
3735 _menuText(_(
"Create Route"), _T(
"Ctrl-R")));
3736 tools_menu->AppendSeparator();
3737 tools_menu->Append(ID_MENU_MARK_BOAT,
3738 _menuText(_(
"Drop Mark at Boat"), _T(
"Ctrl-O")));
3739 tools_menu->Append(ID_MENU_MARK_CURSOR,
3740 _menuText(_(
"Drop Mark at Cursor"), _T(
"Ctrl-M")));
3741 tools_menu->AppendSeparator();
3746 _(
"Drop MOB Marker"),
3747 _T(
"RawCtrl-Space")));
3748 tools_menu->AppendSeparator();
3749 tools_menu->Append(wxID_PREFERENCES,
3750 _menuText(_(
"Preferences") + _T(
"..."), _T(
"Ctrl-,")));
3752 tools_menu->Append(ID_MENU_MARK_MOB,
3753 _menuText(_(
"Drop MOB Marker"), _T(
"Ctrl-Space")));
3754 tools_menu->AppendSeparator();
3755 tools_menu->Append(wxID_PREFERENCES,
3756 _menuText(_(
"Options") + _T(
"..."), _T(
"Ctrl-,")));
3758 m_pMenuBar->Append(tools_menu, _(
"&Tools"));
3761 wxMenu *window_menu =
new wxMenu();
3762 m_pMenuBar->Append(window_menu, _(
"&Window"));
3765 wxMenu *help_menu =
new wxMenu();
3766 help_menu->Append(wxID_ABOUT, _(
"About OpenCPN"));
3767 help_menu->Append(wxID_HELP, _(
"OpenCPN Help"));
3768 m_pMenuBar->Append(help_menu, _(
"&Help"));
3771 UpdateGlobalMenuItems();
3774void MyFrame::UpdateGlobalMenuItems() {
3775 if (!m_pMenuBar)
return;
3777 m_pMenuBar->FindItem(ID_MENU_NAV_FOLLOW)
3778 ->Check(GetPrimaryCanvas()->m_bFollow);
3779 m_pMenuBar->FindItem(ID_MENU_CHART_NORTHUP)
3780 ->Check(GetPrimaryCanvas()->GetUpMode() == NORTH_UP_MODE);
3781 m_pMenuBar->FindItem(ID_MENU_CHART_COGUP)
3782 ->Check(GetPrimaryCanvas()->GetUpMode() == COURSE_UP_MODE);
3783 m_pMenuBar->FindItem(ID_MENU_CHART_HEADUP)
3784 ->Check(GetPrimaryCanvas()->GetUpMode() == HEAD_UP_MODE);
3785 m_pMenuBar->FindItem(ID_MENU_NAV_TRACK)->Check(g_bTrackActive);
3786 m_pMenuBar->FindItem(ID_MENU_CHART_OUTLINES)->Check(g_bShowOutlines);
3787 m_pMenuBar->FindItem(ID_MENU_CHART_QUILTING)->Check(g_bQuiltEnable);
3788 m_pMenuBar->FindItem(ID_MENU_UI_CHARTBAR)->Check(g_bShowChartBar);
3789 m_pMenuBar->FindItem(ID_MENU_AIS_TARGETS)->Check(g_bShowAIS);
3790 m_pMenuBar->FindItem(ID_MENU_AIS_MOORED_TARGETS)->Check(g_bHideMoored);
3791 m_pMenuBar->FindItem(ID_MENU_AIS_SCALED_TARGETS)->Check(g_bShowScaled);
3792 m_pMenuBar->FindItem(ID_MENU_AIS_SCALED_TARGETS)->Enable(g_bAllowShowScaled);
3793 m_pMenuBar->FindItem(ID_MENU_AIS_TRACKS)->Check(g_bAISShowTracks);
3794 m_pMenuBar->FindItem(ID_MENU_AIS_CPADIALOG)->Check(g_bAIS_CPA_Alert);
3795 if (g_bAIS_CPA_Alert) {
3796 m_pMenuBar->FindItem(ID_MENU_AIS_CPASOUND)->Check(g_bAIS_CPA_Alert_Audio);
3797 m_pMenuBar->Enable(ID_MENU_AIS_CPASOUND,
true);
3799 m_pMenuBar->FindItem(ID_MENU_AIS_CPASOUND)->Check(
false);
3800 m_pMenuBar->Enable(ID_MENU_AIS_CPASOUND,
false);
3803 m_pMenuBar->FindItem(ID_MENU_AIS_CPAWARNING)->Check(g_bCPAWarn);
3804 m_pMenuBar->FindItem(ID_MENU_SHOW_NAVOBJECTS)
3805 ->Check(GetPrimaryCanvas()->m_bShowNavobjects);
3808 m_pMenuBar->FindItem(ID_MENU_ENC_TEXT)->Check(ps52plib->GetShowS57Text());
3809 m_pMenuBar->FindItem(ID_MENU_ENC_SOUNDINGS)
3810 ->Check(ps52plib->GetShowSoundings());
3812 bool light_state =
false;
3814 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
3816 OBJLElement *pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
3817 if (!strncmp(pOLE->OBJLName,
"LIGHTS", 6)) {
3818 light_state = (pOLE->nViz == 1);
3823 m_pMenuBar->FindItem(ID_MENU_ENC_LIGHTS)
3824 ->Check((!ps52plib->IsObjNoshow(
"LIGHTS")) && light_state);
3828 DisCat nset = ps52plib->GetDisplayCategory();
3829 if ((nset == MARINERS_STANDARD) || (nset == OTHER)) {
3830 m_pMenuBar->FindItem(ID_MENU_ENC_ANCHOR)
3831 ->Check(!ps52plib->IsObjNoshow(
"SBDARE"));
3832 m_pMenuBar->Enable(ID_MENU_ENC_ANCHOR,
true);
3833 m_pMenuBar->FindItem(ID_MENU_ENC_DATA_QUALITY)
3834 ->Check(!ps52plib->IsObjNoshow(
"M_QUAL"));
3835 m_pMenuBar->Enable(ID_MENU_ENC_DATA_QUALITY,
true);
3837 m_pMenuBar->FindItem(ID_MENU_ENC_ANCHOR)->Check(
false);
3838 m_pMenuBar->Enable(ID_MENU_ENC_ANCHOR,
false);
3839 m_pMenuBar->Enable(ID_MENU_ENC_DATA_QUALITY,
false);
3844void MyFrame::UpdateGlobalMenuItems(
ChartCanvas *cc) {
3845 if (!m_pMenuBar)
return;
3847 m_pMenuBar->FindItem(ID_MENU_NAV_FOLLOW)->Check(cc->m_bFollow);
3849 if (cc->GetUpMode() == NORTH_UP_MODE)
3850 m_pMenuBar->FindItem(ID_MENU_CHART_NORTHUP)->Check(
true);
3851 else if (cc->GetUpMode() == COURSE_UP_MODE)
3852 m_pMenuBar->FindItem(ID_MENU_CHART_COGUP)->Check(
true);
3854 m_pMenuBar->FindItem(ID_MENU_CHART_HEADUP)->Check(
true);
3856 m_pMenuBar->FindItem(ID_MENU_NAV_TRACK)->Check(g_bTrackActive);
3857 m_pMenuBar->FindItem(ID_MENU_CHART_OUTLINES)->Check(cc->GetShowOutlines());
3858 m_pMenuBar->FindItem(ID_MENU_CHART_QUILTING)->Check(cc->GetQuiltMode());
3859 m_pMenuBar->FindItem(ID_MENU_UI_CHARTBAR)->Check(cc->GetShowChartbar());
3860 m_pMenuBar->FindItem(ID_MENU_AIS_TARGETS)->Check(cc->GetShowAIS());
3861 m_pMenuBar->FindItem(ID_MENU_AIS_MOORED_TARGETS)->Check(g_bHideMoored);
3862 m_pMenuBar->FindItem(ID_MENU_AIS_SCALED_TARGETS)->Check(cc->GetAttenAIS());
3863 m_pMenuBar->FindItem(ID_MENU_AIS_SCALED_TARGETS)->Enable(g_bAllowShowScaled);
3864 m_pMenuBar->FindItem(ID_MENU_AIS_TRACKS)->Check(g_bAISShowTracks);
3865 m_pMenuBar->FindItem(ID_MENU_AIS_CPADIALOG)->Check(g_bAIS_CPA_Alert);
3866 m_pMenuBar->FindItem(ID_MENU_AIS_CPASOUND)->Check(g_bAIS_CPA_Alert_Audio);
3867 m_pMenuBar->FindItem(ID_MENU_AIS_CPAWARNING)->Check(g_bCPAWarn);
3868 m_pMenuBar->FindItem(ID_MENU_SHOW_NAVOBJECTS)->Check(cc->m_bShowNavobjects);
3869 m_pMenuBar->FindItem(ID_MENU_SHOW_TIDES)->Check(cc->GetbShowTide());
3870 m_pMenuBar->FindItem(ID_MENU_SHOW_CURRENTS)->Check(cc->GetbShowCurrent());
3873 m_pMenuBar->FindItem(ID_MENU_ENC_TEXT)->Check(cc->GetShowENCText());
3874 m_pMenuBar->FindItem(ID_MENU_ENC_SOUNDINGS)->Check(cc->GetShowENCDepth());
3877 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
3879 OBJLElement *pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
3880 if (!strncmp(pOLE->OBJLName,
"LIGHTS", 6)) {
3885 m_pMenuBar->FindItem(ID_MENU_ENC_LIGHTS)->Check(cc->GetShowENCLights());
3889 DisCat nset = (DisCat)cc->GetENCDisplayCategory();
3890 if ((nset == MARINERS_STANDARD) || (nset == OTHER)) {
3891 m_pMenuBar->FindItem(ID_MENU_ENC_ANCHOR)->Check(cc->GetShowENCAnchor());
3892 m_pMenuBar->Enable(ID_MENU_ENC_ANCHOR,
true);
3893 m_pMenuBar->FindItem(ID_MENU_ENC_DATA_QUALITY)
3894 ->Check(cc->GetShowENCDataQual());
3895 m_pMenuBar->Enable(ID_MENU_ENC_DATA_QUALITY,
true);
3897 m_pMenuBar->FindItem(ID_MENU_ENC_ANCHOR)->Check(
false);
3898 m_pMenuBar->Enable(ID_MENU_ENC_ANCHOR,
false);
3899 m_pMenuBar->Enable(ID_MENU_ENC_DATA_QUALITY,
false);
3904void MyFrame::InvalidateAllCanvasUndo() {
3906 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
3908 if (cc) cc->undo->InvalidateUndo();
3912void MyFrame::SubmergeAllCanvasToolbars(
void) {
3914 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
3916 if (cc) cc->SubmergeToolbar();
3920void MyFrame::SurfaceAllCanvasToolbars(
void) {
3921 if (g_bshowToolbar) {
3923 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
3925 if (cc && cc->GetToolbarEnable()) cc->SurfaceToolbar();
3932void MyFrame::JumpToPosition(
ChartCanvas *cc,
double lat,
double lon,
3934 if (lon > 180.0) lon -= 360.0;
3939 cc->JumpToPosition(lat, lon,
scale);
3942 g_pi_manager->SendViewPortToRequestingPlugIns(cc->GetVP());
3946void MyFrame::UpdateCanvasConfigDescriptors() {
3948 for (
unsigned int i = 0;
3949 i < ConfigMgr::Get().GetCanvasConfigArray().GetCount(); i++) {
3950 canvasConfig *cc = ConfigMgr::Get().GetCanvasConfigArray().Item(i);
3958 cc->DBindex = chart->GetQuiltReferenceChartIndex();
3959 cc->GroupID = chart->m_groupIndex;
3962 cc->
bQuilt = chart->GetQuiltMode();
3969 cc->
bFollow = chart->m_bFollow;
3974 int upmode = chart->GetUpMode();
3975 if (upmode == COURSE_UP_MODE)
3977 else if (upmode == HEAD_UP_MODE)
3984void MyFrame::CenterView(
ChartCanvas *cc,
const LLBBox &RBBox) {
3985 if (!RBBox.GetValid())
return;
3987 double clat = (RBBox.GetMinLat() + RBBox.GetMaxLat()) / 2;
3988 double clon = (RBBox.GetMinLon() + RBBox.GetMaxLon()) / 2;
3991 if (RBBox.GetMinLat() == RBBox.GetMaxLat() &&
3992 RBBox.GetMinLon() == RBBox.GetMaxLon()) {
4000 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
4001 RBBox.GetMinLat(), RBBox.GetMaxLon(), NULL, &rw);
4003 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
4004 RBBox.GetMaxLat(), RBBox.GetMinLon(), NULL, &rh);
4006 cc->GetSize(&ww, &wh);
4008 ppm = wxMin(ww / (rw * 1852), wh / (rh * 1852)) * (100 - fabs(clat)) / 90;
4010 ppm = wxMin(ppm, 1.0);
4016void MyFrame::PrepareOptionsClose(
options *settings,
4017 int settings_return_value) {
4019 options_lastPage = settings->lastPage;
4024 if (options_lastPage == 1) options_lastPage = 0;
4026 options_subpage = settings->lastSubPage;
4027 options_lastWindowPos = settings->lastWindowPos;
4028 options_lastWindowSize = settings->lastWindowSize;
4031 androidEnableBackButton(
true);
4032 androidEnableOptionsMenu(
true);
4033 androidRestoreFullScreen();
4034 androidEnableRotation();
4043 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4046 int index_hint = -1;
4047 if (i < pathArray.GetCount())
4048 index_hint = ChartData->FinddbIndex(pathArray.Item(i));
4049 cc->canvasChartsRefresh(index_hint);
4050 if (index_hint != -1) cc->
SetVPScale(restoreScale[i]);
4057void MyFrame::DoOptionsDialog() {
4058 if (NULL == g_options) {
4059 AbstractPlatform::ShowBusySpinner();
4062 pConfig->SetPath(
"/Settings");
4063 pConfig->Read(
"OptionsSizeX", &sx, -1);
4064 pConfig->Read(
"OptionsSizeY", &sy, -1);
4066 wxWindow *optionsParent =
this;
4068 optionsParent = GetPrimaryCanvas();
4070 g_options =
new options(optionsParent, -1, _(
"Options"), wxPoint(-1, -1),
4073 AbstractPlatform::HideBusySpinner();
4077 g_options->SetInitChartDir(*pInit_Chart_Dir);
4080 g_options->SetCurrentDirList(ChartData->GetChartDirArray());
4081 ArrayOfCDI *pWorkDirArray =
new ArrayOfCDI;
4082 g_options->SetWorkDirListPtr(pWorkDirArray);
4085 g_options->SetConfigPtr(pConfig);
4086 g_options->SetInitialSettings();
4088 prev_locale = g_locale;
4089 g_options->SetInitialPage(options_lastPage, options_subpage);
4092 g_options->lastWindowPos = options_lastWindowPos;
4093 if (options_lastWindowPos != wxPoint(0, 0)) {
4094 g_options->Move(options_lastWindowPos);
4095 g_options->SetSize(options_lastWindowSize);
4097 g_options->CenterOnScreen();
4099 if (options_lastWindowSize != wxSize(0, 0)) {
4100 g_options->SetSize(options_lastWindowSize);
4105 androidEnableBackButton(
false);
4106 androidEnableOptionsMenu(
false);
4107 androidDisableFullScreen();
4114 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4117 wxString chart_file_name;
4118 if (cc->GetQuiltMode()) {
4119 int dbi = cc->GetQuiltRefChartdbIndex();
4120 chart_file_name = ChartData->GetDBChartFileName(dbi);
4122 if (cc->m_singleChart)
4123 chart_file_name = cc->m_singleChart->GetFullPath();
4126 pathArray.Add(chart_file_name);
4132 last_canvasConfig = g_canvasConfig;
4135 g_last_ChartScaleFactor = g_ChartScaleFactor;
4141void MyFrame::ProcessOptionsDialog(
int rr, ArrayOfCDI *pNewDirArray) {
4142 bool b_need_refresh =
false;
4144 if ((rr & VISIT_CHARTS) &&
4145 ((rr & CHANGE_CHARTS) || (rr & FORCE_UPDATE) || (rr & SCAN_UPDATE))) {
4147 UpdateChartDatabaseInplace(*pNewDirArray,
4148 ((rr & FORCE_UPDATE) == FORCE_UPDATE),
true,
4151 b_need_refresh =
true;
4155 if (rr & STYLE_CHANGED) {
4158 _(
"Please restart OpenCPN to activate language or style changes."),
4159 _(
"OpenCPN Info"), wxOK | wxICON_INFORMATION);
4162 bool b_groupchange =
false;
4163 if (((rr & VISIT_CHARTS) &&
4164 ((rr & CHANGE_CHARTS) || (rr & FORCE_UPDATE) || (rr & SCAN_UPDATE))) ||
4165 (rr & GROUPS_CHANGED)) {
4166 b_groupchange = ScrubGroupArray();
4167 ChartData->ApplyGroupArray(g_pGroupArray);
4168 RefreshGroupIndices();
4171 if (rr & GROUPS_CHANGED || b_groupchange) {
4172 pConfig->DestroyConfigGroups();
4173 pConfig->CreateConfigGroups(g_pGroupArray);
4176 if (rr & TIDES_CHANGED) {
4182 if (rr & S52_CHANGED) {
4183 WayPointmanGui(*pWayPointMan).ReloadAllIcons(g_Platform->GetDisplayDPmm());
4186 pConfig->UpdateSettings();
4188 if (g_pActiveTrack) {
4189 g_pActiveTrack->SetPrecision(g_nTrackPrecision);
4193 g_pRouteMan->SetColorScheme(global_color_scheme,
4194 g_Platform->GetDisplayDPmm());
4197 double stuffcog = NAN;
4198 double stuffsog = NAN;
4199 if (!std::isnan(gCog)) stuffcog = gCog;
4200 if (!std::isnan(gSog)) stuffsog = gSog;
4202 for (
int i = 0; i < MAX_COGSOG_FILTER_SECONDS; i++) {
4203 COGFilterTable[i] = stuffcog;
4204 SOGFilterTable[i] = stuffsog;
4207 SetChartUpdatePeriod();
4209 if (rr & GL_CHANGED) {
4213 b_need_refresh =
true;
4216 if (rr & S52_CHANGED) {
4217 b_need_refresh =
true;
4221 if (rr & REBUILD_RASTER_CACHE) {
4222 if (g_glTextureManager) {
4223 GetPrimaryCanvas()->Disable();
4224 g_glTextureManager->BuildCompressedCache();
4225 GetPrimaryCanvas()->Enable();
4230 if (g_config_display_size_manual &&
4231 g_config_display_size_mm.size() > g_current_monitor &&
4232 g_config_display_size_mm[g_current_monitor] > 0) {
4233 g_display_size_mm = g_config_display_size_mm[g_current_monitor];
4238 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4244 g_pi_manager->SendBaseConfigToAllPlugIns();
4245 int rrt = rr & S52_CHANGED;
4246 g_pi_manager->SendS52ConfigToAllPlugIns(
4247 (rrt == S52_CHANGED) ||
4248 (g_last_ChartScaleFactor != g_ChartScaleFactor));
4251 if (g_MainToolbar) {
4252 g_MainToolbar->SetAutoHide(g_bAutoHideToolbar);
4253 g_MainToolbar->SetAutoHideTimer(g_nAutoHideToolbar);
4258 ps52plib->SetScaleFactorExp(
4259 g_Platform->GetChartScaleFactorExp(g_ChartScaleFactor));
4260 ps52plib->SetScaleFactorZoomMod(g_chart_zoom_modifier_vector);
4264 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4266 if (cc) cc->ApplyGlobalSettings();
4273 int index_hint = ChartData->FinddbIndex( chart_file_name );
4274 if( -1 == index_hint )
4282 bool ztc = g_bEnableZoomToCursor;
4283 g_bEnableZoomToCursor =
4288 g_bEnableZoomToCursor = ztc;
4291 if (g_last_ChartScaleFactor != g_ChartScaleFactor) {
4292 if (g_pMarkInfoDialog) {
4293 g_pMarkInfoDialog->Hide();
4294 g_pMarkInfoDialog->Destroy();
4295 g_pMarkInfoDialog = NULL;
4300 SetGPSCompassScale();
4302 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4305 cc->GetCompass()->SetScaleFactor(g_compass_scalefactor);
4306 cc->UpdateCanvasControlBar();
4309 UpdateGPSCompassStatusBoxes();
4311 SetAllToolbarScale();
4312 RequestNewToolbars();
4315 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4318 cc->RebuildCursors();
4323 bool b_masterScaleChange =
false;
4324 if (fabs(g_MainToolbar->GetScaleFactor() - g_toolbar_scalefactor) > 0.01f)
4325 b_masterScaleChange =
true;
4327 if ((rr & TOOLBAR_CHANGED) || b_masterScaleChange)
4328 RequestNewMasterToolbar(
true);
4330 bool bMuiChange =
false;
4336 if (b_masterScaleChange || bMuiChange) {
4338 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4341 cc->ProcessNewGUIScale();
4347 if (rr & LOCALE_CHANGED) {
4348 g_Platform->ChangeLocale(g_locale, plocale_def_lang, &plocale_def_lang);
4350 rr |= NEED_NEW_OPTIONS;
4355 if (g_pi_manager) g_pi_manager->NotifyAuiPlugIns();
4359 g_last_ChartScaleFactor = g_ChartScaleFactor;
4364bool MyFrame::CheckGroup(
int igroup) {
4365 if (igroup == 0)
return true;
4367 ChartGroup *pGroup = g_pGroupArray->Item(igroup - 1);
4369 if (!pGroup->m_element_array.size())
4372 for (
const auto &elem : pGroup->m_element_array) {
4373 for (
unsigned int ic = 0;
4374 ic < (
unsigned int)ChartData->GetChartTableEntries(); ic++) {
4376 wxString chart_full_path(pcte->GetpFullPath(), wxConvUTF8);
4378 if (chart_full_path.StartsWith(elem.m_element_name))
return true;
4385bool MyFrame::ScrubGroupArray() {
4390 bool b_change =
false;
4391 unsigned int igroup = 0;
4392 while (igroup < g_pGroupArray->GetCount()) {
4393 bool b_chart_in_element =
false;
4394 ChartGroup *pGroup = g_pGroupArray->Item(igroup);
4396 for (
unsigned int j = 0; j < pGroup->m_element_array.size(); j++) {
4397 const wxString &element_root = pGroup->m_element_array[j].m_element_name;
4399 for (
unsigned int ic = 0;
4400 ic < (
unsigned int)ChartData->GetChartTableEntries(); ic++) {
4402 wxString chart_full_path = pcte->GetFullSystemPath();
4404 if (chart_full_path.StartsWith(element_root)) {
4405 b_chart_in_element =
true;
4411 if (!b_chart_in_element) {
4412 wxString test_string = _T(
"GSHH");
4413 if (element_root.Upper().Contains(test_string))
4414 b_chart_in_element =
true;
4417 if (!b_chart_in_element)
4419 pGroup->m_element_array.erase(pGroup->m_element_array.begin() + j);
4431void MyFrame::RefreshCanvasOther(
ChartCanvas *ccThis) {
4433 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4435 if (cc && (cc != ccThis)) cc->Refresh();
4440void MyFrame::ChartsRefresh() {
4441 if (!ChartData)
return;
4443 AbstractPlatform::ShowBusySpinner();
4445 bool b_run = FrameTimer1.IsRunning();
4448 FrameTenHzTimer.Stop();
4451 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4454 int currentIndex = cc->GetpCurrentStack()->GetCurrentEntrydbIndex();
4455 if (cc->GetQuiltMode()) {
4456 currentIndex = cc->GetQuiltReferenceChartIndex();
4458 cc->canvasChartsRefresh(currentIndex);
4462 if (b_run) FrameTimer1.Start(TIMER_GFRAME_1, wxTIMER_CONTINUOUS);
4463 if (b_run) FrameTenHzTimer.Start(100, wxTIMER_CONTINUOUS);
4465 AbstractPlatform::HideBusySpinner();
4468void MyFrame::InvalidateAllQuilts() {
4469 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4472 cc->InvalidateQuilt();
4473 cc->SetQuiltRefChart(-1);
4474 cc->m_singleChart = NULL;
4479bool MyFrame::UpdateChartDatabaseInplace(ArrayOfCDI &DirArray,
bool b_force,
4481 const wxString &ChartListFileName) {
4482 bool b_run = FrameTimer1.IsRunning();
4484 FrameTenHzTimer.Stop();
4486 bool b_runCOGTimer = FrameCOGTimer.IsRunning();
4487 FrameCOGTimer.Stop();
4490 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4493 cc->InvalidateQuilt();
4494 cc->SetQuiltRefChart(-1);
4495 cc->m_singleChart = NULL;
4499 ChartData->PurgeCache();
4505 AbstractPlatform::ShowBusySpinner();
4507 wxGenericProgressDialog *pprog =
nullptr;
4509 wxString longmsg = _(
"OpenCPN Chart Update");
4511 _T(
"..................................................................")
4514 pprog = new wxGenericProgressDialog();
4517 pprog->SetFont(*qFont);
4519 pprog->Create(_("OpenCPN
Chart Update"), longmsg, 100, gFrame,
4520 wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
4521 wxPD_REMAINING_TIME);
4527 wxLogMessage(_T(" "));
4528 wxLogMessage(_T("Starting chart database Update..."));
4529 wxString gshhg_chart_loc = gWorldMapLocation;
4530 gWorldMapLocation = wxEmptyString;
4533 ChartData->Update(DirArray, b_force, pprog);
4534 ChartData->SaveBinary(ChartListFileName);
4535 wxLogMessage(_T("Finished chart database Update"));
4536 wxLogMessage(_T(" "));
4537 if (gWorldMapLocation.empty()) {
4541 gWorldMapLocation = gDefaultWorldMapLocation;
4542 gshhg_chart_loc = wxEmptyString;
4545 if (gWorldMapLocation != gshhg_chart_loc) {
4547 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4549 if (cc) cc->ResetWorldBackgroundChart();
4552 gshhsCrossesLandReset();
4557 AbstractPlatform::HideBusySpinner();
4559 pConfig->UpdateChartDirs(DirArray);
4562 if (b_run) FrameTimer1.Start(TIMER_GFRAME_1, wxTIMER_CONTINUOUS);
4563 if (b_run) FrameTenHzTimer.Start(100, wxTIMER_CONTINUOUS);
4565 if (b_runCOGTimer) {
4567 int period_ms = 100;
4568 if (g_COGAvgSec > 0) period_ms = g_COGAvgSec * 1000;
4569 FrameCOGTimer.Start(period_ms, wxTIMER_CONTINUOUS);
4576 cc->ToggleCanvasQuiltMode();
4578 bool cur_mode = cc->GetQuiltMode();
4580 if( !cc->GetQuiltMode() )
4581 cc->SetQuiltMode(
true );
4583 if( cc->GetQuiltMode() ) {
4584 cc->SetQuiltMode(
false );
4585 g_sticky_chart = cc->GetQuiltReferenceChartIndex();
4589 if( cur_mode != cc->GetQuiltMode() ){
4595 g_bQuiltEnable = cc->GetQuiltMode();
4599 ps52plib->GenerateStateHash();
4604void MyFrame::DoStackDown(
ChartCanvas *cc) { DoStackDelta(cc, -1); }
4606void MyFrame::DoStackUp(
ChartCanvas *cc) { DoStackDelta(cc, 1); }
4608void MyFrame::DoStackDelta(
ChartCanvas *cc,
int direction) {
4610 cc->DoCanvasStackDelta(direction);
4614void MyFrame::PositionIENCToolbar() {
4616 if (g_iENCToolbar) {
4618 posn.x = (GetPrimaryCanvas()->GetSize().x - g_iENCToolbar->GetSize().x) / 2;
4620 g_iENCToolbar->Move(GetPrimaryCanvas()->ClientToScreen(posn));
4628void MyFrame::OnInitTimer(wxTimerEvent &event) {
4631 msg.Printf(_T(
"OnInitTimer...%d"), m_iInitCount);
4634 wxLog::FlushActive();
4636 switch (m_iInitCount++) {
4638 if (g_MainToolbar) g_MainToolbar->EnableTool(ID_SETTINGS,
false);
4640 if (g_bInlandEcdis) {
4641 double range = GetPrimaryCanvas()->GetCanvasRangeMeters();
4642 double range_set = 500.;
4644 range = wxRound(range * 10) / 10.;
4648 else if (range > 2000.)
4650 else if (range > 1600.)
4652 else if (range > 1200.)
4654 else if (range > 800.)
4659 GetPrimaryCanvas()->SetCanvasRangeMeters(range_set);
4663 g_Platform->SetFullscreen(g_bFullscreen);
4666 if (g_NeedDBUpdate > 0) {
4667 RebuildChartDatabase();
4668 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4671 cc->SetGroupIndex(0,
false);
4679 if (ChartData->GetCentroidOfLargestScaleChart(&clat, &clon,
4680 CHART_FAMILY_RASTER)) {
4683 gFrame->ClearbFollow(gFrame->GetPrimaryCanvas());
4685 if (ChartData->GetCentroidOfLargestScaleChart(&clat, &clon,
4686 CHART_FAMILY_VECTOR)) {
4689 gFrame->ClearbFollow(gFrame->GetPrimaryCanvas());
4698 auto colour_func = [](wxString c) {
return GetGlobalColor(c); };
4701 .SetColorScheme(global_color_scheme, g_Platform->GetDisplayDPmm());
4703 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4706 if (cc->SetUserOwnship()) cc->SetColorScheme(global_color_scheme);
4710 pConfig->LoadNavObjects();
4711 NavObj_dB::GetInstance().LoadNavObjects();
4714 if (!g_AW1GUID.IsEmpty()) {
4715 pAnchorWatchPoint1 = pWayPointMan->FindRoutePointByGUID(g_AW1GUID);
4717 if (!g_AW2GUID.IsEmpty()) {
4718 pAnchorWatchPoint2 = pWayPointMan->FindRoutePointByGUID(g_AW2GUID);
4723 appendOSDirSlash(&layerdir);
4724 layerdir.Append(_T(
"layers"));
4726 if (wxDir::Exists(layerdir)) {
4728 laymsg.Printf(wxT(
"Getting .gpx layer files from: %s"),
4730 wxLogMessage(laymsg);
4731 pConfig->LoadLayers(layerdir);
4739 for (
auto *cp : TheConnectionParams()) {
4742 cp->b_IsSetup = TRUE;
4747 console->SetColorScheme(global_color_scheme);
4751 if (g_pRouteMan->IsAnyRouteActive()) {
4752 g_pRouteMan->GetDlgContext().show_with_fresh_fonts();
4759 if (m_initializing)
break;
4760 m_initializing =
true;
4761 AbstractPlatform::ShowBusySpinner();
4763 AbstractPlatform::HideBusySpinner();
4765 RequestNewMasterToolbar();
4768 if (pWayPointMan)
WayPointmanGui(*pWayPointMan).ReloadRoutepointIcons();
4770 if (g_MainToolbar) g_MainToolbar->EnableTool(ID_SETTINGS,
false);
4772 wxString perspective;
4773 pConfig->SetPath(_T (
"/AUI" ));
4774 pConfig->Read(_T (
"AUIPerspective" ), &perspective);
4781 bool bno_load =
false;
4783 wxArrayString name_array;
4784 wxStringTokenizer st(perspective, _T(
"|;"));
4785 while (st.HasMoreTokens()) {
4786 wxString s1 = st.GetNextToken();
4787 if (s1.StartsWith(_T(
"name="))) {
4788 wxString sc = s1.AfterFirst(
'=');
4793 wxAuiPaneInfoArray pane_array_val = g_pauimgr->GetAllPanes();
4794 for (
unsigned int i = 0; i < pane_array_val.GetCount(); i++) {
4795 wxAuiPaneInfo pane = pane_array_val.Item(i);
4799 if (name_array.Index(pane.name) == wxNOT_FOUND) {
4805 if (!bno_load) g_pauimgr->LoadPerspective(perspective,
false);
4809 for(
unsigned int i=0 ; i < g_canvasArray.GetCount() ; i++){
4812 g_pauimgr->GetPane(cc).MinSize(10,10);
4819 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4822 wxSize frameSize = GetClientSize();
4823 wxSize minSize = g_pauimgr->GetPane(cc).min_size;
4824 int width = wxMax(minSize.x, frameSize.x / 10);
4825 g_pauimgr->GetPane(cc).MinSize(frameSize.x * 1 / 5, frameSize.y);
4828 g_pauimgr->Update();
4832 g_pi_manager->NotifyAuiPlugIns();
4835 g_pi_manager->ShowDeferredBlacklistMessages();
4837 g_pi_manager->CallLateInit();
4842 if (g_pi_manager->IsAnyPlugInChartEnabled()) {
4843 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4845 if (cc) cc->SetFirstAuto(
true);
4848 b_reloadForPlugins =
true;
4855 if (g_MainToolbar) {
4856 g_MainToolbar->SetAutoHide(g_bAutoHideToolbar);
4857 g_MainToolbar->SetAutoHideTimer(g_nAutoHideToolbar);
4863 for(
unsigned int i=0 ; i < g_canvasArray.GetCount() ; i++){
4865 cc->RequestNewCanvasToolbar(
true );
4867 if(cc && cc->GetToolbarEnable()){
4868 cc->GetToolbar()->SetAutoHide(g_bAutoHideToolbar);
4869 cc->GetToolbar()->SetAutoHideTimer(g_nAutoHideToolbar);
4879 pConfig->SetPath(
"/Settings");
4880 pConfig->Read(
"OptionsSizeX", &sx, -1);
4881 pConfig->Read(
"OptionsSizeY", &sy, -1);
4883 wxWindow *optionsParent =
this;
4885 optionsParent = GetPrimaryCanvas();
4887 g_options =
new options(optionsParent, -1, _(
"Options"), wxPoint(-1, -1),
4890 BuildiENCToolbar(
true);
4897 if (!g_params.empty()) {
4898 for (
size_t n = 0; n < g_params.size(); n++) {
4899 wxString path = g_params[n];
4900 if (::wxFileExists(path)) {
4902 pSet->load_file(path.fn_str());
4905 pSet->LoadAllGPXObjects(
4906 !pSet->IsOpenCPN(), wpt_dups,
4908 LLBBox box = pSet->GetBBox();
4909 if (box.GetValid()) {
4910 CenterView(GetPrimaryCanvas(), box);
4919 InitAppMsgBusListener();
4927 wxLogMessage(_T(
"OnInitTimer...Last Call"));
4929 PositionIENCToolbar();
4931 g_bDeferredInitDone =
true;
4933 GetPrimaryCanvas()->SetFocus();
4934 g_focusCanvas = GetPrimaryCanvas();
4940 if (b_reloadForPlugins) {
4945 wxLogMessage(_T(
"OnInitTimer...Finalize Canvases"));
4947 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4951 cc->CheckGroupValid();
4956 androidEnableBackButton(
true);
4957 androidEnableRotation();
4958 androidEnableOptionItems(
true);
4962 if (g_MainToolbar) g_MainToolbar->EnableTool(ID_SETTINGS,
true);
4971 if (!g_bDeferredInitDone) InitTimer.Start(100, wxTIMER_ONE_SHOT);
4973 wxLog::FlushActive();
4975 RefreshAllCanvas(
true);
4976 wxGetApp().m_usb_watcher.Start();
4982void MyFrame::InitAppMsgBusListener() {
4983 auto &msgbus = AppMsgBus::GetInstance();
4986 AppMsg msg_basic(AppMsg::Type::BasicNavData);
4987 listener_basic_navdata.
Listen(msg_basic,
this, EVT_BASIC_NAV_DATA);
4991 auto basicnav_msg = std::static_pointer_cast<const BasicNavDataMsg>(ptr);
4992 HandleBasicNavMsg(basicnav_msg);
4996 AppMsg msg_watchdog(AppMsg::Type::GPSWatchdog);
4997 listener_gps_watchdog.
Listen(msg_watchdog,
this, EVT_GPS_WATCHDOG);
5001 auto msg = std::static_pointer_cast<const GPSWatchdogMsg>(ptr);
5002 HandleGPSWatchdogMsg(msg);
5009void MyFrame::ReleaseApiListeners() {}
5014 m_on_raise_listener.
Init(server.on_raise, [&](
ObservedEvt) { Raise(); });
5015 m_on_quit_listener.
Init(server.on_quit, [&](
ObservedEvt) { FastClose(); });
5016 server.SetGetRestApiEndpointCb(
5017 [&] {
return wxGetApp().m_rest_server.GetEndpoint(); });
5018 server.open_file_cb = [](
const std::string &path) {
5019 return wxGetApp().OpenFile(path);
5026void MyFrame::HandleGPSWatchdogMsg(std::shared_ptr<const GPSWatchdogMsg> msg) {
5027 if (msg->gps_watchdog <= 0) {
5028 if (msg->wd_source == GPSWatchdogMsg::WDSource::position) {
5029 bool last_bGPSValid = bGPSValid;
5032 if (last_bGPSValid != bGPSValid) UpdateGPSCompassStatusBoxes(
true);
5037 if (m_fix_start_time.IsValid()) {
5038 wxDateTime now = wxDateTime::Now();
5039 wxTimeSpan span = now - m_fix_start_time;
5040 if (span.IsLongerThan(wxTimeSpan(0, 5))) {
5041 auto ¬eman = NotificationManager::GetInstance();
5042 std::string msg =
"GNSS Position fix lost";
5043 noteman.AddNotification(NotificationSeverity::kCritical, msg);
5044 m_fix_start_time = wxInvalidDateTime;
5048 }
else if (msg->wd_source == GPSWatchdogMsg::WDSource::velocity) {
5049 bool last_bVelocityValid = bVelocityValid;
5050 bVelocityValid =
false;
5057void MyFrame::CalculateCOGAverage() {
5059 if (!std::isnan(gCog)) {
5060 if (g_COGAvgSec > 0) {
5062 for (
int i = g_COGAvgSec - 1; i > 0; i--) COGTable[i] = COGTable[i - 1];
5065 double sum = 0., count = 0;
5066 for (
int i = 0; i < g_COGAvgSec; i++) {
5067 double adder = COGTable[i];
5068 if (std::isnan(adder))
continue;
5070 if (fabs(adder - g_COGAvg) > 180.) {
5071 if ((adder - g_COGAvg) > 0.)
5084 else if (sum >= 360.)
5093void MyFrame::HandleBasicNavMsg(std::shared_ptr<const BasicNavDataMsg> msg) {
5094 m_fixtime = msg->time;
5095 double hdt_data_interval = 0;
5096 double fix_time_interval = 0;
5098 double msgtime = msg->set_time.tv_sec;
5099 double m1 = msg->set_time.tv_nsec / 1e9;
5102 if (((msg->vflag & POS_UPDATE) == POS_UPDATE) &&
5103 ((msg->vflag & POS_VALID) == POS_VALID)) {
5105 if (!m_fix_start_time.IsValid()) {
5106 m_fix_start_time = wxDateTime::Now();
5111 DistanceBearingMercator(gLat, gLon, gLat_gt, gLon_gt, &brg, &dist);
5114 fix_time_gt_last = fix_time_gt;
5115 uint64_t fix_time_gt_now =
5116 msg->set_time.tv_sec * 1e9 + msg->set_time.tv_nsec;
5117 fix_time_interval = (fix_time_gt_now - fix_time_gt_last) / (
double)1e9;
5121 double implied_sog = dist / (fix_time_interval / 3600);
5126 gLat_gt_m1 = gLat_gt;
5127 gLon_gt_m1 = gLon_gt;
5131 fix_time_gt = fix_time_gt_now;
5135 if (((msg->vflag & COG_UPDATE) == COG_UPDATE) &&
5136 ((msg->vflag & SOG_UPDATE) == SOG_UPDATE)) {
5137 gCog_gt_m1 = gCog_gt;
5147 if (!std::isnan(gCog_gt_m1)) {
5149 if ((fabs(gSog - implied_sog) / gSog) > 0.5) {
5156 if ((fix_time_gt - fix_time_gt_last) > .08) {
5161 if (gCog_gt > gCog_gt_m1) {
5162 if ((gCog_gt - gCog_gt_m1) > 180.)
5167 if ((gCog_gt_m1 - gCog_gt) > 180.)
5172 difft = fabs(gCog_gt - gCog_gt_m1);
5173 if (fabs(difft > 180.)) difft = fabs(difft - 360.);
5181 double tentative_cog_rate_gt = diff / (fix_time_gt - fix_time_gt_last);
5182 tentative_cog_rate_gt *= 1e9;
5183 cog_rate_gt = tentative_cog_rate_gt;
5191 if ((msg->vflag & HDT_UPDATE) == HDT_UPDATE) {
5194static double hdt_avg;
5195 double hdt_norm = gHdt;
5196 if(gHdt > 180) hdt_norm -= 360;
5199 hdt_avg += hdt_norm * 0.1;
5201 if( gHdt < 0) gHdt += 360.;
5204 if (!std::isnan(gHdt)) {
5206 uint64_t hdt_time_gt_last = hdt_time_gt;
5207 hdt_time_gt = msg->set_time.tv_sec * 1e9 + msg->set_time.tv_nsec;
5208 hdt_data_interval = (hdt_time_gt - hdt_time_gt_last) / 1e9;
5211 if (hdt_data_interval > .09) {
5213 gHdt_gt_m1 = gHdt_gt;
5216 if (!std::isnan(gHdt_gt_m1)) {
5218 double tentative_hdt_rate_gt =
5219 (gHdt_gt - gHdt_gt_m1) / (hdt_time_gt - hdt_time_gt_last);
5220 tentative_hdt_rate_gt *= 1e9;
5222 if (fabs(tentative_hdt_rate_gt - hdt_rate_gt) < 180.)
5223 hdt_rate_gt = tentative_hdt_rate_gt;
5231 if (std::isnan(gHdt)) gHdt_gt = NAN;
5234 CalculateCOGAverage();
5241 bool last_bGPSValid = bGPSValid;
5242 if ((msg->vflag & POS_UPDATE) == POS_UPDATE) {
5243 if ((msg->vflag & POS_VALID) == POS_VALID)
5248 if (last_bGPSValid != bGPSValid) UpdateGPSCompassStatusBoxes(
true);
5250 bVelocityValid =
true;
5254void MyFrame::UpdateStatusBar() {
5257 unsigned long uiCurrentTickCount;
5258 m_MMEAeventTime.SetToCurrent();
5259 uiCurrentTickCount =
5260 m_MMEAeventTime.GetMillisecond() / 100;
5261 uiCurrentTickCount += m_MMEAeventTime.GetTicks() * 10;
5262 if (uiCurrentTickCount > m_ulLastNMEATicktime + 1) {
5263 m_ulLastNMEATicktime = uiCurrentTickCount;
5265 if (m_tick_idx++ > 6) m_tick_idx = 0;
5270 if (NULL != GetStatusBar()) {
5273 tick_buf[0] = nmea_tick_chars[m_tick_idx];
5276 wxString s1(tick_buf, wxConvUTF8);
5278 s1 += toSDMM(1, gLat);
5280 s1 += toSDMM(2, gLon);
5282 if (STAT_FIELD_TICK >= 0) SetStatusText(s1, STAT_FIELD_TICK);
5286 if (!std::isnan(gSog))
5287 sogcog.Printf(_T(
"SOG %2.2f ") + getUsrSpeedUnit() + _T(
" "),
5290 sogcog.Printf(_T(
"SOG --- "));
5294 if (!std::isnan(gCog) && !std::isnan(gSog) && (gSog > 0.05)) {
5296 cogs << wxString::Format(wxString(
"COG %03d%c "), (
int)gCog, 0x00B0);
5298 cogs << wxString::Format(wxString(
"COG %03d%c(M) "),
5299 (
int)toMagnetic(gCog), 0x00B0);
5301 cogs.Printf((
"COG ---%c"), 0x00B0);
5303 sogcog.Append(cogs);
5304 SetStatusText(sogcog, STAT_FIELD_SOGCOG);
5309void MyFrame::OnMemFootTimer(wxTimerEvent &event) {
5310 MemFootTimer.Stop();
5312 int memsize = GetApplicationMemoryUse();
5315 printf(
"Memsize: %d \n", memsize);
5318 if (memsize > (g_MemFootMB * 1000)) {
5320 if (ChartData && cc) {
5322 wxArrayPtrVoid *pCache = ChartData->GetChartCache();
5323 unsigned int nCache = pCache->GetCount();
5326 for (
unsigned int i = 0; i < nCache; i++) {
5336 for (
unsigned int i = 0; i < nCache - 1; i++) {
5337 if (pcea[i].RecentTime > pcea[i + 1].RecentTime) {
5339 pcea[i] = pcea[i + 1];
5350 unsigned int idelete = 0;
5351 unsigned int idelete_max = pCache->GetCount();
5354 unsigned int minimum_cache = 1;
5355 if (cc->GetQuiltMode()) minimum_cache = cc->GetQuiltChartCount();
5357 while ((memsize > (g_MemFootMB * 1000)) &&
5358 (pCache->GetCount() > minimum_cache) &&
5359 (idelete < idelete_max)) {
5360 int memsizeb = memsize;
5362 ChartData->DeleteCacheChart((
ChartBase *)pcea[idelete].pChart);
5364 memsize = GetApplicationMemoryUse();
5365 printf(
"delete, before: %d after: %d\n", memsizeb, memsize);
5373 MemFootTimer.Start(9000, wxTIMER_CONTINUOUS);
5378void MyFrame::CheckToolbarPosition() {
5381 static bool bMaximized;
5383 if (IsMaximized() && !bMaximized) {
5385 if (g_MainToolbar) {
5386 g_MainToolbar->SetYAuxOffset(g_MainToolbar->GetToolSize().y * 15 / 10);
5387 g_MainToolbar->SetDefaultPosition();
5388 g_MainToolbar->Realize();
5390 PositionIENCToolbar();
5391 }
else if (!IsMaximized() && bMaximized) {
5393 if (g_MainToolbar) {
5394 g_MainToolbar->SetYAuxOffset(0);
5395 g_MainToolbar->SetDockY(-1);
5396 g_MainToolbar->SetDefaultPosition();
5397 g_MainToolbar->Realize();
5399 PositionIENCToolbar();
5404void MyFrame::ProcessUnitTest() {
5405 if (!g_bPauseTest && (g_unit_test_1 || g_unit_test_2)) {
5412 cc->m_bFollow =
false;
5413 if (g_MainToolbar && g_MainToolbar->GetToolbar())
5414 g_MainToolbar->GetToolbar()->ToggleTool(ID_FOLLOW, cc->m_bFollow);
5415 int ut_index_max = ((g_unit_test_1 > 0) ? (g_unit_test_1 - 1) : INT_MAX);
5418 if (cc->m_groupIndex > 0) {
5419 while (ut_index < ChartData->GetChartTableEntries() &&
5420 !ChartData->IsChartInGroup(ut_index, cc->m_groupIndex)) {
5424 if (ut_index < ChartData->GetChartTableEntries()) {
5426 const ChartTableEntry *cte = &ChartData->GetChartTableEntry(ut_index);
5428 double clat = (cte->GetLatMax() + cte->GetLatMin()) / 2;
5429 double clon = (cte->GetLonMax() + cte->GetLonMin()) / 2;
5436 if (cc->GetQuiltMode()) {
5437 if (cc->IsChartQuiltableRef(ut_index))
5438 cc->SelectQuiltRefdbChart(ut_index);
5440 cc->SelectdbChart(ut_index);
5443 if (g_unit_test_1) {
5451 DistanceBearingMercator(cte->GetLatMin(), cte->GetLonMin(),
5452 cte->GetLatMin(), cte->GetLonMax(), NULL,
5456 DistanceBearingMercator(cte->GetLatMin(), cte->GetLonMin(),
5457 cte->GetLatMax(), cte->GetLonMin(), NULL,
5460 cc->GetSize(&ww, &wh);
5461 ppm = wxMin(ww / (rw * 1852), wh / (rh * 1852)) * (100 - fabs(clat)) /
5463 ppm = wxMin(ppm, 1.0);
5470 if (ut_index > ut_index_max) exit(0);
5479void MyFrame::OnFrameTenHzTimer(wxTimerEvent &event) {
5481 bool b_rotate =
false;
5483 if (cc) b_rotate |= (cc->GetUpMode() != NORTH_UP_MODE);
5486 if (!b_rotate && !g_btenhertz)
return;
5488 bool b_update =
false;
5490 if (!std::isnan(gCog) && !std::isnan(gSog)) {
5493 struct timespec now;
5494 clock_gettime(CLOCK_MONOTONIC, &now);
5495 uint64_t diff = 1e9 * (now.tv_sec) + now.tv_nsec - fix_time_gt;
5496 double diffc = diff / 1e9;
5499 double gCog_tentative = gCog_gt_m1 + (cog_rate_gt * diffc);
5500 if (gCog_tentative >= 360.) gCog_tentative -= 360.;
5501 if (gCog_tentative < 0.) gCog_tentative += 360.;
5502 gCog = gCog_tentative;
5506 if (!std::isnan(gHdt_gt) && !std::isnan(gHdt_gt_m1)) {
5507 uint64_t diff = 1e9 * (now.tv_sec) + now.tv_nsec - hdt_time_gt;
5508 double diffc = diff / 1e9;
5509 gHdt = gHdt_gt_m1 + (hdt_rate_gt * diffc);
5513 if (gSog_gt && !std::isnan(gCog_gt)) {
5514 double delta_t = diffc / 3600;
5515 double distance = gSog_gt * delta_t;
5518 double angr = gCog_gt / 180 * M_PI;
5519 double latr = gLat_gt * M_PI / 180;
5520 double D = distance / 3443;
5521 double sD = sin(D), cD = cos(D);
5522 double sy = sin(latr), cy = cos(latr);
5523 double sa = sin(angr), ca = cos(angr);
5525 gLon = gLon_gt + asin(sa * sD / cy) * 180 / M_PI;
5526 gLat = asin(sy * cD + cy * sD * ca) * 180 / M_PI;
5536 if (cc) cc->DoCanvasCOGSet();
5547 if (b_rotate || cc->m_bFollow) {
5548 cc->DoCanvasUpdate();
5557 FrameTenHzTimer.Start(100, wxTIMER_CONTINUOUS);
5560void MyFrame::ProcessQuitFlag() {
5563 wxLogMessage(_T(
"Got quitflag from SIGNAL"));
5565 FrameTenHzTimer.Stop();
5572void MyFrame::ProcessDeferredTrackOn() {
5575 if (g_bDeferredStartTrack) {
5576 if (!g_bTrackActive) {
5579 g_bDeferredStartTrack =
false;
5582 g_bDeferredStartTrack =
false;
5587void MyFrame::ProcessAnchorWatch() {
5590 if (pAnchorWatchPoint1) {
5593 DistanceBearingMercator(pAnchorWatchPoint1->m_lat,
5594 pAnchorWatchPoint1->m_lon, gLat, gLon, &brg, &dist);
5595 double d = g_nAWMax;
5596 (pAnchorWatchPoint1->GetName()).ToDouble(&d);
5597 d = AnchorDistFix(d, AnchorPointMinDist, g_nAWMax);
5598 bool toofar =
false;
5599 bool tooclose =
false;
5600 if (d >= 0.0) toofar = (dist * 1852. > d);
5601 if (d < 0.0) tooclose = (dist * 1852 < -d);
5603 if (tooclose || toofar)
5604 AnchorAlertOn1 =
true;
5606 AnchorAlertOn1 =
false;
5608 AnchorAlertOn1 =
false;
5610 if (pAnchorWatchPoint2) {
5613 DistanceBearingMercator(pAnchorWatchPoint2->m_lat,
5614 pAnchorWatchPoint2->m_lon, gLat, gLon, &brg, &dist);
5616 double d = g_nAWMax;
5617 (pAnchorWatchPoint2->GetName()).ToDouble(&d);
5618 d = AnchorDistFix(d, AnchorPointMinDist, g_nAWMax);
5619 bool toofar =
false;
5620 bool tooclose =
false;
5621 if (d >= 0) toofar = (dist * 1852. > d);
5622 if (d < 0) tooclose = (dist * 1852 < -d);
5624 if (tooclose || toofar)
5625 AnchorAlertOn2 =
true;
5627 AnchorAlertOn2 =
false;
5629 AnchorAlertOn2 =
false;
5631 if ((pAnchorWatchPoint1 || pAnchorWatchPoint2) && !bGPSValid)
5632 AnchorAlertOn1 =
true;
5635void MyFrame::SendFixToPlugins() {
5639 GPSData.
kLat = gLat;
5640 GPSData.
kLon = gLon;
5641 GPSData.
kCog = gCog;
5642 GPSData.
kSog = gSog;
5643 GPSData.
kVar = gVar;
5644 GPSData.
kHdm = gHdm;
5645 GPSData.
kHdt = gHdt;
5646 GPSData.
nSats = g_SatsInView;
5648 wxDateTime tCheck((time_t)m_fixtime);
5649 if (tCheck.IsValid()) {
5658 GPSData.
FixTime = wxDateTime::Now().GetTicks();
5661 SendPositionFixToAllPlugIns(&GPSData);
5665void MyFrame::ProcessLogAndBells() {
5668 wxDateTime lognow = wxDateTime::Now();
5669 int hourLOC = lognow.GetHour();
5670 int minuteLOC = lognow.GetMinute();
5672 int minuteUTC = lognow.GetMinute();
5673 int second = lognow.GetSecond();
5675 wxTimeSpan logspan = lognow.Subtract(g_loglast_time);
5676 if ((logspan.IsLongerThan(wxTimeSpan(0, 30, 0, 0))) || (minuteUTC == 0) ||
5677 (minuteUTC == 30)) {
5678 if (logspan.IsLongerThan(wxTimeSpan(0, 1, 0, 0))) {
5679 wxString day = lognow.FormatISODate();
5680 wxString utc = lognow.FormatISOTime();
5681 wxString navmsg = _T(
"LOGBOOK: ");
5685 navmsg += _T(
" UTC ");
5689 data.Printf(_T(
" GPS Lat %10.5f Lon %10.5f "), gLat, gLon);
5693 if (std::isnan(gCog))
5694 cog.Printf(_T(
"COG ----- "));
5696 cog.Printf(_T(
"COG %10.5f "), gCog);
5699 if (std::isnan(gSog))
5700 sog.Printf(_T(
"SOG ----- "));
5702 sog.Printf(_T(
"SOG %6.2f ") + getUsrSpeedUnit(), toUsrSpeed(gSog));
5708 data.Printf(_T(
" DR Lat %10.5f Lon %10.5f"), gLat, gLon);
5711 wxLogMessage(navmsg);
5712 g_loglast_time = lognow;
5714 int bells = (hourLOC % 4) * 2;
5715 if (minuteLOC != 0) bells++;
5716 if (!bells) bells = 8;
5718 if (g_bPlayShipsBells && ((minuteLOC == 0) || (minuteLOC == 30))) {
5719 m_BellsToPlay = bells;
5720 wxCommandEvent ev(BELLS_PLAYED_EVTYPE);
5721 wxPostEvent(
this, ev);
5727void MyFrame::OnFrameTimer1(wxTimerEvent &event) {
5728 CheckToolbarPosition();
5734 if (bDBUpdateInProgress)
return;
5737 FrameTenHzTimer.Stop();
5739 ProcessDeferredTrackOn();
5741 ProcessAnchorWatch();
5742 ProcessLogAndBells();
5744 if (ShouldRestartTrack()) TrackDailyRestart();
5747 if (g_bSleep && !AnchorAlertOn1 && !AnchorAlertOn2) {
5748 FrameTimer1.Start(TIMER_GFRAME_1, wxTIMER_CONTINUOUS);
5749 FrameTenHzTimer.Start(100, wxTIMER_CONTINUOUS);
5755 if (gSog > 3.0) g_bCruising =
true;
5761 wxString sogcog(_T(
"SOG --- ") + getUsrSpeedUnit() + +_T(
" ") +
5762 _T(
" COG ---\u00B0"));
5763 if (GetStatusBar()) SetStatusText(sogcog, STAT_FIELD_SOGCOG);
5769 bool bnew_view =
false;
5770 if (!g_btenhertz) bnew_view = DoChartUpdate();
5775 bool bactiveRouteUpdate =
RoutemanGui(*g_pRouteMan).UpdateProgress();
5778 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5781 cc->DrawBlinkObjects();
5784 if (bactiveRouteUpdate) {
5786 if (g_pRouteMan->GetpActiveRoute())
5787 cc->RefreshRect(g_blink_rect,
false);
5791 cc->SetOwnShipState(SHIP_NORMAL);
5793 if (cc->GetQuiltMode()) {
5794 double erf = cc->GetQuiltMaxErrorFactor();
5795 if (erf > 0.02) cc->SetOwnShipState(SHIP_LOWACCURACY);
5797 if (cc->m_singleChart) {
5798 if (cc->m_singleChart->GetChart_Error_Factor() > 0.02)
5799 cc->SetOwnShipState(SHIP_LOWACCURACY);
5803 if (!bGPSValid) cc->SetOwnShipState(SHIP_INVALID);
5805 if ((bGPSValid != m_last_bGPSValid) ||
5806 (bVelocityValid != m_last_bVelocityValid) ||
5807 (!isnan(gHdt) && (gHdt != m_last_hdt))) {
5808 if (!g_bopengl) cc->UpdateShips();
5815 m_last_bGPSValid = bGPSValid;
5816 m_last_bVelocityValid = bVelocityValid;
5821 bool brq_dynamic =
false;
5823 auto *pplugin_array = PluginLoader::GetInstance()->
GetPlugInArray();
5824 for (
unsigned int i = 0; i < pplugin_array->GetCount(); i++) {
5826 if (pic->m_enabled && pic->m_init_state) {
5827 if (pic->
m_cap_flag & WANTS_DYNAMIC_OPENGL_OVERLAY_CALLBACK) {
5834 if (brq_dynamic) bnew_view =
true;
5838 if (AnchorAlertOn1 || AnchorAlertOn2) bnew_view =
true;
5841 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5846 if (cc->GetglCanvas()) {
5848 bool b_rotate = cc->GetUpMode() != NORTH_UP_MODE;
5851 if (cc->m_bFollow) {
5852 cc->DoCanvasUpdate();
5859 if (std::isnan(gCog)) cc->Refresh(
false);
5872 if ((!cc->m_bFollow) || (cc->GetUpMode() != NORTH_UP_MODE)) {
5886 if (g_pais_query_dialog_active && g_pais_query_dialog_active->IsShown())
5887 g_pais_query_dialog_active->UpdateText();
5890 if (g_pAISTargetList && (0 == (g_tick % (5))))
5891 g_pAISTargetList->UpdateAISTargetList();
5894 UpdateGPSCompassStatusBoxes();
5897 if (console && console->IsShown()) {
5899 console->RefreshConsoleData();
5906 if (m_bdefer_resize) {
5907 if (0 == (g_tick % (5))) {
5908 printf(
"___RESIZE\n");
5909 SetSize(m_defer_size);
5910 g_pauimgr->Update();
5911 m_bdefer_resize =
false;
5919 if (((g_tick % g_FlushNavobjChangesTimeout) == 0) || g_FlushNavobjChanges) {
5920 if (pConfig && pConfig->IsChangesFileDirty()) {
5921 androidShowBusyIcon();
5922 wxStopWatch update_sw;
5923 pConfig->UpdateNavObj(
true);
5924 wxString msg = wxString::Format(
5925 _T(
"OpenCPN periodic navobj update took %ld ms."), update_sw.Time());
5927 qDebug() << msg.mb_str();
5928 g_FlushNavobjChanges =
false;
5929 androidHideBusyIcon();
5938 FrameTimer1.Start(TIMER_GFRAME_1 * 3, wxTIMER_CONTINUOUS);
5940 FrameTimer1.Start(TIMER_GFRAME_1, wxTIMER_CONTINUOUS);
5941 FrameTenHzTimer.Start(100, wxTIMER_CONTINUOUS);
5945double MyFrame::GetMag(
double a,
double lat,
double lon) {
5946 double Variance = std::isnan(gVar) ? g_UserVar : gVar;
5947 auto loader = PluginLoader::GetInstance();
5948 if (loader && loader->IsPlugInAvailable(_T(
"WMM"))) {
5955 wxDateTime now = wxDateTime::Now();
5956 SendJSON_WMM_Var_Request(lat, lon, now);
5957 if (fabs(gQueryVar) < 360.0)
5958 Variance = gQueryVar;
5960 return toMagnetic(a, Variance);
5963bool MyFrame::SendJSON_WMM_Var_Request(
double lat,
double lon,
5969 v[_T(
"Year")] = date.GetYear();
5970 v[_T(
"Month")] = date.GetMonth();
5971 v[_T(
"Day")] = date.GetDay();
5973 SendJSONMessageToAllPlugins(_T(
"WMM_VARIATION_REQUEST"), v);
5979void MyFrame::TouchAISActive(
void) {
5981 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5983 if (cc) cc->TouchAISToolActive();
5987void MyFrame::UpdateAISTool(
void) {
5988 if (!g_pAIS)
return;
5991 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5993 if (cc) cc->UpdateAISTBTool();
5998void MyFrame::OnFrameTCTimer(wxTimerEvent &event) {
6000 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6002 if (cc) cc->SetbTCUpdate(
true);
6005 RefreshAllCanvas(
false);
6010void MyFrame::OnFrameCOGTimer(wxTimerEvent &event) {
6014 bool b_rotate =
false;
6015 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6017 if (cc) b_rotate |= (cc->GetUpMode() != NORTH_UP_MODE);
6021 FrameCOGTimer.Stop();
6028 int period_ms = 100;
6030 FrameCOGTimer.Start(period_ms, wxTIMER_CONTINUOUS);
6033void MyFrame::DoCOGSet(
void) {
6035 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6037 if (cc) cc->DoCanvasCOGSet();
6041void RenderShadowText(wxDC *pdc, wxFont *pFont, wxString &str,
int x,
int y) {
6047 wxFont oldfont = pdc->GetFont();
6049 pdc->SetFont(*pFont);
6050 pdc->SetTextForeground(GetGlobalColor(_T(
"CHGRF")));
6051 pdc->SetBackgroundMode(wxTRANSPARENT);
6053 pdc->DrawText(str, x, y + 1);
6054 pdc->DrawText(str, x, y - 1);
6055 pdc->DrawText(str, x + 1, y);
6056 pdc->DrawText(str, x - 1, y);
6058 pdc->SetTextForeground(GetGlobalColor(_T(
"CHBLK")));
6060 pdc->DrawText(str, x, y);
6062 pdc->SetFont(oldfont);
6066void MyFrame::UpdateRotationState(
double rotation) {
6068 g_bCourseUp =
false;
6070 if (fabs(rotation) > .001) {
6071 SetMenubarItemState(ID_MENU_CHART_COGUP,
false);
6072 SetMenubarItemState(ID_MENU_CHART_NORTHUP,
true);
6074 m_pMenuBar->SetLabel(ID_MENU_CHART_NORTHUP, _(
"Rotated Mode"));
6077 SetMenubarItemState(ID_MENU_CHART_COGUP, g_bCourseUp);
6078 SetMenubarItemState(ID_MENU_CHART_NORTHUP, !g_bCourseUp);
6080 m_pMenuBar->SetLabel(ID_MENU_CHART_NORTHUP, _(
"North Up Mode"));
6084 UpdateGPSCompassStatusBoxes(
true);
6088void MyFrame::UpdateGPSCompassStatusBoxes(
bool b_force_new) {
6090 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6092 if (cc) cc->UpdateGPSCompassStatusBox(b_force_new);
6098int MyFrame::GetApplicationMemoryUse(
void) {
6104 wxWindow *fWin = wxWindow::FindFocus();
6106 wxArrayString outputArray;
6107 wxString cmd(_T(
"ps --no-headers -o vsize "));
6108 unsigned long pid = wxGetProcessId();
6110 cmd1.Printf(_T(
"%ld"), pid);
6112 wxExecute(cmd, outputArray);
6114 if (outputArray.GetCount()) {
6115 wxString s = outputArray.Item(0);
6117 if (s.ToLong(&vtmp)) memsize = vtmp;
6120 if (fWin) fWin->SetFocus();
6126 PROCESS_MEMORY_COUNTERS pmc;
6128 unsigned long processID = wxGetProcessId();
6130 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,
6132 if (NULL == hProcess)
return 0;
6134 if (GetProcessMemoryInfo(hProcess, &pmc,
sizeof(pmc))) {
6152 memsize = pmc.WorkingSetSize / 1024;
6155 CloseHandle(hProcess);
6162double MyFrame::GetBestVPScale(
ChartBase *pchart) {
6163 return GetPrimaryCanvas()->GetBestVPScale(pchart);
6166void MyFrame::SetChartUpdatePeriod() {
6169 g_ChartUpdatePeriod = 0;
6174 bool bskewdc =
false;
6175 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6178 if (!g_bopengl && !cc->GetVP().b_quilt) {
6179 if (fabs(cc->GetVP().
skew) > 0.0001) bskewdc =
true;
6181 if (cc->m_bFollow) g_ChartUpdatePeriod = 1;
6185 if (bskewdc) g_ChartUpdatePeriod = g_SkewCompUpdatePeriod;
6187 m_ChartUpdatePeriod = g_ChartUpdatePeriod;
6192 cc->UpdateCanvasControlBar();
6195void MyFrame::selectChartDisplay(
int type,
int family) {
6197 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6199 if (cc) cc->selectCanvasChartDisplay(type, family);
6202 UpdateGlobalMenuItems();
6211bool MyFrame::DoChartUpdate(
void) {
6212 bool return_val =
false;
6215 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6217 if (cc) return_val |= cc->DoCanvasUpdate();
6223void MyFrame::MouseEvent(wxMouseEvent &event) {
6225 event.GetPosition(&x, &y);
6230#include <mach/mach.h>
6231#include <mach/message.h>
6232#include <mach/kern_return.h>
6233#include <mach/task_info.h>
6235#include <malloc/malloc.h>
6242#if defined(__linux__)
6243#include "sys/types.h"
6244#include "sys/sysinfo.h"
6247int g_lastMemTick = -1;
6251bool GetMemoryStatus(
int *mem_total,
int *mem_used) {
6253 return androidGetMemoryStatus(mem_total, mem_used);
6256#if defined(__linux__)
6260 struct sysinfo sys_info;
6261 if (sysinfo(&sys_info) != -1)
6262 *mem_total = ((uint64_t)sys_info.totalram * sys_info.mem_unit) / 1024;
6276 FILE *file = fopen(
"/proc/self/statm",
"r");
6278 if (fscanf(file,
"%d", mem_used) != 1) {
6279 wxLogWarning(
"Cannot parse /proc/self/statm (!)");
6292 PROCESS_MEMORY_COUNTERS pmc;
6294 unsigned long processID = wxGetProcessId();
6297 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,
6300 if (hProcess && GetProcessMemoryInfo(hProcess, &pmc,
sizeof(pmc))) {
6318 *mem_used = pmc.WorkingSetSize / 1024;
6321 CloseHandle(hProcess);
6325 MEMORYSTATUSEX statex;
6327 statex.dwLength =
sizeof(statex);
6329 GlobalMemoryStatusEx(&statex);
6347 *mem_total = statex.ullTotalPhys / 1024;
6354 if (g_tick != g_lastMemTick) {
6355 malloc_zone_pressure_relief(NULL, 0);
6358 int blocksInUse = 0;
6359 int sizeAllocated = 0;
6361 malloc_statistics_t stats;
6362 stats.blocks_in_use = 0;
6363 stats.size_in_use = 0;
6364 stats.max_size_in_use = 0;
6365 stats.size_allocated = 0;
6366 malloc_zone_statistics(NULL, &stats);
6367 bytesInUse += stats.size_in_use;
6368 blocksInUse += stats.blocks_in_use;
6369 sizeAllocated += stats.size_allocated;
6371 g_memUsed = sizeAllocated >> 10;
6374 g_lastMemTick = g_tick;
6377 if (mem_used) *mem_used = g_memUsed;
6380 FILE *fpIn = popen(
"sysctl -n hw.memsize",
"r");
6382 double pagesUsed = 0.0, totalPages = 0.0;
6384 if (fgets(buf,
sizeof(buf), fpIn) != NULL) {
6385 *mem_total = atol(buf) >> 10;
6393 if (mem_used) *mem_used = 0;
6394 if (mem_total) *mem_total = 0;
6398void MyFrame::DoPrint(
void) {
6400 g_PrintingInProgress =
true;
6403 GetPrimaryCanvas()->GetglCanvas()->Render();
6404 GetPrimaryCanvas()->GetglCanvas()->SwapBuffers();
6414 printer.Initialize(wxLANDSCAPE);
6415 printer.EnablePageNumbers(
false);
6416 printer.Print(
this, &printout);
6434 g_PrintingInProgress =
false;
6437 GetPrimaryCanvas()->SetFocus();
6442wxDateTime gTimeSource;
6445 wxString message_ID =
event.GetID();
6446 wxString message_JSONText =
event.GetJSONText();
6454 if (message_ID == _T(
"WMM_VARIATION_BOAT")) {
6462 int numErrors = reader.
Parse(message_JSONText, &root);
6463 if (numErrors > 0) {
6469 wxString decl = root[_T(
"Decl")].
AsString();
6471 decl.ToDouble(&decl_val);
6477 if (message_ID == _T(
"WMM_VARIATION")) {
6485 int numErrors = reader.
Parse(message_JSONText, &root);
6486 if (numErrors > 0) {
6492 wxString decl = root[_T(
"Decl")].
AsString();
6494 decl.ToDouble(&decl_val);
6496 gQueryVar = decl_val;
6499 if (message_ID == _T(
"GRIB_TIMELINE")) {
6502 r.
Parse(message_JSONText, &v);
6503 if (v[_T(
"Day")].AsInt() == -1)
6504 gTimeSource = wxInvalidDateTime;
6506 gTimeSource.Set(v[_T(
"Day")].AsInt(),
6507 (wxDateTime::Month)v[_T(
"Month")].AsInt(),
6508 v[_T(
"Year")].AsInt(), v[_T(
"Hour")].AsInt(),
6509 v[_T(
"Minute")].AsInt(), v[_T(
"Second")].AsInt());
6511 if (message_ID == _T(
"OCPN_TRACK_REQUEST")) {
6514 wxString trk_id = wxEmptyString;
6516 int numErrors = reader.
Parse(message_JSONText, &root);
6517 if (numErrors > 0)
return;
6520 trk_id = root[_T(
"Track_ID")].
AsString();
6523 v[_T(
"Track_ID")] = trk_id;
6524 for (
Track *ptrack : g_TrackList) {
6525 wxString name = wxEmptyString;
6526 if (ptrack->m_GUID == trk_id) {
6527 name = ptrack->GetName();
6528 if (name.IsEmpty()) {
6534 name = _(
"(Unnamed Track)");
6540 v[_T(
"error")] =
false;
6541 v[_T(
"TotalNodes")] = ptrack->GetnPoints();
6542 for (
int j = 0; j < ptrack->GetnPoints(); j++) {
6544 v[_T(
"lat")] = tp->m_lat;
6545 v[_T(
"lon")] = tp->m_lon;
6546 v[_T(
"NodeNr")] = i;
6548 wxString msg_id(_T(
"OCPN_TRACKPOINTS_COORDS"));
6549 SendJSONMessageToAllPlugins(msg_id, v);
6553 v[_T(
"error")] =
true;
6555 wxString msg_id(_T(
"OCPN_TRACKPOINTS_COORDS"));
6556 SendJSONMessageToAllPlugins(msg_id, v);
6558 }
else if (message_ID == _T(
"OCPN_ROUTE_REQUEST")) {
6561 wxString guid = wxEmptyString;
6563 int numErrors = reader.
Parse(message_JSONText, &root);
6564 if (numErrors > 0) {
6571 v[_T(
"GUID")] = guid;
6572 for (RouteList::iterator it = pRouteList->begin(); it != pRouteList->end();
6574 wxString name = wxEmptyString;
6576 if ((*it)->m_GUID == guid) {
6577 name = (*it)->m_RouteNameString;
6578 if (name.IsEmpty()) name = _(
"(Unnamed Route)");
6580 v[_T(
"Name")] = name;
6581 v[_T(
"error")] =
false;
6584 for (RoutePointList::iterator itp = (*it)->pRoutePointList->begin();
6585 itp != (*it)->pRoutePointList->end(); itp++) {
6586 w[i][_T(
"lat")] = (*itp)->m_lat;
6587 w[i][_T(
"lon")] = (*itp)->m_lon;
6588 w[i][_T(
"Name")] = (*itp)->GetName();
6589 w[i][_T(
"Description")] = (*itp)->GetDescription();
6590 w[i][_T(
"GUID")] = (*itp)->m_GUID;
6591 w[i][_T(
"ArrivalRadius")] = (*itp)->GetWaypointArrivalRadius();
6592 wxHyperlinkListNode *node = (*itp)->m_HyperlinkList->GetFirst();
6597 v[i][_T(
"WPLink") + wxString::Format(_T(
"%d"), n)] =
6599 v[i][_T(
"WPLinkDesciption") + wxString::Format(_T(
"%d"), n++)] =
6600 httpLink->DescrText;
6601 node = node->GetNext();
6606 v[_T(
"waypoints")] = w;
6607 wxString msg_id(_T(
"OCPN_ROUTE_RESPONSE"));
6608 SendJSONMessageToAllPlugins(msg_id, v);
6613 v[_T(
"error")] =
true;
6615 wxString msg_id(_T(
"OCPN_ROUTE_RESPONSE"));
6616 SendJSONMessageToAllPlugins(msg_id, v);
6617 }
else if (message_ID == _T(
"OCPN_ROUTELIST_REQUEST")) {
6622 int numErrors = reader.
Parse(message_JSONText, &root);
6623 if (numErrors > 0)
return;
6626 wxString str = root[_T(
"mode")].
AsString();
6627 if (str == _T(
"Track")) route =
false;
6632 for (RouteList::iterator it = pRouteList->begin();
6633 it != pRouteList->end(); it++) {
6634 wxString name = (*it)->m_RouteNameString;
6635 if (name.IsEmpty()) name = _(
"(Unnamed Route)");
6637 v[i][_T(
"error")] =
false;
6638 v[i][_T(
"name")] = name;
6639 v[i][_T(
"GUID")] = (*it)->m_GUID;
6640 v[i][_T(
"active")] = (*it)->IsActive();
6644 for (
Track *ptrack : g_TrackList) {
6645 wxString name = ptrack->GetName();
6646 if (name.IsEmpty()) {
6652 name = _(
"(Unnamed Track)");
6654 v[i][_T(
"error")] =
false;
6655 v[i][_T(
"name")] = name;
6656 v[i][_T(
"GUID")] = ptrack->m_GUID;
6657 v[i][_T(
"active")] = g_pActiveTrack == ptrack;
6661 wxString msg_id(_T(
"OCPN_ROUTELIST_RESPONSE"));
6662 SendJSONMessageToAllPlugins(msg_id, v);
6665 v[0][_T(
"error")] =
true;
6666 wxString msg_id(_T(
"OCPN_ROUTELIST_RESPONSE"));
6667 SendJSONMessageToAllPlugins(msg_id, v);
6669 }
else if (message_ID == _T(
"OCPN_ACTIVE_ROUTELEG_REQUEST")) {
6671 v[0][_T(
"error")] =
true;
6672 if (g_pRouteMan->GetpActiveRoute()) {
6673 if (g_pRouteMan->m_bDataValid) {
6674 v[0][_T(
"error")] =
false;
6675 v[0][_T(
"range")] = g_pRouteMan->GetCurrentRngToActivePoint();
6676 v[0][_T(
"bearing")] = g_pRouteMan->GetCurrentBrgToActivePoint();
6677 v[0][_T(
"XTE")] = g_pRouteMan->GetCurrentXTEToActivePoint();
6678 v[0][_T(
"active_route_GUID")] =
6679 g_pRouteMan->GetpActiveRoute()->GetGUID();
6680 v[0][_T(
"active_waypoint_lat")] =
6682 v[0][_T(
"active_waypoint_lon")] =
6686 wxString msg_id(_T(
"OCPN_ACTIVE_ROUTELEG_RESPONSE"));
6687 SendJSONMessageToAllPlugins(msg_id, v);
6691void MyFrame::FilterCogSog(
void) {
6692 if (g_bfilter_cogsog && !g_own_ship_sog_cog_calc) {
6694 double cog_last = gCog;
6697 for (
int i = g_COGFilterSec - 1; i > 0; i--)
6698 COGFilterTable[i] = COGFilterTable[i - 1];
6699 COGFilterTable[0] = cog_last;
6702 if (!std::isnan(cog_last)) {
6704 double sum = 0., count = 0;
6705 for (
int i = 0; i < g_COGFilterSec; i++) {
6706 double adder = COGFilterTable[i];
6707 if (std::isnan(adder))
continue;
6709 if (fabs(adder - cog_last) > 180.) {
6710 if ((adder - cog_last) > 0.)
6723 else if (sum >= 360.)
6730 double sog_last = gSog;
6733 for (
int i = g_SOGFilterSec - 1; i > 0; i--)
6734 SOGFilterTable[i] = SOGFilterTable[i - 1];
6735 SOGFilterTable[0] = sog_last;
6738 if (!std::isnan(gSog)) {
6739 double sum = 0., count = 0;
6740 for (
int i = 0; i < g_SOGFilterSec; i++) {
6741 if (std::isnan(SOGFilterTable[i]))
continue;
6743 sum += SOGFilterTable[i];
6753void MyFrame::LoadHarmonics() {
6756 ptcmgr->LoadDataSources(TideCurrentDataSet);
6758 bool b_newdataset =
false;
6761 for (
auto a : ptcmgr->GetDataSet()) {
6762 bool b_foundi =
false;
6763 for (
auto b : TideCurrentDataSet) {
6770 b_newdataset =
true;
6775 for (
auto a : TideCurrentDataSet) {
6776 bool b_foundi =
false;
6777 for (
auto b : ptcmgr->GetDataSet()) {
6784 b_newdataset =
true;
6789 if (b_newdataset) ptcmgr->LoadDataSources(TideCurrentDataSet);
6793void MyFrame::ActivateAISMOBRoute(
const AisTargetData *ptarget) {
6794 if (!ptarget)
return;
6797 wxDateTime mob_time = wxDateTime::Now();
6798 wxString mob_label(_(
"AIS MAN OVERBOARD"));
6799 mob_label += _(
" on ");
6800 mob_label += ocpn::toUsrDateTimeFormat(mob_time);
6803 mob_label, wxEmptyString);
6804 pWP_MOB->SetShared(
true);
6806 pSelect->AddSelectableRoutePoint(ptarget->Lat, ptarget->Lon, pWP_MOB);
6807 pConfig->AddNewWayPoint(pWP_MOB, -1);
6808 pWP_MOB->SetUseSca(
false);
6816 wxString(_(
"Own ship")), wxEmptyString);
6817 pSelect->AddSelectableRoutePoint(gLat, gLon, pWP_src);
6818 pWP_MOB->SetUseSca(
false);
6819 pAISMOBRoute =
new Route();
6820 pRouteList->Append(pAISMOBRoute);
6822 pAISMOBRoute->AddPoint(pWP_src);
6823 pAISMOBRoute->AddPoint(pWP_MOB);
6825 pSelect->AddSelectableRouteSegment(ptarget->Lat, ptarget->Lon, gLat, gLon,
6826 pWP_src, pWP_MOB, pAISMOBRoute);
6834 pAISMOBRoute->SetRouteArrivalRadius(-1.0);
6836 if (g_pRouteMan->GetpActiveRoute()) g_pRouteMan->DeactivateRoute();
6840 v[_T(
"GUID")] = pAISMOBRoute->
m_GUID;
6841 wxString msg_id(_T(
"OCPN_MAN_OVERBOARD"));
6842 SendJSONMessageToAllPlugins(msg_id, v);
6845 if (RouteManagerDialog::getInstanceFlag()) {
6846 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
6847 pRouteManagerDialog->UpdateRouteListCtrl();
6848 pRouteManagerDialog->UpdateWptListCtrl();
6852 RefreshAllCanvas(
false);
6854 wxString mob_message(_(
"AIS MAN OVERBOARD"));
6855 mob_message += _(
" Time: ");
6856 mob_message += ocpn::toUsrDateTimeFormat(mob_time);
6857 mob_message += _(
" Ownship Position: ");
6858 mob_message += toSDMM(1, gLat);
6859 mob_message += _T(
" ");
6860 mob_message += toSDMM(2, gLon);
6861 mob_message += _(
" MOB Position: ");
6862 mob_message += toSDMM(1, ptarget->Lat);
6863 mob_message += _T(
" ");
6864 mob_message += toSDMM(2, ptarget->Lon);
6865 wxLogMessage(mob_message);
6868void MyFrame::UpdateAISMOBRoute(
const AisTargetData *ptarget) {
6869 if (pAISMOBRoute && ptarget) {
6871 RoutePoint *OwnPoint = pAISMOBRoute->GetPoint(1);
6872 OwnPoint->m_lat = gLat;
6873 OwnPoint->m_lon = gLon;
6875 pSelect->DeleteSelectableRoutePoint(OwnPoint);
6876 pSelect->AddSelectableRoutePoint(gLat, gLon, OwnPoint);
6879 RoutePoint *MOB_Point = pAISMOBRoute->GetPoint(2);
6880 MOB_Point->m_lat = ptarget->Lat;
6881 MOB_Point->m_lon = ptarget->Lon;
6883 pSelect->DeleteSelectableRoutePoint(MOB_Point);
6884 pSelect->AddSelectableRoutePoint(ptarget->Lat, ptarget->Lon, MOB_Point);
6886 pSelect->UpdateSelectableRouteSegments(OwnPoint);
6887 pSelect->UpdateSelectableRouteSegments(MOB_Point);
6890 RefreshAllCanvas(
false);
6893 wxDateTime mob_time = wxDateTime::Now();
6895 wxString mob_message(_(
"AIS MAN OVERBOARD UPDATE"));
6896 mob_message += _(
" Time: ");
6897 mob_message += ocpn::toUsrDateTimeFormat(mob_time);
6898 mob_message += _(
" Ownship Position: ");
6899 mob_message += toSDMM(1, gLat);
6900 mob_message += _T(
" ");
6901 mob_message += toSDMM(2, gLon);
6902 mob_message += _(
" MOB Position: ");
6903 mob_message += toSDMM(1, ptarget->Lat);
6904 mob_message += _T(
" ");
6905 mob_message += toSDMM(2, ptarget->Lon);
6907 wxLogMessage(mob_message);
6911void MyFrame::applySettingsString(wxString settings) {
6913 int last_UIScaleFactor = g_GUIScaleFactor;
6914 bool previous_expert = g_bUIexpert;
6915 g_last_ChartScaleFactor = g_ChartScaleFactor;
6916 ArrayOfCDI *pNewDirArray =
new ArrayOfCDI;
6919 g_Platform->platformApplyPrivateSettingsString(settings, pNewDirArray);
6922 pConfig->UpdateSettings();
6925 if (g_last_ChartScaleFactor != g_ChartScaleFactor) rr |= S52_CHANGED;
6927 if (rr & S52_CHANGED) {
6929 ps52plib->FlushSymbolCaches(ChartCtxFactory());
6931 ->ClearCNSYLUPArray();
6932 ps52plib->GenerateStateHash();
6936 ProcessOptionsDialog(rr, pNewDirArray);
6941 bool b_newToolbar =
false;
6943 if (g_GUIScaleFactor != last_UIScaleFactor) b_newToolbar =
true;
6945 if (previous_expert != g_bUIexpert) b_newToolbar =
true;
6947 if (rr & TOOLBAR_CHANGED) {
6948 b_newToolbar =
true;
6953 if (previous_expert && !g_bUIexpert) {
6954 androidForceFullRepaint();
6958 if (previous_expert != g_bUIexpert) g_Platform->applyExpertMode(g_bUIexpert);
6962 SetGPSCompassScale();
6964 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6966 if (cc) cc->GetCompass()->SetScaleFactor(g_compass_scalefactor);
6968 UpdateGPSCompassStatusBoxes(
true);
6971 AbstractPlatform::ShowBusySpinner();
6973 SetAllToolbarScale();
6977 AbstractPlatform::HideBusySpinner();
6979 RequestNewMasterToolbar(
true);
6986 UpdateControlBar(GetPrimaryCanvas());
6989 if (console) console->Raise();
6992 if (m_data_monitor->
IsVisible()) m_data_monitor->Raise();
6995#ifdef wxHAS_POWER_EVENTS
6996void MyFrame::OnSuspending(wxPowerEvent &event) {
7000 wxLogMessage(_T(
"System suspend starting..."));
7003void MyFrame::OnSuspended(wxPowerEvent &WXUNUSED(event)) {
7006 wxLogMessage(_T(
"System is going to suspend."));
7009void MyFrame::OnSuspendCancel(wxPowerEvent &WXUNUSED(event)) {
7012 wxLogMessage(_T(
"System suspend was cancelled."));
7015int g_last_resume_ticks;
7016void MyFrame::OnResume(wxPowerEvent &WXUNUSED(event)) {
7017 wxDateTime now = wxDateTime::Now();
7018 wxLogMessage(_T(
"System resumed from suspend."));
7020 if ((now.GetTicks() - g_last_resume_ticks) > 5) {
7023 wxLogMessage(
"Restarting streams.");
7024 g_last_resume_ticks = now.GetTicks();
7028 g_pMUX->ClearStreams();
7030 g_pMUX->StartAllStreams();
7039 if (IsMaximized()) {
7044 wxSize sz = GetSize();
7045 SetSize(wxSize(sz.x - 1, sz.y));
7057void MyFrame::RequestNewMasterToolbar(
bool bforcenew) {
7058 bool btbRebuild =
false;
7060 bool b_reshow =
true;
7061 if (g_MainToolbar) {
7063 float ff = fabs(g_MainToolbar->GetScaleFactor() - g_toolbar_scalefactor);
7064 if ((ff > 0.01f) || bforcenew) {
7065 g_MainToolbar->DestroyToolBar();
7066 delete g_MainToolbar;
7067 g_MainToolbar = NULL;
7073 if (!g_MainToolbar) {
7074 long orient = g_Platform->GetDefaultToolbarOrientation();
7075 wxWindow *toolbarParent =
this;
7077 toolbarParent = GetPrimaryCanvas();
7080 toolbarParent, wxPoint(-1, -1), orient, g_toolbar_scalefactor);
7081 g_MainToolbar->SetBackGroundColorString(_T(
"GREY3"));
7082 g_MainToolbar->SetToolbarHideMethod(TOOLBAR_HIDE_TO_FIRST_TOOL);
7083 g_MainToolbar->SetToolConfigString(g_toolbarConfig);
7084 g_MainToolbar->EnableRolloverBitmaps(
false);
7086 g_MainToolbar->CreateConfigMenu();
7087 g_MainToolbar->SetDefaultPosition();
7089 g_bmasterToolbarFull =
true;
7092 if (g_MainToolbar) {
7093 CreateMasterToolbar();
7097 g_MainToolbar->SetColorScheme(global_color_scheme);
7103 g_MainToolbar->SetAutoHide(g_bAutoHideToolbar);
7104 g_MainToolbar->SetAutoHideTimer(g_nAutoHideToolbar);
7108bool MyFrame::CollapseGlobalToolbar() {
7109 if (g_MainToolbar) {
7110 m_nMasterToolCountShown = 1;
7111 g_MainToolbar->SetToolShowCount(m_nMasterToolCountShown);
7112 g_MainToolbar->GetToolbar()->InvalidateBitmaps();
7113 g_MainToolbar->Realize();
7114 g_bmasterToolbarFull =
false;
7123 if (g_MainToolbar) tb = g_MainToolbar->GetToolbar();
7130 ID_MASTERTOGGLE, style->GetToolIcon(_T(
"MUI_menu"), TOOLICON_NORMAL),
7131 wxITEM_NORMAL, _(
"Hide Toolbar"), _T(
"MUI_menu"));
7132 tic->m_bRequired =
true;
7134 g_MainToolbar->AddToolItem(tic);
7137 ID_SETTINGS, style->GetToolIcon(_T(
"MUI_settings"), TOOLICON_NORMAL),
7138 wxITEM_NORMAL, _(
"Options"), _T(
"MUI_settings"));
7139 g_MainToolbar->AddToolItem(tic);
7142 ID_MENU_ROUTE_NEW, style->GetToolIcon(_T(
"MUI_route"), TOOLICON_NORMAL),
7143 style->GetToolIcon(_T(
"MUI_route"), TOOLICON_TOGGLED), wxITEM_CHECK,
7144 wxString(_(
"Create Route")) << _T(
" (Ctrl-R)"), _T(
"MUI_route"));
7146 g_MainToolbar->AddToolItem(tic);
7149 ID_ROUTEMANAGER, style->GetToolIcon(_T(
"MUI_RMD"), TOOLICON_NORMAL),
7150 wxITEM_NORMAL, _(
"Route & Mark Manager"), _T(
"MUI_RMD"));
7151 g_MainToolbar->AddToolItem(tic);
7154 ID_TRACK, style->GetToolIcon(_T(
"MUI_track"), TOOLICON_NORMAL),
7155 style->GetToolIcon(_T(
"MUI_track"), TOOLICON_TOGGLED), wxITEM_CHECK,
7156 _(
"Enable Tracking"), _T(
"MUI_track"));
7157 g_MainToolbar->AddToolItem(tic);
7160 ID_COLSCHEME, style->GetToolIcon(_T(
"MUI_colorscheme"), TOOLICON_NORMAL),
7161 wxITEM_NORMAL, _(
"Change Color Scheme"), _T(
"MUI_colorscheme"));
7162 g_MainToolbar->AddToolItem(tic);
7173 ID_PRINT, style->GetToolIcon(_T(
"MUI_print"), TOOLICON_NORMAL),
7174 wxITEM_NORMAL, _(
"Print Chart"), _T(
"MUI_print"));
7175 g_MainToolbar->AddToolItem(tic);
7178 ID_ABOUT, style->GetToolIcon(_T(
"MUI_help"), TOOLICON_NORMAL),
7179 wxITEM_NORMAL, _(
"About OpenCPN"), _T(
"MUI_help"));
7180 g_MainToolbar->AddToolItem(tic);
7183 AddDefaultPositionPlugInTools();
7187 ID_MOB, style->GetToolIcon(_T(
"mob_btn"), TOOLICON_NORMAL), wxITEM_NORMAL,
7188 wxString(_(
"Drop MOB Marker")) << _(
" (Ctrl-Space)"), _T(
"mob_btn"));
7189 g_MainToolbar->AddToolItem(tic);
7192 g_MainToolbar->RebuildToolbar();
7196 g_MainToolbar->Realize();
7199 ArrayOfPlugInToolbarTools tool_array =
7200 g_pi_manager->GetPluginToolbarToolArray();
7201 for (
unsigned int i = 0; i < tool_array.GetCount(); i++) {
7203 if (!pttc->b_viz)
continue;
7205 if (pttc->kind == wxITEM_CHECK) tb->ToggleTool(pttc->id, pttc->b_toggle);
7208 SetMasterToolbarItemState(ID_TRACK, g_bTrackActive);
7209 if (g_bTrackActive) {
7210 g_MainToolbar->SetToolShortHelp(ID_TRACK, _(
"Disable Tracking"));
7212 g_MainToolbar->Realize();
7217bool MyFrame::CheckAndAddPlugInTool() {
7218 if (!g_pi_manager)
return false;
7223 if (g_MainToolbar) tb = g_MainToolbar->GetToolbar();
7225 if (!tb)
return false;
7227 int n_tools = tb->GetToolsCount();
7231 ArrayOfPlugInToolbarTools tool_array =
7232 g_pi_manager->GetPluginToolbarToolArray();
7234 for (
unsigned int i = 0; i < tool_array.GetCount(); i++) {
7236 if (pttc->position == n_tools) {
7237 wxBitmap *ptool_bmp;
7239 switch (global_color_scheme) {
7240 case GLOBAL_COLOR_SCHEME_DAY:
7241 ptool_bmp = pttc->bitmap_day;
7244 case GLOBAL_COLOR_SCHEME_DUSK:
7245 ptool_bmp = pttc->bitmap_dusk;
7247 case GLOBAL_COLOR_SCHEME_NIGHT:
7248 ptool_bmp = pttc->bitmap_night;
7251 ptool_bmp = pttc->bitmap_day;
7256 pttc->id, *(ptool_bmp), pttc->kind, pttc->shortHelp, _T(
""));
7258 tic->m_NormalIconSVG = pttc->pluginNormalIconSVG;
7259 tic->m_RolloverIconSVG = pttc->pluginRolloverIconSVG;
7260 tic->m_ToggledIconSVG = pttc->pluginToggledIconSVG;
7261 tic->m_bPlugin =
true;
7270 while (CheckAndAddPlugInTool()) {
7276bool MyFrame::AddDefaultPositionPlugInTools() {
7277 if (!g_pi_manager)
return false;
7283 ArrayOfPlugInToolbarTools tool_array =
7284 g_pi_manager->GetPluginToolbarToolArray();
7286 for (
unsigned int i = 0; i < tool_array.GetCount(); i++) {
7290 if (!pttc->b_viz)
continue;
7292 if (pttc->position == -1)
7294 wxBitmap *ptool_bmp;
7296 switch (global_color_scheme) {
7297 case GLOBAL_COLOR_SCHEME_DAY:
7298 ptool_bmp = pttc->bitmap_day;
7300 case GLOBAL_COLOR_SCHEME_DUSK:
7301 ptool_bmp = pttc->bitmap_dusk;
7303 case GLOBAL_COLOR_SCHEME_NIGHT:
7304 ptool_bmp = pttc->bitmap_night;
7307 ptool_bmp = pttc->bitmap_day;
7312 pttc->id, *(ptool_bmp), pttc->kind, pttc->shortHelp, _T(
""));
7314 tic->m_NormalIconSVG = pttc->pluginNormalIconSVG;
7315 tic->m_RolloverIconSVG = pttc->pluginRolloverIconSVG;
7316 tic->m_ToggledIconSVG = pttc->pluginToggledIconSVG;
7317 tic->m_bPlugin =
true;
7319 g_MainToolbar->AddToolItem(tic);
7332wxColour GetGlobalColor(wxString colorName);
7334static const char *usercolors[] = {
7335 "Table:DAY",
"GREEN1;120;255;120;",
"GREEN2; 45;150; 45;",
7336 "GREEN3;200;220;200;",
"GREEN4; 0;255; 0;",
"BLUE1; 170;170;255;",
7337 "BLUE2; 45; 45;170;",
"BLUE3; 0; 0;255;",
"GREY1; 200;200;200;",
7338 "GREY2; 230;230;230;",
"RED1; 220;200;200;",
"UBLCK; 0; 0; 0;",
7339 "UWHIT; 255;255;255;",
"URED; 255; 0; 0;",
"UGREN; 0;255; 0;",
7340 "YELO1; 243;229; 47;",
"YELO2; 128; 80; 0;",
"TEAL1; 0;128;128;",
7341 "GREEN5;170;254; 0;",
"COMPT; 245;247;244",
7343 "DILG0; 255;255;255;",
7345 "DILG0; 238;239;242;",
7347 "DILG1; 212;208;200;",
7348 "DILG2; 255;255;255;",
7352 "CHGRF; 163; 180; 183;",
"UINFM; 197; 69; 195;",
"UINFG; 104; 228; 86;",
7353 "UINFF; 125; 137; 140;",
"UINFR; 241; 84; 105;",
"SHIPS; 7; 7; 7;",
7354 "CHYLW; 244; 218; 72;",
"CHWHT; 212; 234; 238;",
7356 "UDKRD; 124; 16; 0;",
7357 "UARTE; 200; 0; 0;",
7359 "NODTA; 163; 180; 183;",
"CHBLK; 7; 7; 7;",
"SNDG1; 125; 137; 140;",
7360 "SNDG2; 7; 7; 7;",
"SCLBR; 235; 125; 54;",
"UIBDR; 125; 137; 140;",
7361 "UINFB; 58; 120; 240;",
"UINFD; 7; 7; 7;",
"UINFO; 235; 125; 54;",
7362 "PLRTE; 220; 64; 37;",
"CHMGD; 197; 69; 195;",
"UIBCK; 212; 234; 238;",
7364 "DASHB; 255;255;255;",
7365 "DASHL; 175;175;175;",
7366 "DASHF; 50; 50; 50;",
7367 "DASHR; 200; 0; 0;",
7369 "DASHN; 200;120; 0;",
7370 "DASH1; 204;204;255;",
7371 "DASH2; 122;131;172;",
7372 "COMP1; 211;211;211;",
7374 "GREY3; 40; 40; 40;",
7375 "BLUE4; 100;100;200;",
7376 "VIO01; 171; 33;141;",
"VIO02; 209;115;213;",
7377 "BLUEBACK; 212;234;238;",
7378 "LANDBACK; 201;185;122;",
7381 "Table:DUSK",
"GREEN1; 60;128; 60;",
"GREEN2; 22; 75; 22;",
7382 "GREEN3; 80;100; 80;",
"GREEN4; 0;128; 0;",
"BLUE1; 80; 80;160;",
7383 "BLUE2; 30; 30;120;",
"BLUE3; 0; 0;128;",
"GREY1; 100;100;100;",
7384 "GREY2; 128;128;128;",
"RED1; 150;100;100;",
"UBLCK; 0; 0; 0;",
7385 "UWHIT; 255;255;255;",
"URED; 120; 54; 11;",
"UGREN; 35;110; 20;",
7386 "YELO1; 120;115; 24;",
"YELO2; 64; 40; 0;",
"TEAL1; 0; 64; 64;",
7387 "GREEN5; 85;128; 0;",
"COMPT; 124;126;121",
7389 "CHGRF; 41; 46; 46;",
"UINFM; 58; 20; 57;",
"UINFG; 35; 76; 29;",
7390 "UINFF; 41; 46; 46;",
"UINFR; 80; 28; 35;",
"SHIPS; 71; 78; 79;",
7391 "CHYLW; 81; 73; 24;",
"CHWHT; 71; 78; 79;",
7393 "DILG0; 110;110;110;",
7394 "DILG1; 110;110;110;",
7396 "DILG3; 130;130;130;",
7397 "UITX1; 41; 46; 46;",
7399 "UARTE; 64; 64; 64;",
7401 "NODTA; 41; 46; 46;",
"CHBLK; 54; 60; 61;",
"SNDG1; 41; 46; 46;",
7402 "SNDG2; 71; 78; 79;",
"SCLBR; 75; 38; 19;",
"UIBDR; 54; 60; 61;",
7403 "UINFB; 19; 40; 80;",
"UINFD; 71; 78; 79;",
"UINFO; 75; 38; 19;",
7404 "PLRTE; 73; 21; 12;",
"CHMGD; 74; 58; 81;",
"UIBCK; 7; 7; 7;",
7406 "DASHB; 77; 77; 77;",
7407 "DASHL; 54; 54; 54;",
7409 "DASHR; 58; 21; 21;",
7410 "DASHG; 21; 58; 21;",
7411 "DASHN; 100; 50; 0;",
7412 "DASH1; 76; 76;113;",
7413 "DASH2; 48; 52; 72;",
7414 "COMP1; 107;107;107;",
7416 "GREY3; 20; 20; 20;",
7417 "BLUE4; 80; 80;160;",
7418 "VIO01; 128; 25;108;",
"VIO02; 171; 33;141;",
"BLUEBACK; 186;213;235;",
7419 "LANDBACK; 201;185;122;",
7421 "Table:NIGHT",
"GREEN1; 30; 80; 30;",
"GREEN2; 15; 60; 15;",
7422 "GREEN3; 12; 23; 9;",
"GREEN4; 0; 64; 0;",
"BLUE1; 60; 60;100;",
7423 "BLUE2; 22; 22; 85;",
"BLUE3; 0; 0; 40;",
"GREY1; 48; 48; 48;",
7424 "GREY2; 32; 32; 32;",
"RED1; 100; 50; 50;",
"UWHIT; 255;255;255;",
7425 "UBLCK; 0; 0; 0;",
"URED; 60; 27; 5;",
"UGREN; 17; 55; 10;",
7426 "YELO1; 60; 65; 12;",
"YELO2; 32; 20; 0;",
"TEAL1; 0; 32; 32;",
7427 "GREEN5; 44; 64; 0;",
"COMPT; 48; 49; 51",
7428 "DILG0; 80; 80; 80;",
7429 "DILG1; 80; 80; 80;",
7431 "DILG3; 65; 65; 65;",
7432 "UITX1; 31; 34; 35;",
7434 "UARTE; 64; 64; 64;",
7436 "CHGRF; 16; 18; 18;",
"UINFM; 52; 18; 52;",
"UINFG; 22; 24; 7;",
7437 "UINFF; 31; 34; 35;",
"UINFR; 59; 17; 10;",
"SHIPS; 37; 41; 41;",
7438 "CHYLW; 31; 33; 10;",
"CHWHT; 37; 41; 41;",
7440 "NODTA; 7; 7; 7;",
"CHBLK; 31; 34; 35;",
"SNDG1; 31; 34; 35;",
7441 "SNDG2; 43; 48; 48;",
"SCLBR; 52; 28; 12;",
"UIBDR; 31; 34; 35;",
7442 "UINFB; 21; 29; 69;",
"UINFD; 43; 48; 58;",
"UINFO; 52; 28; 12;",
7443 "PLRTE; 66; 19; 11;",
"CHMGD; 52; 18; 52;",
"UIBCK; 7; 7; 7;",
7446 "DASHL; 20; 20; 20;",
7447 "DASHF; 64; 64; 64;",
7448 "DASHR; 70; 15; 15;",
7449 "DASHG; 15; 70; 15;",
7450 "DASHN; 17; 80; 56;",
7451 "DASH1; 48; 52; 72;",
7452 "DASH2; 36; 36; 53;",
7453 "COMP1; 24; 24; 24;",
7455 "GREY3; 10; 10; 10;",
7456 "BLUE4; 70; 70;140;",
7457 "VIO01; 85; 16; 72;",
"VIO02; 128; 25;108;",
"BLUEBACK; 186;213;235;",
7458 "LANDBACK; 201;185;122;",
7462int get_static_line(
char *d,
const char **p,
int index,
int n) {
7463 if (!strcmp(p[index],
"*****"))
return 0;
7465 strncpy(d, p[index], n);
7469void InitializeUserColors(
void) {
7470 const char **p = usercolors;
7478 UserColorTableArray =
new wxArrayPtrVoid;
7479 UserColourHashTableArray =
new wxArrayPtrVoid;
7483 ct->tableName =
new wxString(_T(
"DAY"));
7484 ct->color =
new wxArrayPtrVoid;
7485 UserColorTableArray->Add((
void *)ct);
7488 ct->tableName =
new wxString(_T(
"DUSK"));
7489 ct->color =
new wxArrayPtrVoid;
7490 UserColorTableArray->Add((
void *)ct);
7493 ct->tableName =
new wxString(_T(
"NIGHT"));
7494 ct->color =
new wxArrayPtrVoid;
7495 UserColorTableArray->Add((
void *)ct);
7497 while ((get_static_line(buf, p, index,
sizeof(buf) - 1))) {
7498 if (!strncmp(buf,
"Table", 5)) {
7499 sscanf(buf,
"Table:%s", TableName);
7501 for (
unsigned int it = 0; it < UserColorTableArray->GetCount(); it++) {
7502 ctp = (colTable *)(UserColorTableArray->Item(it));
7503 if (!strcmp(TableName, ctp->tableName->mb_str())) {
7512 while (buf[j] !=
';' && j < 20) {
7518 S52color *c =
new S52color;
7519 strcpy(c->colName, name);
7521 sscanf(&buf[j],
";%i;%i;%i", &R, &G, &B);
7534 for (
unsigned int its = 0; its < UserColorTableArray->GetCount(); its++) {
7535 wxColorHashMap *phash =
new wxColorHashMap;
7536 UserColourHashTableArray->Add((
void *)phash);
7538 colTable *ctp = (colTable *)(UserColorTableArray->Item(its));
7540 for (
unsigned int ic = 0; ic < ctp->color->GetCount(); ic++) {
7541 S52color *c2 = (S52color *)(ctp->color->Item(ic));
7543 wxColour c(c2->R, c2->G, c2->B);
7544 wxString key(c2->colName, wxConvUTF8);
7551 pcurrent_user_color_hash =
7552 (wxColorHashMap *)UserColourHashTableArray->Item(0);
7555void DeInitializeUserColors(
void) {
7556 if (!UserColorTableArray)
return;
7557 for (
unsigned i = 0; i < UserColorTableArray->GetCount(); i++) {
7558 colTable *ct = (colTable *)UserColorTableArray->Item(i);
7560 for (
unsigned int j = 0; j < ct->color->GetCount(); j++) {
7561 S52color *c = (S52color *)ct->color->Item(j);
7565 delete ct->tableName;
7571 delete UserColorTableArray;
7573 for (
unsigned i = 0; i < UserColourHashTableArray->GetCount(); i++) {
7574 wxColorHashMap *phash = (wxColorHashMap *)UserColourHashTableArray->Item(i);
7578 delete UserColourHashTableArray;
7585typedef struct _MSW_COLOR_SPEC {
7587 wxString S52_RGB_COLOR;
7591MSW_COLOR_SPEC color_spec[] = {{COLOR_MENU, _T(
"UIBCK"), 0},
7592 {COLOR_MENUTEXT, _T(
"UITX1"), 0},
7593 {COLOR_BTNSHADOW, _T(
"UIBCK"), 0},
7596void SaveSystemColors() {
7610 MSW_COLOR_SPEC *pcspec = &color_spec[0];
7611 while (pcspec->COLOR_NAME != -1) {
7612 pcspec->SysRGB_COLOR = pGetSysColor(pcspec->COLOR_NAME);
7617void RestoreSystemColors() {
7618 int element[NCOLORS];
7619 int rgbcolor[NCOLORS];
7622 MSW_COLOR_SPEC *pcspec = &color_spec[0];
7623 while (pcspec->COLOR_NAME != -1) {
7624 element[i] = pcspec->COLOR_NAME;
7625 rgbcolor[i] = pcspec->SysRGB_COLOR;
7631 pSetSysColors(i, (
unsigned long *)&element[0], (
unsigned long *)&rgbcolor[0]);
7636void SetSystemColors(ColorScheme cs) {
7638 int element[NCOLORS];
7639 int rgbcolor[NCOLORS];
7641 if ((GLOBAL_COLOR_SCHEME_DUSK == cs) || (GLOBAL_COLOR_SCHEME_NIGHT == cs)) {
7642 MSW_COLOR_SPEC *pcspec = &color_spec[0];
7643 while (pcspec->COLOR_NAME != -1) {
7644 wxColour color = GetGlobalColor(pcspec->S52_RGB_COLOR);
7645 rgbcolor[i] = (color.Red() << 16) + (color.Green() << 8) + color.Blue();
7646 element[i] = pcspec->COLOR_NAME;
7652 pSetSysColors(i, (
unsigned long *)&element[0],
7653 (
unsigned long *)&rgbcolor[0]);
7657 RestoreSystemColors();
7662wxColor GetDimColor(wxColor c) {
7663 if ((global_color_scheme == GLOBAL_COLOR_SCHEME_DAY) ||
7664 (global_color_scheme == GLOBAL_COLOR_SCHEME_RGB))
7668 if (global_color_scheme == GLOBAL_COLOR_SCHEME_DUSK) factor = 0.5;
7669 if (global_color_scheme == GLOBAL_COLOR_SCHEME_NIGHT) factor = 0.25;
7671 wxImage::RGBValue rgb(c.Red(), c.Green(), c.Blue());
7672 wxImage::HSVValue hsv = wxImage::RGBtoHSV(rgb);
7673 hsv.value = hsv.value * factor;
7674 wxImage::RGBValue nrgb = wxImage::HSVtoRGB(hsv);
7676 return wxColor(nrgb.red, nrgb.green, nrgb.blue);
7682double AnchorDistFix(
double const d,
double const AnchorPointMinDist,
7683 double const AnchorPointMaxDist)
7686 if (d < AnchorPointMinDist)
7687 return AnchorPointMinDist;
7688 else if (d > AnchorPointMaxDist)
7689 return AnchorPointMaxDist;
7695 if (d > -AnchorPointMinDist)
7696 return -AnchorPointMinDist;
7697 else if (d < -AnchorPointMaxDist)
7698 return -AnchorPointMaxDist;
7705static const WORD MAX_CONSOLE_LINES =
7710void RedirectIOToConsole()
7715 wxIntPtr lStdHandle;
7717 CONSOLE_SCREEN_BUFFER_INFO coninfo;
7727 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
7728 coninfo.dwSize.Y = MAX_CONSOLE_LINES;
7729 SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
7733 lStdHandle = (wxIntPtr)GetStdHandle(STD_OUTPUT_HANDLE);
7734 hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
7735 fp = _fdopen(hConHandle,
"w");
7737 setvbuf(stdout, NULL, _IONBF, 0);
7741 lStdHandle = (wxIntPtr)GetStdHandle(STD_INPUT_HANDLE);
7742 hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
7743 fp = _fdopen(hConHandle,
"r");
7745 setvbuf(stdin, NULL, _IONBF, 0);
7749 lStdHandle = (wxIntPtr)GetStdHandle(STD_ERROR_HANDLE);
7750 hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
7751 fp = _fdopen(hConHandle,
"w");
7753 setvbuf(stderr, NULL, _IONBF, 0);
7765bool TestGLCanvas(wxString prog_dir) {
7767 wxString test_app = prog_dir;
7768 test_app += _T(
"ocpn_gltest1.exe");
7770 if (::wxFileExists(test_app)) {
7771 long proc_return = ::wxExecute(test_app, wxEXEC_SYNC);
7772 printf(
"OpenGL Test Process returned %0X\n", proc_return);
7773 if (proc_return == 0)
7774 printf(
"GLCanvas OK\n");
7776 printf(
"GLCanvas failed to start, disabling OpenGL.\n");
7778 return (proc_return == 0);
7788bool ReloadLocale() {
7793 (!g_Platform->ChangeLocale(g_locale, plocale_def_lang, &plocale_def_lang)
7800 FontMgr::Get().SetLocale(g_locale);
7808 if (pRoutePropDialog) {
7809 pRoutePropDialog->Hide();
7810 pRoutePropDialog->Destroy();
7811 pRoutePropDialog = NULL;
7814 if (pRouteManagerDialog) {
7815 pRouteManagerDialog->Hide();
7816 pRouteManagerDialog->Destroy();
7817 pRouteManagerDialog = NULL;
7820 if (console) console->SetColorScheme(global_color_scheme);
7821 if (g_pais_query_dialog_active) {
7822 g_pais_query_dialog_active->Destroy();
7823 g_pais_query_dialog_active = NULL;
7826 auto alert_dlg_active =
7828 if (alert_dlg_active) {
7829 alert_dlg_active->Destroy();
7830 g_pais_alert_dialog_active =
nullptr;
7833 if (g_pAISTargetList) {
7834 if (g_pauimgr) g_pauimgr->DetachPane(g_pAISTargetList);
7835 g_pAISTargetList->Disconnect_decoder();
7836 g_pAISTargetList->Destroy();
7837 g_pAISTargetList = NULL;
7841 if (gFrame->m_pMenuBar) {
7842 gFrame->SetMenuBar(NULL);
7843 gFrame->m_pMenuBar->Destroy();
7844 gFrame->m_pMenuBar = NULL;
7846 gFrame->BuildMenuBar();
7849 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
7851 if (cc) cc->CanvasApplyLocale();
7856 wxString perspective;
7857 pConfig->SetPath(_T (
"/AUI" ));
7858 pConfig->Read(_T (
"AUIPerspective" ), &perspective);
7872 bool bno_load =
false;
7873 wxAuiPaneInfoArray pane_array_val = g_pauimgr->GetAllPanes();
7875 for (
unsigned int i = 0; i < pane_array_val.GetCount(); i++) {
7876 wxAuiPaneInfo pane = pane_array_val[i];
7877 if (perspective.Find(pane.name) == wxNOT_FOUND) {
7883 if (!bno_load) g_pauimgr->LoadPerspective(perspective,
false);
7885 g_pauimgr->Update();
7888 gFrame->RequestNewToolbars(
true);
7889 gFrame->RequestNewMasterToolbar(
true);
7893extern s57RegistrarMgr *m_pRegistrarMan;
7894extern wxString g_UserPresLibData;
7895extern wxString g_SENCPrefix;
7896extern wxString g_csv_locn;
7912 g_csv_locn = g_Platform->GetSharedDataDir();
7913 g_csv_locn.Append(_T(
"s57data"));
7916 g_csv_locn = _T(
".");
7917 appendOSDirSlash(&g_csv_locn);
7918 g_csv_locn.Append(_T(
"s57data"));
7923 if (g_SENCPrefix.IsEmpty()) {
7925 appendOSDirSlash(&g_SENCPrefix);
7926 g_SENCPrefix.Append(_T(
"SENC"));
7930 wxFileName f(g_SENCPrefix);
7932 g_SENCPrefix = f.GetFullPath();
7934 g_SENCPrefix = _T(
"SENC");
7940 bool b_force_legacy =
false;
7942 if (g_UserPresLibData.IsEmpty()) {
7943 plib_data = g_csv_locn;
7944 appendOSDirSlash(&plib_data);
7945 plib_data.Append(_T(
"S52RAZDS.RLE"));
7947 plib_data = g_UserPresLibData;
7948 b_force_legacy =
true;
7951 ps52plib =
new s52plib(plib_data, b_force_legacy);
7966 if (!ps52plib->m_bOK) {
7969 wxStandardPaths &std_path = g_Platform->GetStdPaths();
7971 wxString look_data_dir;
7972 look_data_dir.Append(std_path.GetUserDataDir());
7973 appendOSDirSlash(&look_data_dir);
7974 wxString tentative_SData_Locn = look_data_dir;
7975 look_data_dir.Append(_T(
"s57data"));
7977 plib_data = look_data_dir;
7978 appendOSDirSlash(&plib_data);
7979 plib_data.Append(_T(
"S52RAZDS.RLE"));
7981 wxLogMessage(_T(
"Looking for s57data in ") + look_data_dir);
7982 ps52plib =
new s52plib(plib_data);
7984 if (ps52plib->m_bOK) {
7985 g_csv_locn = look_data_dir;
7994 if (!ps52plib->m_bOK) {
7997 wxString look_data_dir;
7998 look_data_dir = g_Platform->GetSharedDataDir();
7999 look_data_dir.Append(_T(
"s57data"));
8001 plib_data = look_data_dir;
8002 appendOSDirSlash(&plib_data);
8003 plib_data.Append(_T(
"S52RAZDS.RLE"));
8005 wxLogMessage(_T(
"Looking for s57data in ") + look_data_dir);
8006 ps52plib =
new s52plib(plib_data);
8008 if (ps52plib->m_bOK) g_csv_locn = look_data_dir;
8011 if (ps52plib->m_bOK) {
8012 wxLogMessage(_T(
"Using s57data in ") + g_csv_locn);
8014 new s57RegistrarMgr(g_csv_locn, g_Platform->GetLogFilePtr());
8019 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
8021 OBJLElement *pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
8022 if (!strncmp(pOLE->OBJLName,
"DEPARE", 6)) pOLE->nViz = 1;
8023 if (!strncmp(pOLE->OBJLName,
"LNDARE", 6)) pOLE->nViz = 1;
8024 if (!strncmp(pOLE->OBJLName,
"COALNE", 6)) pOLE->nViz = 1;
8027 pConfig->LoadS57Config();
8028 ps52plib->SetPLIBColorScheme(global_color_scheme, ChartCtxFactory());
8031 ps52plib->SetDisplayWidth(g_monitor_info[g_current_monitor].width);
8032 ps52plib->SetPPMM(g_BasePlatform->GetDisplayDPmm());
8034 ps52plib->SetDIPFactor(dip_factor);
8039 ps52plib->SetScaleFactorExp(
8040 g_Platform->GetChartScaleFactorExp(g_ChartScaleFactor));
8041 ps52plib->SetScaleFactorZoomMod(g_chart_zoom_modifier_vector);
8046 extern bool g_b_EnableVBO;
8047 extern GLenum g_texture_rectangle_format;
8052 wxString renderer = wxString(GL_Caps->Renderer.c_str());
8053 ps52plib->SetGLRendererString(renderer);
8056 ps52plib->SetGLOptions(
8057 glChartCanvas::s_b_useStencil, glChartCanvas::s_b_useStencilAP,
8058 glChartCanvas::s_b_useScissorTest, glChartCanvas::s_b_useFBO,
8059 g_b_EnableVBO, g_texture_rectangle_format, 1, 1);
8065 _T(
" S52PLIB Initialization failed, disabling Vector charts."));
8074 : wxThread(wxTHREAD_JOINABLE) {
8075 m_filename = filename;
8086 newChart->SetNativeScale(m_scale);
8087 newChart->SetFullExtent(m_ext);
8089 newChart->FindOrCreateSenc(m_filename);
8094 wxString m_filename;
8100static double chart_dist(
int index) {
8106 if (cte.GetBBox().Contains(gLat, gLon))
8111 clon = (cte.GetLonMax() + cte.GetLonMin()) / 2;
8112 d = DistGreatCircle(cte.GetLatMax(), clon, gLat, gLon);
8113 t = DistGreatCircle(cte.GetLatMin(), clon, gLat, gLon);
8116 clat = (cte.GetLatMax() + cte.GetLatMin()) / 2;
8117 t = DistGreatCircle(clat, cte.GetLonMin(), gLat, gLon);
8119 t = DistGreatCircle(clat, cte.GetLonMax(), gLat, gLon);
8125WX_DEFINE_SORTED_ARRAY_INT(
int, MySortedArrayInt);
8126static int CompareInts(
int n1,
int n2) {
8127 double d1 = chart_dist(n1);
8128 double d2 = chart_dist(n2);
8129 return (
int)(d1 - d2);
8134 wxString chart_path;
8139WX_DEFINE_OBJARRAY(ArrayOfCompressTargets);
8141#include <wx/arrimpl.cpp>
8144void ParseAllENC(wxWindow *parent) {
8145 MySortedArrayInt idx_sorted_by_distance(CompareInts);
8153 for (
int i = 0; i < ChartData->GetChartTableEntries(); i++) {
8156 if (CHART_TYPE_S57 != cte.GetChartType())
continue;
8158 idx_sorted_by_distance.Add(i);
8162 if (count == 0)
return;
8164 wxLogMessage(wxString::Format(_T(
"ParseAllENC() count = %d"), count));
8170 ArrayOfCompressTargets ct_array;
8171 for (
unsigned int j = 0; j < idx_sorted_by_distance.GetCount(); j++) {
8172 int i = idx_sorted_by_distance[j];
8175 double distance = chart_dist(i);
8177 wxString filename(cte.GetpFullPath(), wxConvUTF8);
8180 pct->distance = distance;
8181 pct->chart_path = filename;
8183 ct_array.push_back(pct);
8186 int thread_count = 0;
8189 extern int g_nCPUCount;
8190 if (g_nCPUCount > 0)
8191 thread_count = g_nCPUCount;
8193 thread_count = wxThread::GetCPUCount();
8195 if (thread_count < 1) {
8204 for(
int t = 0; t < thread_count; t++)
8208 wxGenericProgressDialog *prog =
nullptr;
8212 long style = wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
8213 wxPD_REMAINING_TIME | wxPD_CAN_SKIP;
8215 prog =
new wxGenericProgressDialog();
8217 prog->SetFont(*qFont);
8219 prog->Create(_(
"OpenCPN ENC Prepare"),
8220 _T(
"Longgggggggggggggggggggggggggggg"), count + 1, parent,
8230 prog->ShowWindowModal();
8239 for (
unsigned int j = 0; j < ct_array.size(); j++) {
8240 wxString filename = ct_array[j].chart_path;
8241 double distance = ct_array[j].distance;
8242 int index = ChartData->FinddbIndex(filename);
8243 if (index < 0)
continue;
8246 ext.NLAT = cte.GetLatMax();
8247 ext.SLAT = cte.GetLatMin();
8248 ext.WLON = cte.GetLonMin();
8249 ext.ELON = cte.GetLonMax();
8251 int scale = cte.GetScale();
8254 msg.Printf(_(
"Distance from Ownship: %4.0f NMi"), distance);
8257 if (wxThread::IsMain()) {
8259 wxSize sz = prog->GetSize();
8261 msg += _T(
" Chart:");
8264 prog->Update(count, msg, &skip);
8276 newChart->SetNativeScale(
scale);
8277 newChart->SetFullExtent(ext);
8278 newChart->DisableBackgroundSENC();
8280 newChart->FindOrCreateSenc(filename,
8284 if (wxThread::IsMain()) {
8285 msg.Printf(_(
"ENC Completed."));
8287 prog->Update(count, msg, &skip);
8297 for (
int t = 0;; t = (t + 1) % thread_count) {
8304 if (!workers[t]->IsAlive()) {
8317#if defined(__WXMSW__) || defined(__WXOSX__)
8324 for(
int t = 0; t<thread_count; t++) {
Global state for AIS decoder.
Dialog for displaying AIS target alerts.
Dialog for displaying a list of AIS targets.
Dialog for querying detailed information about an AIS target.
bool Create(wxWindow *parent, wxWindowID id=wxID_ANY, const wxString &caption=_("Object Query"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=AIS_TARGET_QUERY_STYLE)
Creation.
Extends AboutFrame, providing implementation for various event handlers and additional methods.
The OpenCPN About dialog displaying information including version, authors, license,...
Represents an active track that is currently being recorded.
Handles the AIS information GUI and sound alerts.
A modal message dialog with confirmation button and cancel button.
Dialog for managing CM93 chart offsets.
Base class for all chart types.
ChartCanvas - Main chart display and interaction component.
double m_cursor_lat
The latitude in degrees corresponding to the most recently processed cursor position.
double GetCanvasScaleFactor()
Return the number of logical pixels per meter for the screen.
void SetDisplaySizeMM(double size)
Set the width of the screen in millimeters.
float GetVPScale()
Return the ViewPort scale factor, in physical pixels per meter.
void DoZoomCanvas(double factor, bool can_zoom_to_cursor=true)
Internal function that implements the actual zoom operation.
bool SetVPScale(double sc, bool b_refresh=true)
Sets the viewport scale while maintaining the center point.
double m_cursor_lon
The longitude in degrees corresponding to the most recently processed cursor position.
void ZoomCanvas(double factor, bool can_zoom_to_cursor=true, bool stoptimer=true)
Perform a smooth zoom operation on the chart canvas by the specified factor.
bool SetViewPoint(double lat, double lon)
Set the viewport center point.
Manages the chart database and provides access to chart data.
bool Create(ArrayOfCDI &dir_array, wxGenericProgressDialog *pprog)
Creates a new chart database from a list of directories.
Represents a user-defined collection of logically related charts.
void GenerateGLbmp()
In OperGL mode, make the bitmap capture of the screen before the print method starts as to be sure th...
Primary navigation console display for route and vessel tracking.
Overall logging handler, outputs to screen and log file.
virtual bool IsVisible() const override
Return true if log is visible i.
const void Notify()
Notify all listeners, no data supplied.
wxFont * FindOrCreateFont(int point_size, wxFontFamily family, wxFontStyle style, wxFontWeight weight, bool underline=false, const wxString &facename=wxEmptyString, wxFontEncoding encoding=wxFONTENCODING_DEFAULT)
Creates or finds a matching font in the font cache.
void ScrubList()
Cleans up stale font entries after a locale change.
wxFont * GetFont(const wxString &TextElement, int requested_font_size=0)
Gets a font object for a UI element.
Represents a layer of chart objects in OpenCPN.
static void ReleaseInstance()
Release Instance.
static LocalServerApi & GetInstance()
Dialog for displaying and editing waypoint properties.
void InitApiListeners()
Setup handling of events from the local ipc/dbus API.
virtual bool IsVisible() const =0
Return true if log is visible i.
virtual void Add(const Logline &l)=0
Add an formatted string to log output.
void Init(const KeyProvider &kp, std::function< void(ObservedEvt &ev)> action)
Initiate an object yet not listening.
void Listen(const std::string &key, wxEvtHandler *listener, wxEventType evt)
Set object to send wxEventType ev to listener on changes in key.
Custom event class for OpenCPN's notification system.
std::shared_ptr< const void > GetSharedPtr() const
Gets the event's payload data.
Data for a loaded plugin, including dl-loaded library.
int m_cap_flag
PlugIn Capabilities descriptor.
bool LoadAllPlugIns(bool enabled_plugins, bool keep_orphans=false)
Update catalog with imported metadata and load all plugin library files.
bool UnLoadAllPlugIns()
Unload allplugins i.
bool UpdatePlugIns()
Update the GetPlugInArray() list by reloading all plugins from disk.
const ArrayOfPlugIns * GetPlugInArray()
Return list of currently loaded plugins.
bool DeactivateAllPlugIns()
Deactivate all plugins.
static PrintDialog & GetInstance()
Get instance to handle the print process,.
Represents a waypoint or mark within the navigation system.
bool m_bIsolatedMark
Flag indicating if the waypoint is a standalone mark.
bool m_bShowName
Flag indicating if the waypoint name should be shown.
Represents a navigational route in the navigation system.
wxString m_RouteStartString
Name or description of the route's starting point.
bool m_bDeleteOnArrival
Flag indicating whether the route should be deleted once navigation reaches the end.
wxString m_RouteEndString
Name or description of the route's ending point.
RoutePoint * m_pRouteActivePoint
Pointer to the currently active waypoint within this route.
wxString m_RouteNameString
User-assigned name for the route.
wxString m_GUID
Globally unique identifier for this route.
EventVar on_routes_update
Notified when list of routes is updated (no data in event)
bool ActivateRoute(Route *pRouteToActivate, RoutePoint *pStartPoint=NULL)
Activates a route for navigation.
Dialog for displaying query results of S57 objects.
Manager for S57 chart SENC creation threads.
EventVar evt_resume
Notified when resuming from hibernate.
Represents a single point in a track.
wxDateTime GetCreateTime(void)
Retrieves the creation timestamp of a track point as a wxDateTime object.
Represents a track, which is a series of connected track points.
double view_scale_ppm
Requested view scale in physical pixels per meter (ppm), before applying projections.
double rotation
Rotation angle of the viewport in radians.
double skew
Angular distortion (shear transform) applied to the viewport in radians.
double clon
Center longitude of the viewport in degrees.
double clat
Center latitude of the viewport in degrees.
Encapsulates persistent canvas configuration.
double iLat
Latitude of the center of the chart, in degrees.
bool bShowOutlines
Display chart outlines.
wxSize canvasSize
Canvas dimensions.
bool bShowDepthUnits
Display depth unit indicators.
double iLon
Longitude of the center of the chart, in degrees.
double iRotation
Initial rotation angle in radians.
bool bCourseUp
Orient display to course up.
bool bQuilt
Enable chart quilting.
bool bFollow
Enable vessel following mode.
double iScale
Initial chart scale factor.
bool bShowGrid
Display coordinate grid.
ChartCanvas * canvas
Pointer to associated chart canvas.
bool bShowCurrents
Display current information.
bool bShowTides
Display tide information.
bool bLookahead
Enable lookahead mode.
bool bHeadUp
Orient display to heading up.
wxRect GetRect(void) const
Return the coordinates of the compass widget, in physical pixels relative to the canvas window.
virtual void OnToolbarToolCallback(int id)
Handles toolbar tool clicks.
Represents an S57 format electronic navigational chart in OpenCPN.
int Parse(const wxString &doc, wxJSONValue *val)
Parse the JSON document.
The JSON value class implementation.
bool HasMember(unsigned index) const
Return TRUE if the object contains an element at the specified index.
wxString AsString() const
Return the stored value as a wxWidget's string.
Global variables reflecting command line options and arguments.
Driver registration container, a singleton.
Raw messages layer, supports sending and recieving navmsg messages.
New NMEA Debugger successor main window.
Hooks into gui available in model.
wxFont * GetOCPNScaledFont(wxString item, int default_size)
Retrieves a font from FontMgr, optionally scaled for physical readability.
General purpose GUI support.
The local API has a server side handling commands and a client part issuing commands.
Enhanced logging interface on top of wx/log.h.
Class NotificationManager.
PlugIn Object Definition/API.
wxWindow * GetOCPNCanvasWindow()
Gets OpenCPN's main canvas window.
double OCPN_GetDisplayContentScaleFactor()
Gets content scaling factor for current display.
void JumpToPosition(double lat, double lon, double scale)
Centers chart display on specified position at given scale.
wxWindow * GetCanvasUnderMouse(void)
Gets canvas window under mouse cursor.
void SendPluginMessage(wxString message_id, wxString message_body)
Sends message to other plugins.
Tools to send data to plugins.
Low level code to load plugins from disk, notably the PluginLoader class.
Represents an entry in the chart table, containing information about a single chart.
A generic position and navigation data structure.
double kCog
Course over ground in degrees.
double kHdt
True heading in degrees.
int nSats
Number of satellites used in the fix.
double kHdm
Magnetic heading in degrees.
time_t FixTime
UTC time of fix.
double kLat
Latitude in decimal degrees.
double kSog
Speed over ground in knots.
double kVar
Magnetic variation in degrees.
double kLon
Longitude in decimal degrees.
Suspend/resume and new devices events exchange point.
void DestroyDeviceNotFoundDialogs()
Destroy all open "Device not found" dialog windows.
Access checks for comm devices and dongle.