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"
76#include "model/nav_object_database.h"
77#include "model/navutil_base.h"
78#include "model/own_ship.h"
80#include "model/plugin_loader.h"
81#include "model/routeman.h"
82#include "model/select.h"
84#include "model/track.h"
86#include "dialog_alert.h"
87#include "AboutFrameImpl.h"
90#include "ais_info_gui.h"
91#include "AISTargetAlertDialog.h"
92#include "AISTargetListDialog.h"
93#include "AISTargetQueryDialog.h"
94#include "CanvasConfig.h"
96#include "chart_ctx_factory.h"
100#include "color_handler.h"
103#include "connections_dlg.h"
104#include "ConfigMgr.h"
108#include "glChartCanvas.h"
109#include "GoToPositionDialog.h"
111#include "iENCToolbar.h"
113#include "load_errors_dlg.h"
116#include "N2KParser.h"
118#include "NMEALogWindow.h"
120#include "OCPN_AUIManager.h"
121#include "ocpn_frame.h"
122#include "OCPNPlatform.h"
123#include "OCPN_Sound.h"
125#include "pluginmanager.h"
126#include "routemanagerdialog.h"
127#include "routeman_gui.h"
128#include "route_point_gui.h"
129#include "RoutePropDlgImpl.h"
132#include "S57QueryDialog.h"
133#include "SystemCmdSound.h"
137#include "TrackPropDlg.h"
138#include "waypointman_gui.h"
139#include "CanvasOptions.h"
143#include "androidUTIL.h"
149WX_DEFINE_ARRAY_PTR(
ChartCanvas *, arrayofCanvasPtr);
157extern arrayofCanvasPtr g_canvasArray;
170extern about *g_pAboutDlgLegacy;
173extern double vLat, vLon;
174extern wxString g_locale;
175extern ColorScheme global_color_scheme;
180GLenum g_texture_rectangle_format;
183#if wxUSE_XLOCALE || !wxCHECK_VERSION(3, 0, 0)
184extern wxLocale *plocale_def_lang;
191extern s52plib *ps52plib;
195extern bool g_b_legacy_input_filter_behaviour;
196extern bool g_bTrackActive;
198extern bool g_bmasterToolbarFull;
199extern int g_nAutoHideToolbar;
200extern bool g_bAutoHideToolbar;
201extern bool g_bshowToolbar;
202extern int g_maintoolbar_x;
203extern int g_maintoolbar_y;
204extern wxString g_toolbarConfig;
205extern float g_toolbar_scalefactor;
206extern float g_compass_scalefactor;
207extern bool g_bShowMenuBar;
208extern bool g_bShowCompassWin;
210extern bool g_benable_rotate;
211extern int g_GUIScaleFactor;
212extern int g_ChartScaleFactor;
213extern int g_last_ChartScaleFactor;
214extern int g_ShipScaleFactor;
215extern float g_ShipScaleFactorExp;
216extern int g_ENCTextScaleFactor;
218extern bool g_bShowTide;
219extern bool g_bShowCurrent;
220extern bool g_bUIexpert;
221extern RouteList *pRouteList;
222extern wxString g_default_wp_icon;
223extern std::vector<std::string> TideCurrentDataSet;
224extern wxString g_TCData_Dir;
226extern char nmea_tick_chars[];
227extern double AnchorPointMinDist;
228extern bool AnchorAlertOn1, AnchorAlertOn2;
229extern wxString g_AW1GUID;
230extern wxString g_AW2GUID;
231extern bool g_bCruising;
232extern double g_COGAvg;
233extern int g_COGAvgSec;
235extern std::vector<Track *> g_TrackList;
236extern double gQueryVar;
237extern wxPrintData *g_printData;
238extern wxPageSetupData *g_pageSetupData;
239extern int g_ChartUpdatePeriod;
240extern int g_SkewCompUpdatePeriod;
241extern bool g_bCourseUp;
242extern bool g_bLookAhead;
243extern bool g_bskew_comp;
244extern bool g_bPauseTest;
246extern bool g_bPlayShipsBells;
247extern wxDateTime g_loglast_time;
248extern int g_nAWDefault;
250extern bool g_bDeferredStartTrack;
251extern bool bDBUpdateInProgress;
255extern bool g_bDeferredInitDone;
256extern int options_lastPage;
257extern int options_subpage;
258extern bool b_reloadForPlugins;
260extern int g_NeedDBUpdate;
261extern bool g_bFullscreen;
262extern wxString gWorldMapLocation, gDefaultWorldMapLocation;
263extern ChartGroupArray *g_pGroupArray;
264extern bool g_bEnableZoomToCursor;
265extern double g_display_size_mm;
266extern std::vector<size_t> g_config_display_size_mm;
267extern wxString ChartListFileName;
268extern bool g_bFullscreenToolbar;
269extern arrayofCanvasPtr g_canvasArray;
270extern wxString g_lastAppliedTemplateGUID;
271extern wxPoint options_lastWindowPos;
272extern wxSize options_lastWindowSize;
273extern unsigned int g_canvasConfig;
274extern bool g_bFullScreenQuilt;
275extern bool g_bQuiltEnable;
276extern wxString *pInit_Chart_Dir;
277extern bool g_bShowOutlines;
278extern bool g_bTempShowMenuBar;
279extern bool g_bShowStatusBar;
280extern bool g_FlushNavobjChanges;
281extern int g_FlushNavobjChangesTimeout;
282extern bool g_bShowChartBar;
283extern double g_plus_minus_zoom_factor;
284extern int g_nframewin_x;
285extern int g_nframewin_y;
286extern int g_nframewin_posx;
287extern int g_nframewin_posy;
288extern bool g_bframemax;
289extern LayerList *pLayerList;
290extern bool g_bAutoAnchorMark;
291extern wxDateTime g_start_time;
292extern bool g_bcompression_wait;
293extern bool g_bquiting;
294extern bool b_inCloseWindow;
295extern bool b_inCompressAllCharts;
296extern long g_maintoolbar_orient;
297extern wxAuiDefaultDockArt *g_pauidockart;
298extern int g_click_stop;
299extern wxString g_CmdSoundString;
300extern std::vector<OcpnSound *> bells_sound;
301extern char bells_sound_file_name[2][12];
302extern int g_sticky_chart;
303extern int g_sticky_projection;
304extern wxArrayPtrVoid *UserColourHashTableArray;
305extern wxColorHashMap *pcurrent_user_color_hash;
308extern bool g_own_ship_sog_cog_calc;
309extern int g_own_ship_sog_cog_calc_damp_sec;
310extern bool g_bHasHwClock;
311extern bool s_bSetSystemTime;
312extern bool bVelocityValid;
313extern int gHDx_Watchdog;
316extern bool g_bUseGLL;
317extern int g_MemFootMB;
320extern int g_chart_zoom_modifier_vector;
321extern bool g_config_display_size_manual;
322extern bool g_PrintingInProgress;
323extern bool g_disable_main_toolbar;
324extern bool g_btenhertz;
329typedef DWORD(WINAPI *SetSysColors_t)(DWORD, DWORD *, DWORD *);
330typedef DWORD(WINAPI *GetSysColor_t)(DWORD);
332SetSysColors_t pSetSysColors;
333GetSysColor_t pGetSysColor;
335void SaveSystemColors(
void);
336void RestoreSystemColors(
void);
341DWORD color_3ddkshadow;
343DWORD color_activecaption;
344DWORD color_gradientactivecaption;
345DWORD color_captiontext;
346DWORD color_windowframe;
347DWORD color_inactiveborder;
352#include <wx/msw/msvcrt.h>
356static const long long lNaN = 0xfff8000000000000;
357#define NAN (*(double *)&lNaN)
360static wxArrayPtrVoid *UserColorTableArray = 0;
363double gLat_gt, gLon_gt;
364double gLat_gt_m1, gLon_gt_m1;
366uint64_t fix_time_gt_last;
368double gSog_gt, gCog_gt, gHdt_gt;
369double gCog_gt_m1, gHdt_gt_m1;
371double cog_rate_gt, hdt_rate_gt;
374void appendOSDirSlash(wxString *pString);
376void InitializeUserColors(
void);
377void DeInitializeUserColors(
void);
378void SetSystemColors(ColorScheme cs);
380static bool LoadAllPlugIns(
bool load_enabled) {
381 AbstractPlatform::ShowBusySpinner();
382 bool b = PluginLoader::getInstance()->
LoadAllPlugIns(load_enabled);
383 AbstractPlatform::HideBusySpinner();
391#if defined(__WXGTK__) || defined(__WXQT__)
392#include "bitmaps/opencpn.xpm"
407int g_iENCToolbarPosX;
408int g_iENCToolbarPosY;
410void BuildiENCToolbar(
bool bnew) {
411 if (g_bInlandEcdis) {
414 wxPoint locn = g_iENCToolbar->GetToolbarPosition();
415 wxPoint tbp_incanvas =
418 g_iENCToolbarPosY = tbp_incanvas.y;
419 g_iENCToolbarPosX = tbp_incanvas.x;
421 delete g_iENCToolbar;
426 if (!g_iENCToolbar) {
427 wxPoint posn(g_iENCToolbarPosX, g_iENCToolbarPosY);
431 if ((g_iENCToolbarPosY > g_maintoolbar_y) &&
433 g_maintoolbar_y + g_MainToolbar->GetToolSize().y))
434 g_iENCToolbarPosY = -1;
437 if ((g_iENCToolbarPosX < 0) || (g_iENCToolbarPosY < 0)) {
443 wxPoint(g_maintoolbar_x + g_MainToolbar->GetToolbarSize().x + 4,
447 double tool_scale_factor =
448 g_Platform->GetToolbarScaleFactor(g_GUIScaleFactor);
451 new iENCToolbar(gFrame, posn, wxTB_HORIZONTAL, tool_scale_factor);
452 g_iENCToolbar->SetColorScheme(global_color_scheme);
453 g_iENCToolbar->EnableSubmerge(
false);
456 delete g_iENCToolbar;
457 g_iENCToolbar = NULL;
461bool ShowNavWarning() {
464OpenCPN is distributed in the hope that it will be useful, \
465but WITHOUT ANY WARRANTY; without even the implied \
466warranty of MERCHANTABILITY or FITNESS FOR A \
467PARTICULAR PURPOSE.\n\n\
468See the GNU General Public License for more details.\n\n\
469OpenCPN must only be used in conjunction with approved \
470paper charts and traditional methods of navigation.\n\n\
471DO NOT rely upon OpenCPN for safety of life or property.\n\n\
472Please click \"Agree\" and proceed, or \"Cancel\" to quit.\n"));
474 wxString vs = wxString::Format(wxT(
" .. Version %s"), VERSION_FULL);
477 androidShowDisclaimer(_(
"OpenCPN for Android") + vs, msg);
480 msg.Replace(
"\n",
"<br>");
482 std::stringstream html;
483 html <<
"<html><body><p>";
484 html << msg.ToStdString();
485 html <<
"</p></body></html>";
487 std::string title = _(
"Welcome to OpenCPN").ToStdString();
488 std::string action = _(
"Agree").ToStdString();
493 return agreed == wxID_YES;
498 if (chart ==
nullptr)
return false;
501 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
503 if (cc && cc->m_singleChart == chart) {
510#if defined(__WXGTK__) && defined(OCPN_HAVE_X11)
513static char *get_X11_property(Display *disp, Window win, Atom xa_prop_type,
514 const char *prop_name) {
518 unsigned long ret_nitems;
519 unsigned long ret_bytes_after;
520 unsigned char *ret_prop;
522 xa_prop_name = XInternAtom(disp, prop_name, False);
530 if (XGetWindowProperty(disp, win, xa_prop_name, 0, 1024, False, xa_prop_type,
531 &xa_ret_type, &ret_format, &ret_nitems,
532 &ret_bytes_after, &ret_prop) != Success)
535 if (xa_ret_type != xa_prop_type) {
539 return (
char *)ret_prop;
544static bool isTransparentToolbarInOpenGLOK(
void) {
551 if (!g_bdisable_opengl) {
552 Display *disp = XOpenDisplay(NULL);
554 if ((sup_window = (Window *)get_X11_property(disp, DefaultRootWindow(disp),
556 "_NET_SUPPORTING_WM_CHECK")) ||
557 (sup_window = (Window *)get_X11_property(disp, DefaultRootWindow(disp),
559 "_WIN_SUPPORTING_WM_CHECK"))) {
562 if ((wm_name = get_X11_property(disp, *sup_window,
563 XInternAtom(disp,
"UTF8_STRING", False),
565 (wm_name = get_X11_property(disp, *sup_window, XA_STRING,
568 if (strstr(wm_name,
"Xfwm4") || strstr(wm_name,
"Compiz"))
589wxDEFINE_EVENT(BELLS_PLAYED_EVTYPE, wxCommandEvent);
591BEGIN_EVENT_TABLE(
MyFrame, wxFrame)
592EVT_CLOSE(MyFrame::OnCloseWindow)
593EVT_MENU(wxID_EXIT, MyFrame::OnExit)
594EVT_SIZE(MyFrame::OnSize)
595EVT_MOVE(MyFrame::OnMove)
596EVT_ICONIZE(MyFrame::OnIconize)
597EVT_MENU(-1, MyFrame::OnToolLeftClick)
598EVT_TIMER(INIT_TIMER, MyFrame::OnInitTimer)
599EVT_TIMER(FRAME_TIMER_1, MyFrame::OnFrameTimer1)
600EVT_TIMER(FRAME_TC_TIMER, MyFrame::OnFrameTCTimer)
601EVT_TIMER(FRAME_COG_TIMER, MyFrame::OnFrameCOGTimer)
602EVT_TIMER(MEMORY_FOOTPRINT_TIMER, MyFrame::OnMemFootTimer)
603EVT_TIMER(FRANE_TENHZ_TIMER, MyFrame::OnFrameTenHzTimer)
604EVT_MAXIMIZE(MyFrame::OnMaximize)
605EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_TOOL_RCLICKED,
606 MyFrame::RequestNewToolbarArgEvent)
607EVT_ERASE_BACKGROUND(MyFrame::OnEraseBackground)
609EVT_TIMER(RECAPTURE_TIMER, MyFrame::OnRecaptureTimer)
610EVT_TIMER(TOOLBAR_ANIMATE_TIMER, MyFrame::OnToolbarAnimateTimer)
611EVT_COMMAND(wxID_ANY, BELLS_PLAYED_EVTYPE, MyFrame::OnBellsFinished)
613#ifdef wxHAS_POWER_EVENTS
614EVT_POWER_SUSPENDING(MyFrame::OnSuspending)
615EVT_POWER_SUSPENDED(MyFrame::OnSuspended)
616EVT_POWER_SUSPEND_CANCEL(MyFrame::OnSuspendCancel)
617EVT_POWER_RESUME(MyFrame::OnResume)
628static
void onBellsFinishedCB(
void *ptr) {
629 auto framePtr =
static_cast<MyFrame *
>(ptr);
631 wxCommandEvent ev(BELLS_PLAYED_EVTYPE);
632 wxPostEvent(framePtr, ev);
637 auto msg = ev.GetString().ToStdString();
638 OCPNMessageBox(
GetTopWindow(), msg, _(
"Communication Error"));
642MyFrame::MyFrame(wxFrame *frame,
const wxString &title,
const wxPoint &pos,
643 const wxSize &size,
long style)
644 : wxFrame(frame, -1, title, pos, size, style, kTopLevelWindowName),
645 comm_overflow_dlg(this),
646 m_connections_dlg(nullptr) {
647 g_current_monitor = wxDisplay::GetFromWindow(
this);
653 g_current_monitor_dip_px_ratio =
654 g_monitor_info[g_current_monitor].width_px /
655 g_monitor_info[g_current_monitor].width;
658 m_last_track_rotation_ts = 0;
659 m_ulLastNMEATicktime = 0;
662 m_StatusBarFieldCount = g_Platform->GetStatusBarFieldCount();
666 m_load_errors_dlg_ctrl = std::make_unique<LoadErrorsDlgCtrl>(
this);
669 InitTimer.SetOwner(
this, INIT_TIMER);
671 m_initializing =
false;
674 FrameTimer1.SetOwner(
this, FRAME_TIMER_1);
677 FrameTCTimer.SetOwner(
this, FRAME_TC_TIMER);
680 FrameCOGTimer.SetOwner(
this, FRAME_COG_TIMER);
683 MemFootTimer.SetOwner(
this, MEMORY_FOOTPRINT_TIMER);
686 ToolbarAnimateTimer.SetOwner(
this, TOOLBAR_ANIMATE_TIMER);
688 FrameTenHzTimer.SetOwner(
this, FRANE_TENHZ_TIMER);
697 m_bTimeIsSet =
false;
700 m_bdefer_resize =
false;
703 for (
int i = 0; i < MAX_COGSOG_FILTER_SECONDS; i++) {
704 COGFilterTable[i] = NAN;
705 SOGFilterTable[i] = NAN;
707 m_last_bGPSValid =
false;
708 m_last_bVelocityValid =
false;
718 for (
int i = 0; i < MAX_COG_AVERAGE_SECONDS; i++) COGTable[i] = NAN;
723 double process_noise_std = 1.0;
724 double measurement_noise_std = 0.5;
726 m_ChartUpdatePeriod = 1;
731 log_callbacks.log_is_active = []() {
732 return NMEALogWindow::GetInstance().
Active();
734 log_callbacks.log_message = [](
const wxString &s) {
735 NMEALogWindow::GetInstance().
Add(s);
737 g_pMUX =
new Multiplexer(log_callbacks, g_b_legacy_input_filter_behaviour);
740 ais_callbacks.confirm_stop_track = []() {
741 int r = OCPNMessageBox(
743 _(
"This AIS target has Persistent tracking selected by MMSI "
745 "A Persistent track recording will therefore be restarted for this "
747 "Do you instead want to stop Persistent tracking for this target?"),
748 _(
"OpenCPN Info"), wxYES_NO | wxCENTER, 60);
749 return r == wxID_YES;
751 ais_callbacks.get_target_mmsi = []() {
752 auto alert_dlg_active =
754 assert(alert_dlg_active);
755 return alert_dlg_active->Get_Dialog_MMSI();
763 wxLogMessage(
" **** Connect stuff");
769 Connect(wxEVT_OCPN_MSG,
770 (wxObjectEventFunction)(wxEventFunction)&MyFrame::OnEvtPlugInMessage);
777 Connect(wxEVT_OCPN_BUILDSENCTHREAD,
778 (wxObjectEventFunction)(wxEventFunction)&MyFrame::OnSENCEvtThread);
786#if defined(__WXGTK__) || defined(__WXQT__)
787 wxIcon app_icon(opencpn);
795 wxDynamicLibrary dllUser32(_T(
"user32.dll"));
797 pSetSysColors = (SetSysColors_t)dllUser32.GetSymbol(wxT(
"SetSysColors"));
798 pGetSysColor = (GetSysColor_t)dllUser32.GetSymbol(wxT(
"GetSysColor"));
803 m_next_available_plugin_tool_id = ID_PLUGIN_BASE;
806 g_sticky_projection = -1;
809 m_resizeTimer.SetOwner(
this, RESIZE_TIMER);
810 m_recaptureTimer.SetOwner(
this, RECAPTURE_TIMER);
812 assert(g_pRouteMan != 0 &&
"g_pRouteMan not available");
814 [&](wxCommandEvent) { Refresh(); });
815 m_evt_drv_msg_listener.Init(CommDriverRegistry::GetInstance().evt_driver_msg,
820 EnableFullScreenView();
826 FrameTenHzTimer.Stop();
833 wxRouteListNode *node = pRouteList->GetFirst();
836 Route *pRouteDelete = node->GetData();
839 node = node->GetNext();
846 (wxObjectEventFunction)(wxEventFunction)&MyFrame::OnEvtPlugInMessage);
854 switch (event.type) {
855 case SENC_BUILD_STARTED:
858 case SENC_BUILD_DONE_NOERROR:
860 chart =
event.m_ticket->m_chart;
862 chart->PostInit(FULL_INIT, global_color_scheme);
864 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
866 if (cc) cc->ClearS52PLIBStateHash();
871 delete event.m_ticket;
873 case SENC_BUILD_DONE_ERROR:
881void MyFrame::RebuildChartDatabase() {
882 bool b_SetInitialPoint =
false;
885 ArrayOfCDI ChartDirArray;
886 pConfig->LoadChartDirArray(ChartDirArray);
888 if (ChartDirArray.GetCount()) {
891 if (g_NeedDBUpdate == 1) {
893 _(
"OpenCPN needs to update the chart database from config file "
897 wxICON_INFORMATION | wxOK);
905 _(
"Rebuilding chart database from configuration file entries..."));
909 wxString dummy1 = _(
"Elapsed time : ");
910 wxString dummy2 = _(
"Estimated time : ");
911 wxString dummy3 = _(
"Remaining time : ");
912 wxGenericProgressDialog *pprog =
new wxGenericProgressDialog(
913 _(
"OpenCPN Chart Update"), line, 100, NULL,
914 wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
915 wxPD_REMAINING_TIME);
917 ChartData->
Create(ChartDirArray, pprog);
918 ChartData->SaveBinary(ChartListFileName);
923 ChartData->ApplyGroupArray(g_pGroupArray);
928void MyFrame::OnBellsFinished(wxCommandEvent &event) {
929 int bells = wxMin(m_BellsToPlay, 2);
930 if (bells <= 0)
return;
932 wxString soundfile = _T(
"sounds");
933 appendOSDirSlash(&soundfile);
934 soundfile += wxString(bells_sound_file_name[bells - 1], wxConvUTF8);
935 soundfile.Prepend(g_Platform->GetSharedDataDir());
936 wxLogMessage(_T(
"Using bells sound file: ") + soundfile);
938 OcpnSound *sound = bells_sound[bells - 1];
939 sound->SetFinishedCallback(onBellsFinishedCB,
this);
940 auto cmd_sound =
dynamic_cast<SystemCmdSound *
>(sound);
941 if (cmd_sound) cmd_sound->SetCmd(g_CmdSoundString.mb_str(wxConvUTF8));
942 sound->Load(soundfile);
943 if (!sound->IsOk()) {
944 wxLogMessage(_T(
"Failed to load bells sound file: ") + soundfile);
948 m_BellsToPlay -= bells;
951void MyFrame::OnEraseBackground(wxEraseEvent &event) {}
953void MyFrame::OnMaximize(wxMaximizeEvent &event) {
960ColorScheme GetColorScheme() {
return global_color_scheme; }
962ColorScheme MyFrame::GetColorScheme() {
return global_color_scheme; }
964void MyFrame::ReloadAllVP() {
965 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
967 if (cc) cc->ReloadVP();
971void MyFrame::SetAndApplyColorScheme(ColorScheme cs) {
972 global_color_scheme = cs;
976 case GLOBAL_COLOR_SCHEME_DAY:
977 SchemeName = _T(
"DAY");
979 case GLOBAL_COLOR_SCHEME_DUSK:
980 SchemeName = _T(
"DUSK");
982 case GLOBAL_COLOR_SCHEME_NIGHT:
983 SchemeName = _T(
"NIGHT");
986 SchemeName = _T(
"DAY");
990 g_pauidockart->SetMetric(wxAUI_DOCKART_GRADIENT_TYPE, wxAUI_GRADIENT_NONE);
992 g_pauidockart->SetColour(wxAUI_DOCKART_BORDER_COLOUR, wxColour(0, 0, 0));
993 g_pauidockart->SetMetric(wxAUI_DOCKART_PANE_BORDER_SIZE, 1);
994 g_pauidockart->SetColour(wxAUI_DOCKART_SASH_COLOUR, wxColour(0, 0, 0));
995 g_pauidockart->SetMetric(wxAUI_DOCKART_SASH_SIZE, 0);
996 g_pauidockart->SetColour(wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR,
998 g_pauidockart->SetColour(wxAUI_DOCKART_BACKGROUND_COLOUR, wxColour(0, 0, 0));
1027 g_pauidockart->SetColour(wxAUI_DOCKART_SASH_COLOUR, wxColour(0, 0, 0));
1028 g_pauidockart->SetMetric(wxAUI_DOCKART_SASH_SIZE, 6);
1030 g_pauimgr->Update();
1032 g_StyleManager->GetCurrentStyle()->SetColorScheme(cs);
1035 unsigned Usercolortable_index = 0;
1036 for (
unsigned int i = 0; i < UserColorTableArray->GetCount(); i++) {
1037 colTable *ct = (colTable *)UserColorTableArray->Item(i);
1038 if (SchemeName.IsSameAs(*ct->tableName)) {
1039 Usercolortable_index = i;
1044 if (ps52plib) ps52plib->SetPLIBColorScheme(SchemeName, ChartCtxFactory());
1047 pcurrent_user_color_hash =
1048 (wxColorHashMap *)UserColourHashTableArray->Item(Usercolortable_index);
1050 SetSystemColors(cs);
1053 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1056 cc->SetColorScheme(cs);
1057 cc->GetWorldBackgroundChart()->SetColorScheme(cs);
1058 cc->HideChartInfoWindow();
1059 cc->SetQuiltChartHiLiteIndex(-1);
1065 .SetColorScheme(cs, g_Platform->GetDisplayDPmm());
1066 if (ChartData) ChartData->ApplyColorSchemeToCachedCharts(cs);
1069 g_options->SetColorScheme(cs);
1073 console->SetColorScheme(cs);
1077 g_pRouteMan->SetColorScheme(cs, g_Platform->GetDisplayDPmm());
1080 if (g_pMarkInfoDialog) {
1081 g_pMarkInfoDialog->SetColorScheme(cs);
1084 if (pRoutePropDialog) {
1085 pRoutePropDialog->SetColorScheme(cs);
1090 if (g_pais_query_dialog_active) {
1091 bool b_isshown = g_pais_query_dialog_active->IsShown();
1092 int n_mmsi = g_pais_query_dialog_active->GetMMSI();
1093 if (b_isshown) g_pais_query_dialog_active->Show(
false);
1095 g_pais_query_dialog_active->Close();
1098 g_pais_query_dialog_active->
Create(
1099 this, -1, _(
"AIS Target Query"),
1100 wxPoint(g_ais_query_dialog_x, g_ais_query_dialog_y));
1101 g_pais_query_dialog_active->SetMMSI(n_mmsi);
1102 g_pais_query_dialog_active->UpdateText();
1103 if (b_isshown) g_pais_query_dialog_active->Show();
1106 if (pRouteManagerDialog) pRouteManagerDialog->SetColorScheme();
1108 if (g_pAISTargetList) g_pAISTargetList->SetColorScheme();
1110 if (g_pObjectQueryDialog) g_pObjectQueryDialog->SetColorScheme();
1112 ApplyGlobalColorSchemetoStatusBar();
1114 UpdateAllToolbars(cs);
1116 if (g_MainToolbar) {
1117 if (g_MainToolbar->GetColorScheme() != cs) {
1119 bool btoolbarFull = g_bmasterToolbarFull;
1121 g_MainToolbar->SetColorScheme(cs);
1125 if (!btoolbarFull) {
1127 RequestNewMasterToolbar();
1128 g_MainToolbar->SetColorScheme(cs);
1129 CollapseGlobalToolbar();
1132 RequestNewMasterToolbar();
1133 g_MainToolbar->SetColorScheme(cs);
1138 if (g_pi_manager) g_pi_manager->SetColorSchemeForAllPlugIns(cs);
1141void MyFrame::ApplyGlobalColorSchemetoStatusBar(
void) {
1142 if (m_pStatusBar != NULL) {
1143 m_pStatusBar->SetBackgroundColour(GetGlobalColor(_T(
"UIBDR")));
1144 m_pStatusBar->ClearBackground();
1149 if (g_canvasArray.GetCount() > 0)
1150 return g_canvasArray.Item(0);
1154void MyFrame::CancelAllMouseRoute() {
1156 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1158 if (cc) cc->CancelMouseRoute();
1162void MyFrame::NotifyChildrenResize() {}
1164void MyFrame::CreateCanvasLayout(
bool b_useStoredSize) {
1166 if (ChartData) ChartData->PurgeCache();
1169 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1172 g_pauimgr->DetachPane(cc);
1177 for (
unsigned int i = 1; i < g_canvasArray.GetCount(); i++) {
1186 auto &config_array = ConfigMgr::Get().GetCanvasConfigArray();
1189 for (
unsigned int i = 1; i < config_array.GetCount(); i++) {
1190 config_array.Item(i)->canvas = NULL;
1196 for (
unsigned int i = 1; i < g_canvasArray.GetCount(); i++) {
1197 g_canvasArray.RemoveAt(i);
1201 switch (g_canvasConfig) {
1204 if (!g_canvasArray.GetCount() || !config_array.Item(0)) {
1206 g_canvasArray.Add(cc);
1208 cc = g_canvasArray[0];
1214 if (!cc->GetglCanvas()) cc->SetupGlCanvas();
1215 cc->GetglCanvas()->Show();
1218 config_array.Item(0)->canvas = cc;
1222 cc->ApplyCanvasConfig(config_array.Item(0));
1226 cc->ConfigureChartBar();
1227 cc->SetColorScheme(global_color_scheme);
1228 cc->GetCompass()->SetScaleFactor(g_compass_scalefactor);
1229 cc->SetShowGPS(
true);
1231 g_pauimgr->AddPane(cc);
1232 g_pauimgr->GetPane(cc).Name(_T(
"ChartCanvas"));
1233 g_pauimgr->GetPane(cc).Fixed();
1234 g_pauimgr->GetPane(cc).CaptionVisible(
false);
1235 g_pauimgr->GetPane(cc).CenterPane();
1240 if (!g_canvasArray.GetCount() || !g_canvasArray[0]) {
1242 g_canvasArray.Add(cc);
1244 cc = g_canvasArray[0];
1250 if (!cc->GetglCanvas()) cc->SetupGlCanvas();
1253 config_array.Item(0)->canvas = cc;
1255 cc->ApplyCanvasConfig(config_array.Item(0));
1258 cc->ConfigureChartBar();
1259 cc->SetColorScheme(global_color_scheme);
1260 cc->GetCompass()->SetScaleFactor(g_compass_scalefactor);
1261 cc->SetShowGPS(
false);
1263 g_pauimgr->AddPane(cc);
1264 g_pauimgr->GetPane(cc).Name(_T(
"ChartCanvas"));
1265 g_pauimgr->GetPane(cc)
1266 .CaptionVisible(
false)
1268 .CloseButton(
false);
1270 g_pauimgr->GetPane(cc).CenterPane();
1273 g_canvasArray.Add(cc);
1277 if (config_array.GetCount() < 2) {
1279 pcc->configIndex = 1;
1283 pcc->
canvasSize = wxSize(GetClientSize().x / 2, GetClientSize().y);
1284 config_array.Add(pcc);
1287 config_array.Item(1)->canvas = cc;
1289 cc->ApplyCanvasConfig(config_array.Item(1));
1292 cc->ConfigureChartBar();
1293 cc->SetColorScheme(global_color_scheme);
1294 cc->SetShowGPS(
true);
1297 g_pauimgr->AddPane(cc);
1298 g_pauimgr->GetPane(cc).Name(_T(
"ChartCanvas2"));
1299 g_pauimgr->GetPane(cc)
1300 .CaptionVisible(
false)
1302 .CloseButton(
false);
1303 g_pauimgr->GetPane(cc).RightDockable(
true);
1304 g_pauimgr->GetPane(cc).Right();
1307 config_array.Item(1)->canvasSize =
1308 wxSize(GetClientSize().x / 2, GetClientSize().y);
1309 g_pauimgr->GetPane(cc).BestSize(GetClientSize().x / 2, GetClientSize().y);
1314 if (b_useStoredSize) {
1315 int ccw = config_array.Item(1)->canvasSize.x;
1316 int cch = config_array.Item(1)->canvasSize.y;
1319 if (ccw < GetClientSize().x / 10) {
1320 ccw = GetClientSize().x / 2;
1321 cch = GetClientSize().y;
1324 g_pauimgr->GetPane(cc).BestSize(ccw, cch);
1325 cc->SetSize(ccw, cch);
1336 g_focusCanvas = GetPrimaryCanvas();
1339void MyFrame::RequestNewToolbars(
bool bforcenew) {
1340 if (b_inCloseWindow) {
1344 BuildiENCToolbar(bforcenew);
1345 PositionIENCToolbar();
1354void MyFrame::UpdateAllToolbars(ColorScheme cs) {
1355 if (g_iENCToolbar) g_iENCToolbar->SetColorScheme(cs);
1360void MyFrame::SetAllToolbarScale() {
1361 g_toolbar_scalefactor = g_Platform->GetToolbarScaleFactor(g_GUIScaleFactor);
1364void MyFrame::SetGPSCompassScale() {
1365 g_compass_scalefactor = g_Platform->GetCompassScaleFactor(g_GUIScaleFactor);
1369 wxPoint screenPoint = ::wxGetMousePosition();
1372 switch (g_canvasConfig) {
1374 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(0);
1377 if (canvas->GetScreenRect().Contains(
1381 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(1);
1384 if (canvas->GetScreenRect().Contains(
1391 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(0);
1394 if (canvas->GetScreenRect().Contains(
1395 canvas->ScreenToClient(screenPoint)))
1403int MyFrame::GetCanvasIndexUnderMouse() {
1404 wxPoint screenPoint = ::wxGetMousePosition();
1407 switch (g_canvasConfig) {
1409 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(0);
1412 if (canvas->GetScreenRect().Contains(
1416 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(1);
1419 if (canvas->GetScreenRect().Contains(
1426 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(0);
1429 if (canvas->GetScreenRect().Contains(
1430 canvas->ScreenToClient(screenPoint)))
1438bool MyFrame::DropMarker(
bool atOwnShip) {
1445 if (!canvas)
return false;
1452 new RoutePoint(lat, lon, g_default_wp_icon, wxEmptyString, wxEmptyString);
1453 pWP->m_bIsolatedMark =
true;
1454 pSelect->AddSelectableRoutePoint(lat, lon, pWP);
1455 pConfig->AddNewWayPoint(pWP, -1);
1459 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
1460 pRouteManagerDialog->UpdateWptListCtrl();
1465 RefreshAllCanvas(
false);
1470void MyFrame::SwitchKBFocus(
ChartCanvas *pCanvas) {
1471 if (g_canvasConfig != 0) {
1474 int nTargetGTK = -1;
1476 wxWindow *source = FindFocus();
1482 switch (g_canvasConfig) {
1484 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(0);
1487 if (canvas && (canvas == test)) {
1492 cc = ConfigMgr::Get().GetCanvasConfigArray().Item(1);
1495 if (canvas && (canvas == test)) {
1503 int nfinalTarget = nTarget;
1505 nfinalTarget = nTargetGTK;
1507 target = ConfigMgr::Get()
1508 .GetCanvasConfigArray()
1513 target->Refresh(
true);
1524void MyFrame::FastClose() {
1526 FrameTenHzTimer.Stop();
1528 FrameTimer1.Start(1);
1532void MyFrame::OnExit(wxCommandEvent &event) {
1536void MyFrame::OnCloseWindow(wxCloseEvent &event) {
1539 if (b_inCloseWindow) {
1549 if (!g_bDeferredInitDone)
return;
1562 if (b_inCompressAllCharts) {
1566 if (bDBUpdateInProgress)
return;
1568 b_inCloseWindow =
true;
1570 ::wxSetCursor(wxCURSOR_WAIT);
1574 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1576 if (cc && cc->IsMeasureActive()) {
1577 cc->CancelMeasureRoute();
1582 SendPreShutdownHookToPlugins();
1586 if (g_pAISTargetList) {
1587 wxAuiPaneInfo &pane = g_pauimgr->GetPane(g_pAISTargetList);
1588 g_AisTargetList_perspective = g_pauimgr->SavePaneInfo(pane);
1589 g_pauimgr->DetachPane(g_pAISTargetList);
1600 pConfig->SetPath(_T (
"/AUI" ));
1601 pConfig->Write(_T (
"AUIPerspective" ), g_pauimgr->SavePerspective());
1608 if (g_glTextureManager) {
1609 g_glTextureManager->PurgeJobList();
1611 if (g_glTextureManager->GetRunningJobCount()) g_bcompression_wait =
true;
1616 SetCursor(wxCURSOR_WAIT);
1618 RefreshAllCanvas(
true);
1624 RestoreScreenBrightness();
1633 if (g_iENCToolbar) {
1634 wxPoint locn = g_iENCToolbar->GetPosition();
1635 wxPoint tbp_incanvas = GetPrimaryCanvas()->ScreenToClient(locn);
1636 g_iENCToolbarPosY = tbp_incanvas.y;
1637 g_iENCToolbarPosX = tbp_incanvas.x;
1641 g_bframemax = IsMaximized();
1644 FrameTenHzTimer.Stop();
1646 FrameCOGTimer.Stop();
1660 if (g_bAutoAnchorMark) {
1661 bool watching_anchor =
false;
1662 if (pAnchorWatchPoint1)
1663 watching_anchor = (pAnchorWatchPoint1->GetIconName().StartsWith(
1665 if (pAnchorWatchPoint2)
1666 watching_anchor |= (pAnchorWatchPoint2->GetIconName().StartsWith(
1669 wxDateTime now = wxDateTime::Now();
1670 wxTimeSpan uptime = now.Subtract(g_start_time);
1672 if (!watching_anchor && (g_bCruising) && (gSog < 0.5) &&
1673 (uptime.IsLongerThan(wxTimeSpan(0, 30, 0, 0))))
1678 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
1681 if (pr->GetName().StartsWith(_T(
"Anchorage"))) {
1682 double a = gLat - pr->m_lat;
1683 double b = gLon - pr->m_lon;
1684 double l = sqrt((a * a) + (b * b));
1687 if ((l * 60. * 1852.) < (.25 * 1852.)) {
1688 pConfig->DeleteWayPoint(pr);
1689 pSelect->DeleteSelectablePoint(pr, SELTYPE_ROUTEPOINT);
1695 node = node->GetNext();
1698 wxString name = now.Format();
1699 name.Prepend(_(
"Anchorage created "));
1701 new RoutePoint(gLat, gLon, _T(
"anchorage"), name, wxEmptyString);
1702 pWP->m_bShowName =
false;
1703 pWP->m_bIsolatedMark =
true;
1705 pConfig->AddNewWayPoint(pWP, -1);
1710 pConfig->UpdateSettings();
1713 auto plugin_loader = PluginLoader::getInstance();
1714 if (plugin_loader) {
1715 plugin_loader->DeactivateAllPlugIns();
1718 wxLogMessage(_T(
"opencpn::MyFrame exiting cleanly."));
1722 pConfig->UpdateNavObj();
1724 pConfig->m_pNavObjectChangesSet->reset();
1728 pConfig->DeleteGroup(_T (
"/Routes" ));
1729 pConfig->DeleteGroup(_T (
"/Marks" ));
1733 delete g_pageSetupData;
1735 if (g_pAboutDlg) g_pAboutDlg->Destroy();
1736 if (g_pAboutDlgLegacy) g_pAboutDlgLegacy->Destroy();
1741 if (g_pCM93OffsetDialog) {
1742 g_pCM93OffsetDialog->Destroy();
1743 g_pCM93OffsetDialog = NULL;
1751 if (g_iENCToolbar) {
1758 if (g_pAISTargetList) {
1759 g_pAISTargetList->Disconnect_decoder();
1760 g_pAISTargetList->Destroy();
1767 if (RouteManagerDialog::getInstanceFlag()) {
1768 if (pRouteManagerDialog) {
1769 pRouteManagerDialog->Destroy();
1770 pRouteManagerDialog = NULL;
1775 if (ChartData) ChartData->PurgeCache();
1781 g_focusCanvas = NULL;
1784 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1786 if (cc) cc->Destroy();
1789 g_canvasArray.Clear();
1791 g_pauimgr->UnInit();
1801 if (ChartData) ChartData->PurgeCachePlugins();
1803 if (PluginLoader::getInstance())
1804 PluginLoader::getInstance()->UnLoadAllPlugIns();
1807 delete g_pi_manager;
1808 g_pi_manager = NULL;
1811 MyApp &app = wxGetApp();
1812 app.m_comm_bridge.SaveConfig();
1832 auto ®istry = CommDriverRegistry::GetInstance();
1833 registry.CloseAllDrivers();
1836 for (
auto *cp : TheConnectionParams()) {
1841 LayerList::iterator it;
1842 while (pLayerList->GetCount()) {
1843 Layer *lay = pLayerList->GetFirst()->GetData();
1848 NMEALogWindow::Shutdown();
1850 ReleaseApiListeners();
1852 g_MainToolbar = NULL;
1853 g_bTempShowMenuBar =
false;
1855#define THREAD_WAIT_SECONDS 5
1861 if (g_bopengl && g_glTextureManager &&
1862 g_glTextureManager->GetRunningJobCount()) {
1863 g_glTextureManager->ClearAllRasterTextures();
1865 wxLogMessage(_T(
"Starting compressor pool drain"));
1866 wxDateTime now = wxDateTime::Now();
1867 time_t stall = now.GetTicks();
1868 time_t end = stall + THREAD_WAIT_SECONDS;
1871 while (stall < end) {
1872 wxDateTime later = wxDateTime::Now();
1873 stall = later.GetTicks();
1876 msg.Printf(_T(
"Time: %d Job Count: %d"), n_comploop,
1877 g_glTextureManager->GetRunningJobCount());
1879 if (!g_glTextureManager->GetRunningJobCount())
break;
1885 fmsg.Printf(_T(
"Finished compressor pool drain..Time: %d Job Count: %d"),
1886 n_comploop, g_glTextureManager->GetRunningJobCount());
1889 delete g_glTextureManager;
1891 uninitIXNetSystem();
1895 wxLogMessage(_T(
"gFrame destroyed."));
1898#ifndef USE_ANDROID_GLES2
1899 qDebug() <<
"Calling OnExit()";
1903 wxTheApp->ExitMainLoop();
1906void MyFrame::OnMove(wxMoveEvent &event) {
1907 auto idx = wxDisplay::GetFromWindow(
this);
1908 if (idx != wxNOT_FOUND && g_current_monitor !=
static_cast<size_t>(idx) &&
1909 static_cast<size_t>(idx) < g_monitor_info.size()) {
1910 g_current_monitor = idx;
1916 g_current_monitor_dip_px_ratio =
1917 g_monitor_info[idx].width_px / g_monitor_info[idx].width;
1920 DEBUG_LOG <<
"Moved to " << idx
1921#if wxCHECK_VERSION(3, 1, 6)
1922 <<
" PPI: " << wxDisplay(idx).GetPPI().GetX() <<
"x"
1923 << wxDisplay(idx).GetPPI().GetY()
1924 <<
" SF wxDisplay: " << wxDisplay(idx).GetScaleFactor()
1926 <<
" Size wxDisplay: " << wxDisplay(idx).GetGeometry().GetWidth()
1927 <<
"x" << wxDisplay(idx).GetGeometry().GetHeight()
1928 <<
" MM wxDisplay: " << wxGetDisplaySizeMM().GetX() <<
"x"
1929 << wxGetDisplaySizeMM().GetY()
1930 <<
" Name wxDisplay: " << wxDisplay(idx).GetName().c_str()
1931 <<
" Real: " << g_monitor_info[idx].width_mm <<
"x"
1932 << g_monitor_info[idx].height_mm <<
"mm "
1933 << g_monitor_info[idx].width_mm <<
"x"
1934 << g_monitor_info[idx].height_mm <<
"mm "
1935 << g_monitor_info[idx].width <<
"x" << g_monitor_info[idx].height
1936 <<
"DIP " << g_monitor_info[idx].width_px <<
"x"
1937 << g_monitor_info[idx].height_px <<
"px"
1938 << g_monitor_info[idx].scale <<
"%";
1939 if (g_config_display_size_manual) {
1940 if (g_config_display_size_mm.size() >
static_cast<size_t>(idx)) {
1941 g_display_size_mm = g_config_display_size_mm[idx];
1944 g_display_size_mm = g_monitor_info[idx].width_mm;
1948 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1951 cc->SetMUIBarPosition();
1960 UpdateGPSCompassStatusBoxes();
1962 if (console && console->IsShown()) PositionConsole();
1970 PositionIENCToolbar();
1976 g_nframewin_posx = GetPosition().x;
1977 g_nframewin_posy = GetPosition().y;
1980void MyFrame::ProcessCanvasResize(
void) {
1981 UpdateGPSCompassStatusBoxes(
true);
1983 if (console && console->IsShown()) PositionConsole();
1985 PositionIENCToolbar();
1988 TriggerRecaptureTimer();
1992void MyFrame::TriggerRecaptureTimer() {
1993 m_recaptureTimer.Start(
1994 1000, wxTIMER_ONE_SHOT);
1997void MyFrame::OnRecaptureTimer(wxTimerEvent &event) { Raise(); }
1999void MyFrame::SetCanvasSizes(wxSize frameSize) {
2000 if (!g_canvasArray.GetCount())
return;
2003 int cccw = frameSize.x;
2004 int ccch = frameSize.y;
2008 switch (g_canvasConfig) {
2012 cc = g_canvasArray.Item(0);
2014 cc->GetSize( &cur_width, &cur_height );
2015 if( ( cur_width != cccw ) || ( cur_height != ccch ) ) {
2016 if( g_pauimgr->GetPane( cc ).IsOk() )
2017 g_pauimgr->GetPane( cc ).BestSize( cccw, ccch );
2019 cc->SetSize( 0, 0, cccw, ccch );
2027 cc = g_canvasArray.Item(1);
2029 int ccw = g_canvasConfigArray.Item(1)->canvasSize.x;
2030 int cch = g_canvasConfigArray.Item(1)->canvasSize.y;
2032 ccw = wxMin(ccw, cccw * 8 / 10);
2033 ccw = wxMax(ccw, cccw * 2 / 10);
2037 g_canvasConfigArray.Item(1)->canvasSize = wxSize(ccw, cch);
2044 g_pauimgr->GetPane(cc).MinSize(ccw, cch);
2045 g_pauimgr->GetPane(cc).Fixed();
2046 g_pauimgr->Update();
2049 g_pauimgr->GetPane(cc).Resizable();
2061void MyFrame::OnIconize(wxIconizeEvent &event) {
2063 if (g_MainToolbar) {
2064 g_MainToolbar->Show(!event.IsIconized());
2066 if (g_iENCToolbar) {
2067 g_iENCToolbar->Show(!event.IsIconized());
2071 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2073 if (cc && cc->GetMUIBar()) {
2074 if (cc->GetMUIBar()->GetCanvasOptions()) {
2075 if (cc->GetMUIBar()->GetCanvasOptions()->IsShown()) {
2076 cc->GetMUIBar()->PushCanvasOptions();
2085void MyFrame::OnSize(wxSizeEvent &event) { ODoSetSize(); }
2087void MyFrame::ODoSetSize(
void) {
2089 GetClientSize(&x, &y);
2092 if (m_pStatusBar != NULL) {
2093 m_StatusBarFieldCount = g_Platform->GetStatusBarFieldCount();
2094 int currentCount = m_pStatusBar->GetFieldsCount();
2095 if (currentCount != m_StatusBarFieldCount) {
2096 if ((currentCount > 0) && (currentCount < 7)) {
2099 int widths[] = {2, 2, 2, 2, 2, 2};
2100 m_pStatusBar->SetStatusWidths(currentCount, widths);
2103 m_pStatusBar->SetFieldsCount(m_StatusBarFieldCount);
2106 if (m_StatusBarFieldCount) {
2111 if (m_StatusBarFieldCount > 2) {
2112 int widths[] = {-6, -5, -5, -6, -4};
2113 m_pStatusBar->SetStatusWidths(m_StatusBarFieldCount, widths);
2114 }
else if (m_StatusBarFieldCount == 2) {
2115 int cwidth = x * 90 / 100;
2116 int widths[] = {100, 100};
2117 widths[0] = cwidth * 6.4 / 10.0;
2118 widths[1] = cwidth * 3.6 / 10.0;
2119 m_pStatusBar->SetStatusWidths(m_StatusBarFieldCount, widths);
2121 int widths[] = {100, 100};
2122 widths[0] = x * 90 / 100;
2123 m_pStatusBar->SetStatusWidths(m_StatusBarFieldCount, widths);
2126 int styles[] = {wxSB_FLAT, wxSB_FLAT, wxSB_FLAT,
2127 wxSB_FLAT, wxSB_FLAT, wxSB_FLAT};
2128 m_pStatusBar->SetStatusStyles(m_StatusBarFieldCount, styles);
2130 wxString sogcog(_T(
"SOG --- ") + getUsrSpeedUnit() + +_T(
" ") +
2131 _T(
" COG ---\u00B0"));
2132 m_pStatusBar->SetStatusText(sogcog, STAT_FIELD_SOGCOG);
2140 m_pStatusBar->GetFieldRect(0, stat_box);
2143 int max_font_size = wxMin((stat_box.width / 28), (stat_box.height));
2145 wxFont sys_font = *wxNORMAL_FONT;
2146 int try_font_size = sys_font.GetPointSize();
2149 int min_font_size = 10;
2159 wxFont *statusBarFont =
2160 FontMgr::Get().
GetFont(_(
"StatusBar"), try_font_size);
2161 int font_size = statusBarFont->GetPointSize();
2163 font_size = wxMin(font_size,
2166 wxMax(font_size, min_font_size);
2169 font_size = statusBarFont->GetPointSize();
2173 font_size /= OCPN_GetDisplayContentScaleFactor();
2176 font_size, statusBarFont->GetFamily(), statusBarFont->GetStyle(),
2177 statusBarFont->GetWeight(),
false, statusBarFont->GetFaceName());
2179 int min_height = stat_box.height;
2181 m_pStatusBar->SetFont(*pstat_font);
2182 m_pStatusBar->SetForegroundColour(
2183 FontMgr::Get().GetFontColor(_(
"StatusBar")));
2185 min_height = (pstat_font->GetPointSize() * getAndroidDisplayDensity()) + 10;
2187 (min_height >> 1) * 2;
2188 m_pStatusBar->SetMinHeight(min_height);
2197 SetCanvasSizes(GetClientSize());
2199 UpdateGPSCompassStatusBoxes(
true);
2201 if (console) PositionConsole();
2204 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2206 if (cc) cc->FormatPianoKeys();
2210 if (g_MainToolbar) {
2211 wxSize szBefore = g_MainToolbar->GetToolbarSize();
2212 g_MainToolbar->SetGeometry(GetPrimaryCanvas()->GetCompass()->IsShown(),
2213 GetPrimaryCanvas()->GetCompass()->GetRect());
2214 g_MainToolbar->Realize();
2216 if (szBefore != g_MainToolbar->GetToolbarSize())
2217 g_MainToolbar->RefreshToolbar();
2226 if (g_pi_manager) g_pi_manager->SendResizeEventToAllPlugIns(x, y);
2239 options_lastWindowSize = wxSize(0, 0);
2240 options_lastWindowPos = wxPoint(0, 0);
2247 if (!b_inCloseWindow) {
2248 if (g_options) g_options->Raise();
2250 resizeAndroidPersistents();
2255 if (g_pauimgr) g_pauimgr->Update();
2258void MyFrame::PositionConsole(
void) {
2259 if (NULL == GetPrimaryCanvas())
return;
2261 int ccx, ccy, ccsx, ccsy, consx, consy;
2263 if (g_canvasConfig > 0) consoleHost = g_canvasArray[1];
2266 consoleHost->GetSize(&ccsx, &ccsy);
2267 consoleHost->GetPosition(&ccx, &ccy);
2269 GetPrimaryCanvas()->GetSize(&ccsx, &ccsy);
2270 GetPrimaryCanvas()->GetPosition(&ccx, &ccy);
2271 consoleHost = GetPrimaryCanvas();
2276 if (consoleHost->GetCompass()) {
2277 wxRect compass_rect = consoleHost->GetCompass()->
GetRect();
2279 if (compass_rect.y < 100)
2280 yOffset = compass_rect.y + compass_rect.height + 45;
2284 console->GetSize(&consx, &consy);
2286 wxPoint screen_pos =
2287 ClientToScreen(wxPoint(ccx + ccsx - consx - 2, ccy + yOffset));
2288 console->Move(screen_pos);
2291void MyFrame::UpdateAllFonts() {
2293 console->UpdateFonts();
2300 DestroyPersistentDialogs();
2302 if (pWayPointMan) pWayPointMan->ClearRoutePointFonts();
2307void MyFrame::DestroyPersistentDialogs() {
2308 if (g_pais_query_dialog_active) {
2309 g_pais_query_dialog_active->Hide();
2310 g_pais_query_dialog_active->Destroy();
2311 g_pais_query_dialog_active = NULL;
2314 if (RoutePropDlgImpl::getInstanceFlag() && pRoutePropDialog) {
2315 pRoutePropDialog->Hide();
2316 pRoutePropDialog->Destroy();
2317 pRoutePropDialog = NULL;
2320 if (TrackPropDlg::getInstanceFlag() && pTrackPropDialog) {
2321 pTrackPropDialog->Hide();
2322 pTrackPropDialog->Destroy();
2323 pTrackPropDialog = NULL;
2326 if (g_pMarkInfoDialog) {
2327 g_pMarkInfoDialog->Hide();
2328 g_pMarkInfoDialog->Destroy();
2329 g_pMarkInfoDialog = NULL;
2332 if (g_pObjectQueryDialog) {
2333 g_pObjectQueryDialog->Hide();
2334 g_pObjectQueryDialog->Destroy();
2335 g_pObjectQueryDialog = NULL;
2339void MyFrame::RefreshGroupIndices(
void) {
2341 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2343 if (cc) cc->canvasRefreshGroupIndex();
2347void MyFrame::OnToolLeftClick(wxCommandEvent &event) {
2348 if (g_MainToolbar) g_MainToolbar->HideTooltip();
2350 switch (event.GetId()) {
2351 case ID_MENU_SCALE_OUT:
2352 DoStackDelta(GetPrimaryCanvas(), 1);
2356 case ID_MENU_SCALE_IN:
2357 DoStackDelta(GetPrimaryCanvas(), -1);
2361 case ID_MENU_ZOOM_IN: {
2362 if (GetFocusCanvas()) {
2363 GetFocusCanvas()->
ZoomCanvas(g_plus_minus_zoom_factor,
false);
2368 case ID_MENU_ZOOM_OUT: {
2369 if (GetFocusCanvas()) {
2370 GetFocusCanvas()->
ZoomCanvas(1.0 / g_plus_minus_zoom_factor,
false);
2375 case ID_MENU_ROUTE_NEW: {
2376 if (GetFocusCanvas()) {
2377 if (0 == GetFocusCanvas()->m_routeState) {
2378 GetFocusCanvas()->StartRoute();
2380 GetFocusCanvas()->FinishRoute();
2386 case ID_MENU_TOOL_MEASURE: {
2387 GetPrimaryCanvas()->StartMeasureRoute();
2391 case ID_MENU_TOOL_NMEA_DBG_LOG:
2392 if (!wxWindow::FindWindowByName(
"NmeaDebugWindow")) {
2393 auto top_window = wxWindow::FindWindowByName(kTopLevelWindowName);
2394 NMEALogWindow::GetInstance().Create(top_window, 35);
2396 wxWindow::FindWindowByName(
"NmeaDebugWindow")->Show();
2399 case ID_MENU_MARK_BOAT: {
2404 case ID_MENU_MARK_CURSOR: {
2409 case ID_MENU_NAV_FOLLOW: {
2410 if (gFrame->GetPrimaryCanvas())
2411 gFrame->GetPrimaryCanvas()->TogglebFollow();
2415 case ID_MENU_CHART_OUTLINES: {
2416 ToggleChartOutlines(GetFocusCanvas());
2420 case ID_MENU_CHART_QUILTING: {
2421 ToggleQuiltMode(GetFocusCanvas());
2425 case ID_MENU_UI_CHARTBAR: {
2426 ToggleChartBar(GetFocusCanvas());
2430 case ID_MENU_ENC_TEXT:
2432 ToggleENCText(GetFocusCanvas());
2435 case ID_MENU_ENC_LIGHTS: {
2436 ToggleLights(GetFocusCanvas());
2439 case ID_MENU_ENC_SOUNDINGS: {
2440 ToggleSoundings(GetFocusCanvas());
2443 case ID_MENU_ENC_ANCHOR: {
2444 ToggleAnchor(GetFocusCanvas());
2447 case ID_MENU_ENC_DATA_QUALITY: {
2448 ToggleDataQuality(GetFocusCanvas());
2451 case ID_MENU_SHOW_NAVOBJECTS: {
2452 ToggleNavobjects(GetFocusCanvas());
2456 case ID_MENU_AIS_TARGETS: {
2457 ToggleAISDisplay(GetFocusCanvas());
2460 case ID_MENU_AIS_MOORED_TARGETS: {
2461 g_bHideMoored = !g_bHideMoored;
2464 case ID_MENU_AIS_SCALED_TARGETS: {
2465 ToggleAISMinimizeTargets(GetFocusCanvas());
2469 case ID_MENU_AIS_TARGETLIST: {
2470 if (GetPrimaryCanvas()) GetPrimaryCanvas()->ShowAISTargetList();
2474 case ID_MENU_AIS_TRACKS: {
2475 g_bAISShowTracks = !g_bAISShowTracks;
2476 SetMenubarItemState(ID_MENU_AIS_TRACKS, g_bAISShowTracks);
2480 case ID_MENU_AIS_CPADIALOG: {
2481 g_bAIS_CPA_Alert = !g_bAIS_CPA_Alert;
2482 SetMenubarItemState(ID_MENU_AIS_CPADIALOG, g_bAIS_CPA_Alert);
2483 m_pMenuBar->Enable(ID_MENU_AIS_CPASOUND, g_bAIS_CPA_Alert);
2484 if (g_bAIS_CPA_Alert) {
2485 SetMenubarItemState(ID_MENU_AIS_CPASOUND, g_bAIS_CPA_Alert_Audio);
2490 case ID_MENU_AIS_CPASOUND: {
2491 g_bAIS_CPA_Alert_Audio = !g_bAIS_CPA_Alert_Audio;
2492 SetMenubarItemState(ID_MENU_AIS_CPASOUND, g_bAIS_CPA_Alert_Audio);
2496 case ID_MENU_AIS_CPAWARNING: {
2497 if (GetPrimaryCanvas()) GetPrimaryCanvas()->ToggleCPAWarn();
2498 SetMenubarItemState(ID_MENU_AIS_CPAWARNING, g_bCPAWarn);
2502 case wxID_PREFERENCES:
2504 g_MainToolbar->HideTooltip();
2509 case ID_SETTINGS_NEW: {
2514 case ID_SETTINGS_DELETE: {
2516 g_options =
nullptr;
2520 case ID_MENU_SETTINGS_BASIC: {
2523 androidDisableFullScreen();
2524 g_MainToolbar->HideTooltip();
2525 DoAndroidPreferences();
2532 case ID_MENU_UI_FULLSCREEN: {
2537 case ID_MENU_SHOW_CURRENTS: {
2538 GetFocusCanvas()->ShowCurrents(!GetFocusCanvas()->GetbShowCurrent());
2539 GetFocusCanvas()->ReloadVP();
2540 GetFocusCanvas()->Refresh(
false);
2544 case ID_MENU_SHOW_TIDES: {
2545 GetFocusCanvas()->ShowTides(!GetFocusCanvas()->GetbShowTide());
2546 GetFocusCanvas()->ReloadVP();
2547 GetFocusCanvas()->Refresh(
false);
2553 g_Platform->DoHelpDialog();
2558 g_Platform->LaunchLocalHelp();
2567 case ID_MENU_UI_COLSCHEME:
2568 case ID_COLSCHEME: {
2569 ToggleColorScheme();
2578 case ID_MENU_OQUIT: {
2583 case ID_MENU_ROUTE_MANAGER:
2584 case ID_ROUTEMANAGER: {
2585 pRouteManagerDialog = RouteManagerDialog::getInstance(
2588 if (pRouteManagerDialog->IsShown())
2589 pRouteManagerDialog->Hide();
2591 pRouteManagerDialog->UpdateRouteListCtrl();
2592 pRouteManagerDialog->UpdateTrkListCtrl();
2593 pRouteManagerDialog->UpdateWptListCtrl();
2594 pRouteManagerDialog->UpdateLayListCtrl();
2596 pRouteManagerDialog->Show();
2600 pRouteManagerDialog->Centre();
2601 pRouteManagerDialog->Raise();
2607 case ID_MENU_NAV_TRACK:
2609 if (!g_bTrackActive) {
2611 g_bTrackCarryOver =
true;
2614 if (pConfig && pConfig->IsChangesFileDirty()) {
2615 pConfig->UpdateNavObj(
true);
2617 g_bTrackCarryOver =
false;
2618 RefreshAllCanvas(
true);
2623 case ID_MENU_CHART_NORTHUP: {
2624 SetUpMode(GetPrimaryCanvas(), NORTH_UP_MODE);
2627 case ID_MENU_CHART_COGUP: {
2628 SetUpMode(GetPrimaryCanvas(), COURSE_UP_MODE);
2631 case ID_MENU_CHART_HEADUP: {
2632 SetUpMode(GetPrimaryCanvas(), HEAD_UP_MODE);
2636 case ID_MENU_MARK_MOB:
2642 case ID_MASTERTOGGLE: {
2643 if (g_MainToolbar) {
2644 wxString tip = _(
"Show Toolbar");
2645 if (!g_bmasterToolbarFull) tip = _(
"Hide Toolbar");
2646 if (g_MainToolbar->GetToolbar())
2647 g_MainToolbar->GetToolbar()->SetToolShortHelp(ID_MASTERTOGGLE, tip);
2649 g_bmasterToolbarFull = !g_bmasterToolbarFull;
2652 if (g_bmasterToolbarFull)
2653 m_nMasterToolCountShown =
2654 g_MainToolbar->GetToolCount() -
2657 m_nMasterToolCountShown = 2;
2659 m_nMasterToolCountShown =
2660 g_MainToolbar->GetToolShowCount();
2662 ToolbarAnimateTimer.Start(10, wxTIMER_ONE_SHOT);
2670 case ID_CMD_SELECT_CHART_TYPE: {
2671 selectChartDisplay(event.GetExtraLong(), -1);
2675 case ID_CMD_SELECT_CHART_FAMILY: {
2676 selectChartDisplay(-1, event.GetExtraLong());
2680 case ID_CMD_APPLY_SETTINGS: {
2681 applySettingsString(event.GetString());
2683 androidRestoreFullScreen();
2689 case ID_CMD_NULL_REFRESH: {
2694 case ID_CMD_SETVP: {
2695 setStringVP(event.GetString());
2699 case ID_CMD_INVALIDATE: {
2705 case ID_CMD_POST_JSON_TO_PLUGINS: {
2711 int numErrors = reader.
Parse(event.GetString(), &root);
2712 if (numErrors == 0) {
2713 if (root[_T(
"MessageID")].IsString()) {
2714 wxString MsgID = root[_T(
"MessageID")].
AsString();
2715 SendPluginMessage(MsgID, event.GetString());
2725 if (g_iENCToolbar) {
2726 g_iENCToolbar->OnToolLeftClick(event);
2736 g_MainToolbar->HideTooltip();
2738 ArrayOfPlugInToolbarTools tool_array =
2739 g_pi_manager->GetPluginToolbarToolArray();
2740 for (
unsigned int i = 0; i < tool_array.size(); i++) {
2742 if (event.GetId() == pttc->id) {
2743 if (pttc->m_pplugin)
2744 pttc->m_pplugin->OnToolbarToolCallback(pttc->id);
2762 if (g_MainToolbar) g_MainToolbar->Realize();
2765bool MyFrame::SetGlobalToolbarViz(
bool viz) {
2766 bool viz_now = g_bmasterToolbarFull;
2768 g_MainToolbar->HideTooltip();
2769 wxString tip = _(
"Show Toolbar");
2771 tip = _(
"Hide Toolbar");
2772 if (g_MainToolbar->GetToolbar())
2773 g_MainToolbar->GetToolbar()->SetToolShortHelp(ID_MASTERTOGGLE, tip);
2776 bool toggle =
false;
2777 if (viz && !g_bmasterToolbarFull)
2780 else if (!viz && g_bmasterToolbarFull)
2784 g_bmasterToolbarFull = !g_bmasterToolbarFull;
2787 if (g_bmasterToolbarFull)
2788 m_nMasterToolCountShown =
2789 g_MainToolbar->GetToolCount() -
2792 m_nMasterToolCountShown = 2;
2794 m_nMasterToolCountShown =
2795 g_MainToolbar->GetToolShowCount();
2797 ToolbarAnimateTimer.Start(10, wxTIMER_ONE_SHOT);
2803void MyFrame::ScheduleDeleteSettingsDialog() {
2804 wxCommandEvent evt(wxEVT_COMMAND_MENU_SELECTED);
2805 evt.SetId(ID_SETTINGS_DELETE);
2806 GetEventHandler()->AddPendingEvent(evt);
2809void MyFrame::ScheduleSettingsDialog() {
2810 wxCommandEvent evt(wxEVT_COMMAND_MENU_SELECTED);
2811 evt.SetId(ID_SETTINGS);
2812 GetEventHandler()->AddPendingEvent(evt);
2815void MyFrame::ScheduleSettingsDialogNew() {
2816 wxCommandEvent evt(wxEVT_COMMAND_MENU_SELECTED);
2817 evt.SetId(ID_SETTINGS_NEW);
2818 GetEventHandler()->AddPendingEvent(evt);
2821void MyFrame::ScheduleReconfigAndSettingsReload(
bool reload,
bool new_dialog) {
2822 UpdateCanvasConfigDescriptors();
2824 if ((g_canvasConfig > 0) && (last_canvasConfig == 0))
2825 CreateCanvasLayout(
true);
2827 CreateCanvasLayout();
2829 g_pauimgr->Update();
2831 ConfigureStatusBar();
2832 wxSize lastOptSize = options_lastWindowSize;
2837 options_lastWindowSize = lastOptSize;
2841 ScheduleSettingsDialogNew();
2843 ScheduleSettingsDialog();
2848 if ((g_canvasConfig != 0) && g_focusCanvas)
2849 return g_focusCanvas;
2851 return GetPrimaryCanvas();
2854void MyFrame::OnToolbarAnimateTimer(wxTimerEvent &event) {
2855 if (g_bmasterToolbarFull) {
2856#ifndef OCPN_TOOLBAR_ANIMATE
2857 m_nMasterToolCountShown = (int)g_MainToolbar->GetToolCount();
2860 if (m_nMasterToolCountShown < (
int)g_MainToolbar->GetToolCount()) {
2861 m_nMasterToolCountShown++;
2862 g_MainToolbar->SetToolShowCount(m_nMasterToolCountShown);
2863 g_MainToolbar->Realize();
2864 g_MainToolbar->RefreshToolbar();
2866 ToolbarAnimateTimer.Start(20, wxTIMER_ONE_SHOT);
2868 g_MainToolbar->SetToolShowCount(m_nMasterToolCountShown);
2869 g_MainToolbar->GetToolbar()->InvalidateBitmaps();
2870 g_MainToolbar->Realize();
2871 g_MainToolbar->RefreshToolbar();
2874#ifndef OCPN_TOOLBAR_ANIMATE
2875 m_nMasterToolCountShown = 1;
2877 if (m_nMasterToolCountShown > 1) {
2878 m_nMasterToolCountShown--;
2879 g_MainToolbar->SetToolShowCount(m_nMasterToolCountShown);
2880 g_MainToolbar->Realize();
2881 g_MainToolbar->RefreshToolbar();
2882 ToolbarAnimateTimer.Start(10, wxTIMER_ONE_SHOT);
2884 g_MainToolbar->SetToolShowCount(m_nMasterToolCountShown);
2885 g_MainToolbar->GetToolbar()->InvalidateBitmaps();
2886 g_MainToolbar->Realize();
2887 g_MainToolbar->RefreshToolbar();
2892void MyFrame::InvalidateAllGL() {
2895 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2905void MyFrame::RefreshAllCanvas(
bool bErase) {
2907 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2910 cc->Refresh(bErase);
2915void MyFrame::setStringVP(wxString VPS) {
2920 wxStringTokenizer tkz(VPS, _T(
";"));
2922 wxString token = tkz.GetNextToken();
2924 token.ToDouble(&lat);
2926 token = tkz.GetNextToken();
2928 token.ToDouble(&lon);
2930 token = tkz.GetNextToken();
2932 token.ToDouble(&scale_ppm);
2934 cc->
SetViewPoint(lat, lon, scale_ppm, 0, cc->GetVPRotation());
2937void MyFrame::DoSettingsNew() {
2939 g_options =
nullptr;
2944void MyFrame::DoSettings() {
2948 ApplyGlobalSettings(
true);
2951 bool b_loadHarmonics =
false;
2952 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2955 if (cc->GetbShowCurrent() || cc->GetbShowTide()) b_loadHarmonics =
true;
2958 if (b_loadHarmonics) LoadHarmonics();
2966 g_bShowChartBar = !g_bShowChartBar;
2968 if (g_bShowChartBar) cc->m_brepaint_piano =
true;
2973 if (g_bShowChartBar) {
2975 UpdateControlBar(cc);
2978 SetMenubarItemState(ID_MENU_UI_CHARTBAR, g_bShowChartBar);
2981void MyFrame::ToggleColorScheme() {
2982 static bool lastIsNight;
2983 ColorScheme s = GetColorScheme();
2986 if (lastIsNight && is == 3)
2989 lastIsNight =
false;
2991 if (lastIsNight) is = 2;
2992 if (is == 3) lastIsNight =
true;
2993 s = (ColorScheme)is;
2994 if (s == N_COLOR_SCHEMES) s = GLOBAL_COLOR_SCHEME_RGB;
2996 SetAndApplyColorScheme(s);
2999void MyFrame::ToggleFullScreen() {
3000 bool to = !IsFullScreen();
3005 long style = wxFULLSCREEN_NOBORDER | wxFULLSCREEN_NOCAPTION;
3007 ShowFullScreen(to, style);
3010 UpdateAllToolbars(global_color_scheme);
3012 UpdateControlBar(GetPrimaryCanvas());
3014 TriggerRecaptureTimer();
3017void MyFrame::ActivateMOB(
void) {
3019 wxDateTime mob_time = wxDateTime::Now();
3020 wxString mob_label(_(
"MAN OVERBOARD"));
3021 mob_label += _(
" at ");
3022 mob_label += mob_time.FormatTime();
3023 mob_label += _(
" on ");
3024 mob_label += mob_time.FormatISODate();
3027 new RoutePoint(gLat, gLon, _T (
"mob" ), mob_label, wxEmptyString);
3028 pWP_MOB->SetShared(
true);
3029 pWP_MOB->m_bIsolatedMark =
true;
3030 pWP_MOB->SetWaypointArrivalRadius(
3032 pWP_MOB->SetUseSca(
false);
3033 pSelect->AddSelectableRoutePoint(gLat, gLon, pWP_MOB);
3034 pConfig->AddNewWayPoint(pWP_MOB, -1);
3036 if (bGPSValid && !std::isnan(gCog) && !std::isnan(gSog)) {
3039 ll_gc_ll(gLat, gLon, gCog, 1.0, &zlat, &zlon);
3042 new RoutePoint(zlat, zlon, g_default_wp_icon,
3043 wxString(_(
"1.0 NM along COG")), wxEmptyString);
3044 pSelect->AddSelectableRoutePoint(zlat, zlon, pWP_src);
3047 pRouteList->Append(temp_route);
3049 temp_route->AddPoint(pWP_src);
3050 temp_route->AddPoint(pWP_MOB);
3052 pSelect->AddSelectableRouteSegment(gLat, gLon, zlat, zlon, pWP_src, pWP_MOB,
3055 temp_route->m_RouteNameString = _(
"Temporary MOB Route");
3056 temp_route->m_RouteStartString = _(
"Assumed 1 Mile Point");
3058 temp_route->m_RouteEndString = mob_label;
3060 temp_route->m_bDeleteOnArrival =
false;
3062 temp_route->SetRouteArrivalRadius(-1.0);
3064 if (g_pRouteMan->GetpActiveRoute()) g_pRouteMan->DeactivateRoute();
3065 g_pRouteMan->ActivateRoute(temp_route, pWP_MOB);
3068 v[_T(
"GUID")] = temp_route->m_GUID;
3069 wxString msg_id(_T(
"OCPN_MAN_OVERBOARD"));
3070 SendJSONMessageToAllPlugins(msg_id, v);
3073 if (RouteManagerDialog::getInstanceFlag()) {
3074 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
3075 pRouteManagerDialog->UpdateRouteListCtrl();
3076 pRouteManagerDialog->UpdateWptListCtrl();
3081 RefreshAllCanvas(
false);
3083 wxString mob_message(_(
"MAN OVERBOARD"));
3084 mob_message += _(
" Time: ");
3085 mob_message += mob_time.Format();
3086 mob_message += _(
" Position: ");
3087 mob_message += toSDMM(1, gLat);
3088 mob_message += _T(
" ");
3089 mob_message += toSDMM(2, gLon);
3090 wxLogMessage(mob_message);
3092void MyFrame::TrackOn(
void) {
3093 g_bTrackActive =
true;
3096 g_TrackList.push_back(g_pActiveTrack);
3097 if (pConfig) pConfig->AddNewTrack(g_pActiveTrack);
3099 g_pActiveTrack->Start();
3102 SetMasterToolbarItemState(ID_TRACK, g_bTrackActive);
3104 g_MainToolbar->SetToolShortHelp(ID_TRACK, _(
"Disable Tracking"));
3106 SetMenubarItemState(ID_MENU_NAV_TRACK, g_bTrackActive);
3109 androidSetTrackTool(
true);
3112 if (RouteManagerDialog::getInstanceFlag()) {
3113 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
3114 pRouteManagerDialog->UpdateTrkListCtrl();
3115 pRouteManagerDialog->UpdateRouteListCtrl();
3121 now = now.Now().ToUTC();
3122 wxString name = g_pActiveTrack->GetName();
3123 if (name.IsEmpty()) {
3124 TrackPoint *tp = g_pActiveTrack->GetPoint(0);
3125 if (tp->GetCreateTime().IsValid())
3126 name = tp->GetCreateTime().FormatISODate() + _T(
" ") +
3127 tp->GetCreateTime().FormatISOTime();
3129 name = _(
"(Unnamed Track)");
3131 v[_T(
"Name")] = name;
3132 v[_T(
"GUID")] = g_pActiveTrack->m_GUID;
3133 wxString msg_id(_T(
"OCPN_TRK_ACTIVATED"));
3134 SendJSONMessageToAllPlugins(msg_id, v);
3135 g_FlushNavobjChangesTimeout =
3139Track *MyFrame::TrackOff(
bool do_add_point) {
3140 Track *return_val = g_pActiveTrack;
3142 if (g_pActiveTrack) {
3144 wxString msg_id(_T(
"OCPN_TRK_DEACTIVATED"));
3145 v[_T(
"GUID")] = g_pActiveTrack->m_GUID;
3146 SendJSONMessageToAllPlugins(msg_id, v);
3148 g_pActiveTrack->Stop(do_add_point);
3150 if (g_pActiveTrack->GetnPoints() < 2) {
3151 RoutemanGui(*g_pRouteMan).DeleteTrack(g_pActiveTrack);
3154 if (g_bTrackDaily) {
3155 Track *pExtendTrack = g_pActiveTrack->DoExtendDaily();
3157 RoutemanGui(*g_pRouteMan).DeleteTrack(g_pActiveTrack);
3158 return_val = pExtendTrack;
3162 g_pActiveTrack = NULL;
3165 g_bTrackActive =
false;
3167 if (RouteManagerDialog::getInstanceFlag()) {
3168 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
3169 pRouteManagerDialog->UpdateTrkListCtrl();
3170 pRouteManagerDialog->UpdateRouteListCtrl();
3174 SetMasterToolbarItemState(ID_TRACK, g_bTrackActive);
3176 g_MainToolbar->SetToolShortHelp(ID_TRACK, _(
"Enable Tracking"));
3177 SetMenubarItemState(ID_MENU_NAV_TRACK, g_bTrackActive);
3180 androidSetTrackTool(
false);
3183 g_FlushNavobjChangesTimeout =
3189bool MyFrame::ShouldRestartTrack(
void) {
3190 if (!g_pActiveTrack || !g_bTrackDaily)
return false;
3191 time_t now = wxDateTime::Now().GetTicks();
3192 time_t today = wxDateTime::Today().GetTicks();
3194 switch (g_track_rotate_time_type) {
3196 rotate_at = g_track_rotate_time + wxRound(gLon * 3600. / 15.);
3198 case TIME_TYPE_COMPUTER:
3199 rotate_at = g_track_rotate_time;
3203 wxDateTime::Now().GetTicks() - wxDateTime::Now().ToUTC().GetTicks();
3204 rotate_at = g_track_rotate_time + utc_offset;
3207 if (rotate_at > 86400)
3209 else if (rotate_at < 0)
3211 if (now >= m_last_track_rotation_ts + 86400 - 3600 &&
3212 now - today >= rotate_at) {
3213 if (m_last_track_rotation_ts == 0) {
3214 if (now - today > rotate_at)
3215 m_last_track_rotation_ts = today + rotate_at;
3217 m_last_track_rotation_ts = today + rotate_at - 86400;
3220 m_last_track_rotation_ts = now;
3226void MyFrame::TrackDailyRestart(
void) {
3227 if (!g_pActiveTrack)
return;
3229 Track *pPreviousTrack = TrackOff(
true);
3230 if (pConfig && pConfig->IsChangesFileDirty()) {
3231 pConfig->UpdateNavObj(
true);
3240 if (pPreviousTrack) {
3241 TrackPoint *pMidnightPoint = pPreviousTrack->GetLastPoint();
3242 g_pActiveTrack->AdjustCurrentTrackPoint(pMidnightPoint);
3245 if (RouteManagerDialog::getInstanceFlag()) {
3246 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
3247 pRouteManagerDialog->UpdateTrkListCtrl();
3248 pRouteManagerDialog->UpdateRouteListCtrl();
3253void MyFrame::SetUpMode(
ChartCanvas *cc,
int mode) {
3255 cc->SetUpMode(mode);
3257 SetMenubarItemState(ID_MENU_CHART_COGUP, mode == COURSE_UP_MODE);
3258 SetMenubarItemState(ID_MENU_CHART_NORTHUP, mode == NORTH_UP_MODE);
3259 SetMenubarItemState(ID_MENU_CHART_HEADUP, mode == HEAD_UP_MODE);
3262 m_pMenuBar->SetLabel(ID_MENU_CHART_NORTHUP, _(
"North Up Mode"));
3267 cc->SetShowENCText(!cc->GetShowENCText());
3269 SetMenubarItemState(ID_MENU_ENC_TEXT, cc->GetShowENCText());
3277void MyFrame::SetENCDisplayCategory(
ChartCanvas *cc,
enum _DisCat nset) {
3280 cc->SetENCDisplayCategory(nset);
3282 UpdateGlobalMenuItems();
3293 cc->SetShowENCDepth(!cc->GetShowENCDepth());
3295 SetMenubarItemState(ID_MENU_ENC_SOUNDINGS, cc->GetShowENCDepth());
3304 cc->SetShowENCLights(!cc->GetShowENCLights());
3306 SetMenubarItemState(ID_MENU_ENC_LIGHTS, cc->GetShowENCLights());
3308 if (g_pi_manager) g_pi_manager->SendS52ConfigToAllPlugIns(
true);
3316void MyFrame::ToggleRocks(
void )
3322 for(
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount(); iPtr++ ) {
3323 OBJLElement *pOLE = (OBJLElement *) ( ps52plib->pOBJLArray->Item( iPtr ) );
3324 if( !strncmp( pOLE->OBJLName,
"UWTROC", 6 ) ) {
3325 pOLE->nViz = !pOLE->nViz;
3329 for(
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount(); iPtr++ ) {
3330 OBJLElement *pOLE = (OBJLElement *) ( ps52plib->pOBJLArray->Item( iPtr ) );
3331 if( !strncmp( pOLE->OBJLName,
"OBSTRN", 6 ) ) {
3334 if( !strncmp( pOLE->OBJLName,
"WRECKS", 6 ) ) {
3338 ps52plib->GenerateStateHash();
3345 cc->SetShowENCAnchor(!cc->GetShowENCAnchor());
3347 SetMenubarItemState(ID_MENU_ENC_ANCHOR, cc->GetShowENCAnchor());
3349 if (g_pi_manager) g_pi_manager->SendS52ConfigToAllPlugIns();
3355 cc->SetShowENCDataQual(!cc->GetShowENCDataQual());
3357 SetMenubarItemState(ID_MENU_ENC_DATA_QUALITY, cc->GetShowENCDataQual());
3359 if (g_pi_manager) g_pi_manager->SendS52ConfigToAllPlugIns();
3372 cc->m_bShowNavobjects = !cc->m_bShowNavobjects;
3373 SetMenubarItemState(ID_MENU_SHOW_NAVOBJECTS, cc->m_bShowNavobjects);
3378 cc->SetShowAIS(!cc->GetShowAIS());
3379 SetMenubarItemState(ID_MENU_AIS_TARGETS, cc->GetShowAIS());
3383void MyFrame::ToggleAISMinimizeTargets(
ChartCanvas *cc) {
3384 cc->SetAttenAIS(!cc->GetAttenAIS());
3385 SetMenubarItemState(ID_MENU_AIS_SCALED_TARGETS, cc->GetAttenAIS());
3390 JumpToPosition(cc, gLat, gLon, cc->
GetVPScale());
3391 cc->m_bFollow =
true;
3394 SetMenubarItemState(ID_MENU_NAV_FOLLOW,
true);
3398 SetChartUpdatePeriod();
3406 cc->m_bFollow =
false;
3408 SetMenubarItemState(ID_MENU_NAV_FOLLOW,
false);
3412 SetChartUpdatePeriod();
3415void MyFrame::ToggleChartOutlines(
ChartCanvas *cc) {
3416 cc->SetShowOutlines(!cc->GetShowOutlines());
3418 RefreshAllCanvas(
false);
3422 if (g_bopengl) InvalidateAllGL();
3425 SetMenubarItemState(ID_MENU_CHART_OUTLINES, cc->GetShowOutlines());
3428void MyFrame::ToggleTestPause(
void) { g_bPauseTest = !g_bPauseTest; }
3430void MyFrame::SetMenubarItemState(
int item_id,
bool state) {
3432 bool enabled = m_pMenuBar->IsEnabled(item_id);
3433 m_pMenuBar->Enable(item_id,
false);
3434 m_pMenuBar->Check(item_id, state);
3435 m_pMenuBar->Enable(item_id, enabled);
3439void MyFrame::SetMasterToolbarItemState(
int tool_id,
bool state) {
3440 if (g_MainToolbar && g_MainToolbar->GetToolbar()) {
3441 g_MainToolbar->GetToolbar()->ToggleTool(tool_id, state);
3442 g_MainToolbar->Realize();
3446void MyFrame::SetToolbarItemBitmaps(
int tool_id, wxBitmap *bmp,
3447 wxBitmap *bmpRollover) {
3448 if (g_MainToolbar && g_MainToolbar->GetToolbar()) {
3449 g_MainToolbar->GetToolbar()->SetToolBitmaps(tool_id, bmp, bmpRollover);
3450 g_MainToolbar->Realize();
3454void MyFrame::SetToolbarItemSVG(
int tool_id, wxString normalSVGfile,
3455 wxString rolloverSVGfile,
3456 wxString toggledSVGfile) {
3457 if (g_MainToolbar && g_MainToolbar->GetToolbar()) {
3458 g_MainToolbar->GetToolbar()->SetToolBitmapsSVG(
3459 tool_id, normalSVGfile, rolloverSVGfile, toggledSVGfile);
3463void MyFrame::ConfigureStatusBar() {
3465 m_StatusBarFieldCount = g_Platform->GetStatusBarFieldCount();
3468 UseNativeStatusBar(
false);
3471 if (g_bShowStatusBar) {
3472 if (!m_pStatusBar) {
3474 CreateStatusBar(m_StatusBarFieldCount, 0);
3475 ApplyGlobalColorSchemetoStatusBar();
3480 m_pStatusBar->Destroy();
3481 m_pStatusBar = NULL;
3487void MyFrame::ApplyGlobalSettings(
bool bnewtoolbar) {
3488 ConfigureStatusBar();
3490 wxSize lastOptSize = options_lastWindowSize;
3496 options_lastWindowSize = lastOptSize;
3498 if (bnewtoolbar) UpdateAllToolbars(global_color_scheme);
3501wxString _menuText(wxString name, wxString shortcut) {
3505 menutext << _T(
"\t") << shortcut;
3510void MyFrame::BuildMenuBar(
void) {
3516 bool showMenuBar =
true;
3518 bool showMenuBar = g_bShowMenuBar;
3530 m_pMenuBar =
new wxMenuBar();
3531 RegisterGlobalMenuItems();
3532 SetMenuBar(m_pMenuBar);
3536 UpdateGlobalMenuItems();
3541 m_pMenuBar->Destroy();
3547void MyFrame::RegisterGlobalMenuItems() {
3548 if (!m_pMenuBar)
return;
3550 wxMenu *nav_menu =
new wxMenu();
3551 nav_menu->AppendCheckItem(ID_MENU_NAV_FOLLOW,
3552 _menuText(_(
"Auto Follow"), _T(
"Ctrl-A")));
3553 nav_menu->AppendCheckItem(ID_MENU_NAV_TRACK, _(
"Enable Tracking"));
3554 nav_menu->AppendSeparator();
3555 nav_menu->AppendRadioItem(ID_MENU_CHART_NORTHUP, _(
"North Up Mode"));
3556 nav_menu->AppendRadioItem(ID_MENU_CHART_COGUP, _(
"Course Up Mode"));
3557 nav_menu->AppendRadioItem(ID_MENU_CHART_HEADUP, _(
"Head Up Mode"));
3558 nav_menu->AppendSeparator();
3560 nav_menu->Append(ID_MENU_ZOOM_IN, _menuText(_(
"Zoom In"), _T(
"+")));
3561 nav_menu->Append(ID_MENU_ZOOM_OUT, _menuText(_(
"Zoom Out"), _T(
"-")));
3563 nav_menu->Append(ID_MENU_ZOOM_IN, _menuText(_(
"Zoom In"), _T(
"Alt-+")));
3564 nav_menu->Append(ID_MENU_ZOOM_OUT, _menuText(_(
"Zoom Out"), _T(
"Alt--")));
3566 nav_menu->AppendSeparator();
3567 nav_menu->Append(ID_MENU_SCALE_IN,
3568 _menuText(_(
"Larger Scale Chart"), _T(
"Ctrl-Left")));
3569 nav_menu->Append(ID_MENU_SCALE_OUT,
3570 _menuText(_(
"Smaller Scale Chart"), _T(
"Ctrl-Right")));
3572 nav_menu->AppendSeparator();
3573 nav_menu->Append(ID_MENU_OQUIT, _menuText(_(
"Exit OpenCPN"), _T(
"Ctrl-Q")));
3575 m_pMenuBar->Append(nav_menu, _(
"&Navigate"));
3577 wxMenu *view_menu =
new wxMenu();
3579 view_menu->AppendCheckItem(ID_MENU_CHART_QUILTING,
3580 _menuText(_(
"Enable Chart Quilting"), _T(
"Q")));
3581 view_menu->AppendCheckItem(ID_MENU_CHART_OUTLINES,
3582 _menuText(_(
"Show Chart Outlines"), _T(
"O")));
3584 view_menu->AppendCheckItem(
3585 ID_MENU_CHART_QUILTING,
3586 _menuText(_(
"Enable Chart Quilting"), _T(
"Alt-Q")));
3587 view_menu->AppendCheckItem(ID_MENU_CHART_OUTLINES,
3588 _menuText(_(
"Show Chart Outlines"), _T(
"Alt-O")));
3590 view_menu->AppendCheckItem(ID_MENU_UI_CHARTBAR,
3591 _menuText(_(
"Show Chart Bar"), _T(
"Ctrl-B")));
3593 view_menu->AppendSeparator();
3595 view_menu->AppendCheckItem(ID_MENU_ENC_TEXT,
3596 _menuText(_(
"Show ENC text"), _T(
"T")));
3597 view_menu->AppendCheckItem(ID_MENU_ENC_LIGHTS,
3598 _menuText(_(
"Show ENC Lights"), _T(
"L")));
3599 view_menu->AppendCheckItem(ID_MENU_ENC_SOUNDINGS,
3600 _menuText(_(
"Show ENC Soundings"), _T(
"S")));
3601 view_menu->AppendCheckItem(ID_MENU_ENC_ANCHOR,
3602 _menuText(_(
"Show ENC Anchoring Info"), _T(
"A")));
3603 view_menu->AppendCheckItem(ID_MENU_ENC_DATA_QUALITY,
3604 _menuText(_(
"Show ENC Data Quality"), _T(
"U")));
3605 view_menu->AppendCheckItem(ID_MENU_SHOW_NAVOBJECTS,
3606 _menuText(_(
"Show Navobjects"), _T(
"V")));
3608 view_menu->AppendCheckItem(ID_MENU_ENC_TEXT,
3609 _menuText(_(
"Show ENC text"), _T(
"Alt-T")));
3610 view_menu->AppendCheckItem(ID_MENU_ENC_LIGHTS,
3611 _menuText(_(
"Show ENC Lights"), _T(
"Alt-L")));
3612 view_menu->AppendCheckItem(ID_MENU_ENC_SOUNDINGS,
3613 _menuText(_(
"Show ENC Soundings"), _T(
"Alt-S")));
3614 view_menu->AppendCheckItem(
3615 ID_MENU_ENC_ANCHOR, _menuText(_(
"Show ENC Anchoring Info"), _T(
"Alt-A")));
3616 view_menu->AppendCheckItem(
3617 ID_MENU_ENC_DATA_QUALITY,
3618 _menuText(_(
"Show ENC Data Quality"), _T(
"Alt-U")));
3619 view_menu->AppendCheckItem(ID_MENU_SHOW_NAVOBJECTS,
3620 _menuText(_(
"Show Navobjects"), _T(
"Alt-V")));
3622 view_menu->AppendSeparator();
3623 view_menu->AppendCheckItem(ID_MENU_SHOW_TIDES, _(
"Show Tides"));
3624 view_menu->AppendCheckItem(ID_MENU_SHOW_CURRENTS, _(
"Show Currents"));
3625 view_menu->AppendSeparator();
3627 view_menu->Append(ID_MENU_UI_COLSCHEME,
3628 _menuText(_(
"Change Color Scheme"), _T(
"C")));
3630 view_menu->Append(ID_MENU_UI_COLSCHEME,
3631 _menuText(_(
"Change Color Scheme"), _T(
"Alt-C")));
3634 view_menu->AppendSeparator();
3636 view_menu->Append(ID_MENU_UI_FULLSCREEN,
3637 _menuText(_(
"Toggle Full Screen"), _T(
"F11")));
3639 m_pMenuBar->Append(view_menu, _(
"&View"));
3641 wxMenu *ais_menu =
new wxMenu();
3642 ais_menu->AppendCheckItem(ID_MENU_AIS_TARGETS, _(
"Show AIS Targets"));
3643 ais_menu->AppendCheckItem(ID_MENU_AIS_SCALED_TARGETS,
3644 _(
"Attenuate less critical AIS targets"));
3645 ais_menu->AppendSeparator();
3646 ais_menu->AppendCheckItem(ID_MENU_AIS_MOORED_TARGETS,
3647 _(
"Hide Moored AIS Targets"));
3648 ais_menu->AppendCheckItem(ID_MENU_AIS_TRACKS, _(
"Show AIS Target Tracks"));
3649 ais_menu->AppendCheckItem(ID_MENU_AIS_CPADIALOG, _(
"Show CPA Alert Dialogs"));
3650 ais_menu->AppendCheckItem(ID_MENU_AIS_CPASOUND, _(
"Sound CPA Alarms"));
3653 ais_menu->AppendCheckItem(ID_MENU_AIS_CPAWARNING,
3654 _menuText(_(
"Show CPA Warnings"), _T(
"W")));
3656 ais_menu->AppendCheckItem(ID_MENU_AIS_CPAWARNING,
3657 _menuText(_(
"Show CPA Warnings"), _T(
"Alt-W")));
3660 ais_menu->AppendSeparator();
3661 ais_menu->Append(ID_MENU_AIS_TARGETLIST, _(
"AIS target list") + _T(
"..."));
3662 m_pMenuBar->Append(ais_menu, _(
"&AIS"));
3664 wxMenu *tools_menu =
new wxMenu();
3665 tools_menu->Append(ID_MENU_TOOL_NMEA_DBG_LOG,
3666 _menuText(_(
"NMEA Debugger"),
"Alt-C"));
3668 tools_menu->Append(ID_MENU_TOOL_MEASURE,
3669 _menuText(_(
"Measure Distance"), _T(
"M")));
3671 tools_menu->Append(ID_MENU_TOOL_MEASURE,
3672 _menuText(_(
"Measure Distance"), _T(
"Alt-M")));
3675 tools_menu->AppendSeparator();
3676 tools_menu->Append(ID_MENU_ROUTE_MANAGER, _(
"Route && Mark Manager..."));
3677 tools_menu->Append(ID_MENU_ROUTE_NEW,
3678 _menuText(_(
"Create Route"), _T(
"Ctrl-R")));
3679 tools_menu->AppendSeparator();
3680 tools_menu->Append(ID_MENU_MARK_BOAT,
3681 _menuText(_(
"Drop Mark at Boat"), _T(
"Ctrl-O")));
3682 tools_menu->Append(ID_MENU_MARK_CURSOR,
3683 _menuText(_(
"Drop Mark at Cursor"), _T(
"Ctrl-M")));
3684 tools_menu->AppendSeparator();
3689 _(
"Drop MOB Marker"),
3690 _T(
"RawCtrl-Space")));
3691 tools_menu->AppendSeparator();
3692 tools_menu->Append(wxID_PREFERENCES,
3693 _menuText(_(
"Preferences") + _T(
"..."), _T(
"Ctrl-,")));
3695 tools_menu->Append(ID_MENU_MARK_MOB,
3696 _menuText(_(
"Drop MOB Marker"), _T(
"Ctrl-Space")));
3697 tools_menu->AppendSeparator();
3698 tools_menu->Append(wxID_PREFERENCES,
3699 _menuText(_(
"Options") + _T(
"..."), _T(
"Ctrl-,")));
3701 m_pMenuBar->Append(tools_menu, _(
"&Tools"));
3704 wxMenu *window_menu =
new wxMenu();
3705 m_pMenuBar->Append(window_menu, _(
"&Window"));
3708 wxMenu *help_menu =
new wxMenu();
3709 help_menu->Append(wxID_ABOUT, _(
"About OpenCPN"));
3710 help_menu->Append(wxID_HELP, _(
"OpenCPN Help"));
3711 m_pMenuBar->Append(help_menu, _(
"&Help"));
3714 UpdateGlobalMenuItems();
3717void MyFrame::UpdateGlobalMenuItems() {
3718 if (!m_pMenuBar)
return;
3720 m_pMenuBar->FindItem(ID_MENU_NAV_FOLLOW)
3721 ->Check(GetPrimaryCanvas()->m_bFollow);
3722 m_pMenuBar->FindItem(ID_MENU_CHART_NORTHUP)
3723 ->Check(GetPrimaryCanvas()->GetUpMode() == NORTH_UP_MODE);
3724 m_pMenuBar->FindItem(ID_MENU_CHART_COGUP)
3725 ->Check(GetPrimaryCanvas()->GetUpMode() == COURSE_UP_MODE);
3726 m_pMenuBar->FindItem(ID_MENU_CHART_HEADUP)
3727 ->Check(GetPrimaryCanvas()->GetUpMode() == HEAD_UP_MODE);
3728 m_pMenuBar->FindItem(ID_MENU_NAV_TRACK)->Check(g_bTrackActive);
3729 m_pMenuBar->FindItem(ID_MENU_CHART_OUTLINES)->Check(g_bShowOutlines);
3730 m_pMenuBar->FindItem(ID_MENU_CHART_QUILTING)->Check(g_bQuiltEnable);
3731 m_pMenuBar->FindItem(ID_MENU_UI_CHARTBAR)->Check(g_bShowChartBar);
3732 m_pMenuBar->FindItem(ID_MENU_AIS_TARGETS)->Check(g_bShowAIS);
3733 m_pMenuBar->FindItem(ID_MENU_AIS_MOORED_TARGETS)->Check(g_bHideMoored);
3734 m_pMenuBar->FindItem(ID_MENU_AIS_SCALED_TARGETS)->Check(g_bShowScaled);
3735 m_pMenuBar->FindItem(ID_MENU_AIS_SCALED_TARGETS)->Enable(g_bAllowShowScaled);
3736 m_pMenuBar->FindItem(ID_MENU_AIS_TRACKS)->Check(g_bAISShowTracks);
3737 m_pMenuBar->FindItem(ID_MENU_AIS_CPADIALOG)->Check(g_bAIS_CPA_Alert);
3738 if (g_bAIS_CPA_Alert) {
3739 m_pMenuBar->FindItem(ID_MENU_AIS_CPASOUND)->Check(g_bAIS_CPA_Alert_Audio);
3740 m_pMenuBar->Enable(ID_MENU_AIS_CPASOUND,
true);
3742 m_pMenuBar->FindItem(ID_MENU_AIS_CPASOUND)->Check(
false);
3743 m_pMenuBar->Enable(ID_MENU_AIS_CPASOUND,
false);
3746 m_pMenuBar->FindItem(ID_MENU_AIS_CPAWARNING)->Check(g_bCPAWarn);
3747 m_pMenuBar->FindItem(ID_MENU_SHOW_NAVOBJECTS)
3748 ->Check(GetPrimaryCanvas()->m_bShowNavobjects);
3751 m_pMenuBar->FindItem(ID_MENU_ENC_TEXT)->Check(ps52plib->GetShowS57Text());
3752 m_pMenuBar->FindItem(ID_MENU_ENC_SOUNDINGS)
3753 ->Check(ps52plib->GetShowSoundings());
3755 bool light_state =
false;
3757 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
3759 OBJLElement *pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
3760 if (!strncmp(pOLE->OBJLName,
"LIGHTS", 6)) {
3761 light_state = (pOLE->nViz == 1);
3766 m_pMenuBar->FindItem(ID_MENU_ENC_LIGHTS)
3767 ->Check((!ps52plib->IsObjNoshow(
"LIGHTS")) && light_state);
3771 DisCat nset = ps52plib->GetDisplayCategory();
3772 if ((nset == MARINERS_STANDARD) || (nset == OTHER)) {
3773 m_pMenuBar->FindItem(ID_MENU_ENC_ANCHOR)
3774 ->Check(!ps52plib->IsObjNoshow(
"SBDARE"));
3775 m_pMenuBar->Enable(ID_MENU_ENC_ANCHOR,
true);
3776 m_pMenuBar->FindItem(ID_MENU_ENC_DATA_QUALITY)
3777 ->Check(!ps52plib->IsObjNoshow(
"M_QUAL"));
3778 m_pMenuBar->Enable(ID_MENU_ENC_DATA_QUALITY,
true);
3780 m_pMenuBar->FindItem(ID_MENU_ENC_ANCHOR)->Check(
false);
3781 m_pMenuBar->Enable(ID_MENU_ENC_ANCHOR,
false);
3782 m_pMenuBar->Enable(ID_MENU_ENC_DATA_QUALITY,
false);
3787void MyFrame::UpdateGlobalMenuItems(
ChartCanvas *cc) {
3788 if (!m_pMenuBar)
return;
3790 m_pMenuBar->FindItem(ID_MENU_NAV_FOLLOW)->Check(cc->m_bFollow);
3792 if (cc->GetUpMode() == NORTH_UP_MODE)
3793 m_pMenuBar->FindItem(ID_MENU_CHART_NORTHUP)->Check(
true);
3794 else if (cc->GetUpMode() == COURSE_UP_MODE)
3795 m_pMenuBar->FindItem(ID_MENU_CHART_COGUP)->Check(
true);
3797 m_pMenuBar->FindItem(ID_MENU_CHART_HEADUP)->Check(
true);
3799 m_pMenuBar->FindItem(ID_MENU_NAV_TRACK)->Check(g_bTrackActive);
3800 m_pMenuBar->FindItem(ID_MENU_CHART_OUTLINES)->Check(cc->GetShowOutlines());
3801 m_pMenuBar->FindItem(ID_MENU_CHART_QUILTING)->Check(cc->GetQuiltMode());
3802 m_pMenuBar->FindItem(ID_MENU_UI_CHARTBAR)->Check(cc->GetShowChartbar());
3803 m_pMenuBar->FindItem(ID_MENU_AIS_TARGETS)->Check(cc->GetShowAIS());
3804 m_pMenuBar->FindItem(ID_MENU_AIS_MOORED_TARGETS)->Check(g_bHideMoored);
3805 m_pMenuBar->FindItem(ID_MENU_AIS_SCALED_TARGETS)->Check(cc->GetAttenAIS());
3806 m_pMenuBar->FindItem(ID_MENU_AIS_SCALED_TARGETS)->Enable(g_bAllowShowScaled);
3807 m_pMenuBar->FindItem(ID_MENU_AIS_TRACKS)->Check(g_bAISShowTracks);
3808 m_pMenuBar->FindItem(ID_MENU_AIS_CPADIALOG)->Check(g_bAIS_CPA_Alert);
3809 m_pMenuBar->FindItem(ID_MENU_AIS_CPASOUND)->Check(g_bAIS_CPA_Alert_Audio);
3810 m_pMenuBar->FindItem(ID_MENU_AIS_CPAWARNING)->Check(g_bCPAWarn);
3811 m_pMenuBar->FindItem(ID_MENU_SHOW_NAVOBJECTS)->Check(cc->m_bShowNavobjects);
3812 m_pMenuBar->FindItem(ID_MENU_SHOW_TIDES)->Check(cc->GetbShowTide());
3813 m_pMenuBar->FindItem(ID_MENU_SHOW_CURRENTS)->Check(cc->GetbShowCurrent());
3816 m_pMenuBar->FindItem(ID_MENU_ENC_TEXT)->Check(cc->GetShowENCText());
3817 m_pMenuBar->FindItem(ID_MENU_ENC_SOUNDINGS)->Check(cc->GetShowENCDepth());
3820 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
3822 OBJLElement *pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
3823 if (!strncmp(pOLE->OBJLName,
"LIGHTS", 6)) {
3828 m_pMenuBar->FindItem(ID_MENU_ENC_LIGHTS)->Check(cc->GetShowENCLights());
3832 DisCat nset = (DisCat)cc->GetENCDisplayCategory();
3833 if ((nset == MARINERS_STANDARD) || (nset == OTHER)) {
3834 m_pMenuBar->FindItem(ID_MENU_ENC_ANCHOR)->Check(cc->GetShowENCAnchor());
3835 m_pMenuBar->Enable(ID_MENU_ENC_ANCHOR,
true);
3836 m_pMenuBar->FindItem(ID_MENU_ENC_DATA_QUALITY)
3837 ->Check(cc->GetShowENCDataQual());
3838 m_pMenuBar->Enable(ID_MENU_ENC_DATA_QUALITY,
true);
3840 m_pMenuBar->FindItem(ID_MENU_ENC_ANCHOR)->Check(
false);
3841 m_pMenuBar->Enable(ID_MENU_ENC_ANCHOR,
false);
3842 m_pMenuBar->Enable(ID_MENU_ENC_DATA_QUALITY,
false);
3847void MyFrame::InvalidateAllCanvasUndo() {
3849 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
3851 if (cc) cc->undo->InvalidateUndo();
3855void MyFrame::SubmergeAllCanvasToolbars(
void) {
3857 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
3859 if (cc) cc->SubmergeToolbar();
3863void MyFrame::SurfaceAllCanvasToolbars(
void) {
3864 if (g_bshowToolbar) {
3866 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
3868 if (cc && cc->GetToolbarEnable()) cc->SurfaceToolbar();
3875void MyFrame::JumpToPosition(
ChartCanvas *cc,
double lat,
double lon,
3877 if (lon > 180.0) lon -= 360.0;
3882 cc->JumpToPosition(lat, lon,
scale);
3885 g_pi_manager->SendViewPortToRequestingPlugIns(cc->GetVP());
3889void MyFrame::UpdateCanvasConfigDescriptors() {
3891 for (
unsigned int i = 0;
3892 i < ConfigMgr::Get().GetCanvasConfigArray().GetCount(); i++) {
3893 canvasConfig *cc = ConfigMgr::Get().GetCanvasConfigArray().Item(i);
3901 cc->DBindex = chart->GetQuiltReferenceChartIndex();
3902 cc->GroupID = chart->m_groupIndex;
3905 cc->
bQuilt = chart->GetQuiltMode();
3912 cc->
bFollow = chart->m_bFollow;
3917 int upmode = chart->GetUpMode();
3918 if (upmode == COURSE_UP_MODE)
3920 else if (upmode == HEAD_UP_MODE)
3927void MyFrame::CenterView(
ChartCanvas *cc,
const LLBBox &RBBox) {
3928 if (!RBBox.GetValid())
return;
3930 double clat = (RBBox.GetMinLat() + RBBox.GetMaxLat()) / 2;
3931 double clon = (RBBox.GetMinLon() + RBBox.GetMaxLon()) / 2;
3934 if (RBBox.GetMinLat() == RBBox.GetMaxLat() &&
3935 RBBox.GetMinLon() == RBBox.GetMaxLon()) {
3943 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
3944 RBBox.GetMinLat(), RBBox.GetMaxLon(), NULL, &rw);
3946 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
3947 RBBox.GetMaxLat(), RBBox.GetMinLon(), NULL, &rh);
3949 cc->GetSize(&ww, &wh);
3951 ppm = wxMin(ww / (rw * 1852), wh / (rh * 1852)) * (100 - fabs(clat)) / 90;
3953 ppm = wxMin(ppm, 1.0);
3956 JumpToPosition(cc, clat, clon, ppm);
3959void MyFrame::PrepareOptionsClose(
options *settings,
3960 int settings_return_value) {
3962 options_lastPage = settings->lastPage;
3967 if (options_lastPage == 1) options_lastPage = 0;
3969 options_subpage = settings->lastSubPage;
3970 options_lastWindowPos = settings->lastWindowPos;
3971 options_lastWindowSize = settings->lastWindowSize;
3974 androidEnableBackButton(
true);
3975 androidEnableOptionsMenu(
true);
3976 androidRestoreFullScreen();
3977 androidEnableRotation();
3986 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
3989 int index_hint = -1;
3990 if (i < pathArray.GetCount())
3991 index_hint = ChartData->FinddbIndex(pathArray.Item(i));
3992 cc->canvasChartsRefresh(index_hint);
3993 if (index_hint != -1) cc->
SetVPScale(restoreScale[i]);
4000void MyFrame::DoOptionsDialog() {
4001 if (NULL == g_options) {
4002 AbstractPlatform::ShowBusySpinner();
4005 pConfig->SetPath(
"/Settings");
4006 pConfig->Read(
"OptionsSizeX", &sx, -1);
4007 pConfig->Read(
"OptionsSizeY", &sy, -1);
4009 wxWindow *optionsParent =
this;
4011 optionsParent = GetPrimaryCanvas();
4013 g_options =
new options(optionsParent, -1, _(
"Options"), wxPoint(-1, -1),
4016 AbstractPlatform::HideBusySpinner();
4020 g_options->SetInitChartDir(*pInit_Chart_Dir);
4023 g_options->SetCurrentDirList(ChartData->GetChartDirArray());
4024 ArrayOfCDI *pWorkDirArray =
new ArrayOfCDI;
4025 g_options->SetWorkDirListPtr(pWorkDirArray);
4028 g_options->SetConfigPtr(pConfig);
4029 g_options->SetInitialSettings();
4031 prev_locale = g_locale;
4032 g_options->SetInitialPage(options_lastPage, options_subpage);
4035 g_options->lastWindowPos = options_lastWindowPos;
4036 if (options_lastWindowPos != wxPoint(0, 0)) {
4037 g_options->Move(options_lastWindowPos);
4038 g_options->SetSize(options_lastWindowSize);
4040 g_options->CenterOnScreen();
4042 if (options_lastWindowSize != wxSize(0, 0)) {
4043 g_options->SetSize(options_lastWindowSize);
4048 androidEnableBackButton(
false);
4049 androidEnableOptionsMenu(
false);
4050 androidDisableFullScreen();
4057 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4060 wxString chart_file_name;
4061 if (cc->GetQuiltMode()) {
4062 int dbi = cc->GetQuiltRefChartdbIndex();
4063 chart_file_name = ChartData->GetDBChartFileName(dbi);
4065 if (cc->m_singleChart)
4066 chart_file_name = cc->m_singleChart->GetFullPath();
4069 pathArray.Add(chart_file_name);
4075 last_canvasConfig = g_canvasConfig;
4078 g_last_ChartScaleFactor = g_ChartScaleFactor;
4084void MyFrame::ProcessOptionsDialog(
int rr, ArrayOfCDI *pNewDirArray) {
4085 bool b_need_refresh =
false;
4087 if ((rr & VISIT_CHARTS) &&
4088 ((rr & CHANGE_CHARTS) || (rr & FORCE_UPDATE) || (rr & SCAN_UPDATE))) {
4090 UpdateChartDatabaseInplace(*pNewDirArray,
4091 ((rr & FORCE_UPDATE) == FORCE_UPDATE),
true,
4094 b_need_refresh =
true;
4098 if (rr & STYLE_CHANGED) {
4101 _(
"Please restart OpenCPN to activate language or style changes."),
4102 _(
"OpenCPN Info"), wxOK | wxICON_INFORMATION);
4105 bool b_groupchange =
false;
4106 if (((rr & VISIT_CHARTS) &&
4107 ((rr & CHANGE_CHARTS) || (rr & FORCE_UPDATE) || (rr & SCAN_UPDATE))) ||
4108 (rr & GROUPS_CHANGED)) {
4109 b_groupchange = ScrubGroupArray();
4110 ChartData->ApplyGroupArray(g_pGroupArray);
4111 RefreshGroupIndices();
4114 if (rr & GROUPS_CHANGED || b_groupchange) {
4115 pConfig->DestroyConfigGroups();
4116 pConfig->CreateConfigGroups(g_pGroupArray);
4119 if (rr & TIDES_CHANGED) {
4125 if (rr & S52_CHANGED) {
4126 WayPointmanGui(*pWayPointMan).ReloadAllIcons(g_Platform->GetDisplayDPmm());
4129 pConfig->UpdateSettings();
4131 if (g_pActiveTrack) {
4132 g_pActiveTrack->SetPrecision(g_nTrackPrecision);
4136 g_pRouteMan->SetColorScheme(global_color_scheme,
4137 g_Platform->GetDisplayDPmm());
4140 double stuffcog = NAN;
4141 double stuffsog = NAN;
4142 if (!std::isnan(gCog)) stuffcog = gCog;
4143 if (!std::isnan(gSog)) stuffsog = gSog;
4145 for (
int i = 0; i < MAX_COGSOG_FILTER_SECONDS; i++) {
4146 COGFilterTable[i] = stuffcog;
4147 SOGFilterTable[i] = stuffsog;
4150 SetChartUpdatePeriod();
4152 if (rr & GL_CHANGED) {
4156 b_need_refresh =
true;
4159 if (rr & S52_CHANGED) {
4160 b_need_refresh =
true;
4164 if (rr & REBUILD_RASTER_CACHE) {
4165 if (g_glTextureManager) {
4166 GetPrimaryCanvas()->Disable();
4167 g_glTextureManager->BuildCompressedCache();
4168 GetPrimaryCanvas()->Enable();
4173 if (g_config_display_size_manual &&
4174 g_config_display_size_mm.size() > g_current_monitor &&
4175 g_config_display_size_mm[g_current_monitor] > 0) {
4176 g_display_size_mm = g_config_display_size_mm[g_current_monitor];
4181 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4187 g_pi_manager->SendBaseConfigToAllPlugIns();
4188 int rrt = rr & S52_CHANGED;
4189 g_pi_manager->SendS52ConfigToAllPlugIns(
4190 (rrt == S52_CHANGED) ||
4191 (g_last_ChartScaleFactor != g_ChartScaleFactor));
4194 if (g_MainToolbar) {
4195 g_MainToolbar->SetAutoHide(g_bAutoHideToolbar);
4196 g_MainToolbar->SetAutoHideTimer(g_nAutoHideToolbar);
4201 ps52plib->SetScaleFactorExp(
4202 g_Platform->GetChartScaleFactorExp(g_ChartScaleFactor));
4203 ps52plib->SetScaleFactorZoomMod(g_chart_zoom_modifier_vector);
4207 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4209 if (cc) cc->ApplyGlobalSettings();
4216 int index_hint = ChartData->FinddbIndex( chart_file_name );
4217 if( -1 == index_hint )
4225 bool ztc = g_bEnableZoomToCursor;
4226 g_bEnableZoomToCursor =
4231 g_bEnableZoomToCursor = ztc;
4234 if (g_last_ChartScaleFactor != g_ChartScaleFactor) {
4235 if (g_pMarkInfoDialog) {
4236 g_pMarkInfoDialog->Hide();
4237 g_pMarkInfoDialog->Destroy();
4238 g_pMarkInfoDialog = NULL;
4243 SetGPSCompassScale();
4245 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4248 cc->GetCompass()->SetScaleFactor(g_compass_scalefactor);
4249 cc->UpdateCanvasControlBar();
4252 UpdateGPSCompassStatusBoxes();
4254 SetAllToolbarScale();
4255 RequestNewToolbars();
4258 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4261 cc->RebuildCursors();
4266 bool b_masterScaleChange =
false;
4267 if (fabs(g_MainToolbar->GetScaleFactor() - g_toolbar_scalefactor) > 0.01f)
4268 b_masterScaleChange =
true;
4270 if ((rr & TOOLBAR_CHANGED) || b_masterScaleChange)
4271 RequestNewMasterToolbar(
true);
4273 bool bMuiChange =
false;
4279 if (b_masterScaleChange || bMuiChange) {
4281 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4284 cc->ProcessNewGUIScale();
4290 if (rr & LOCALE_CHANGED) {
4291 g_Platform->ChangeLocale(g_locale, plocale_def_lang, &plocale_def_lang);
4293 rr |= NEED_NEW_OPTIONS;
4298 if (g_pi_manager) g_pi_manager->NotifyAuiPlugIns();
4302 g_last_ChartScaleFactor = g_ChartScaleFactor;
4307bool MyFrame::CheckGroup(
int igroup) {
4308 if (igroup == 0)
return true;
4310 ChartGroup *pGroup = g_pGroupArray->Item(igroup - 1);
4312 if (!pGroup->m_element_array.size())
4315 for (
const auto &elem : pGroup->m_element_array) {
4316 for (
unsigned int ic = 0;
4317 ic < (
unsigned int)ChartData->GetChartTableEntries(); ic++) {
4319 wxString chart_full_path(pcte->GetpFullPath(), wxConvUTF8);
4321 if (chart_full_path.StartsWith(elem.m_element_name))
return true;
4328bool MyFrame::ScrubGroupArray() {
4333 bool b_change =
false;
4334 unsigned int igroup = 0;
4335 while (igroup < g_pGroupArray->GetCount()) {
4336 bool b_chart_in_element =
false;
4337 ChartGroup *pGroup = g_pGroupArray->Item(igroup);
4339 for (
unsigned int j = 0; j < pGroup->m_element_array.size(); j++) {
4340 const wxString &element_root = pGroup->m_element_array[j].m_element_name;
4342 for (
unsigned int ic = 0;
4343 ic < (
unsigned int)ChartData->GetChartTableEntries(); ic++) {
4345 wxString chart_full_path = pcte->GetFullSystemPath();
4347 if (chart_full_path.StartsWith(element_root)) {
4348 b_chart_in_element =
true;
4354 if (!b_chart_in_element) {
4355 wxString test_string = _T(
"GSHH");
4356 if (element_root.Upper().Contains(test_string))
4357 b_chart_in_element =
true;
4360 if (!b_chart_in_element)
4362 pGroup->m_element_array.erase(pGroup->m_element_array.begin() + j);
4374void MyFrame::RefreshCanvasOther(
ChartCanvas *ccThis) {
4376 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4378 if (cc && (cc != ccThis)) cc->Refresh();
4383void MyFrame::ChartsRefresh() {
4384 if (!ChartData)
return;
4386 AbstractPlatform::ShowBusySpinner();
4388 bool b_run = FrameTimer1.IsRunning();
4391 FrameTenHzTimer.Stop();
4394 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4397 int currentIndex = cc->GetpCurrentStack()->GetCurrentEntrydbIndex();
4398 if (cc->GetQuiltMode()) {
4399 currentIndex = cc->GetQuiltReferenceChartIndex();
4401 cc->canvasChartsRefresh(currentIndex);
4405 if (b_run) FrameTimer1.Start(TIMER_GFRAME_1, wxTIMER_CONTINUOUS);
4406 if (b_run) FrameTenHzTimer.Start(100, wxTIMER_CONTINUOUS);
4408 AbstractPlatform::HideBusySpinner();
4411void MyFrame::InvalidateAllQuilts() {
4412 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4415 cc->InvalidateQuilt();
4416 cc->SetQuiltRefChart(-1);
4417 cc->m_singleChart = NULL;
4422bool MyFrame::UpdateChartDatabaseInplace(ArrayOfCDI &DirArray,
bool b_force,
4424 const wxString &ChartListFileName) {
4425 bool b_run = FrameTimer1.IsRunning();
4427 FrameTenHzTimer.Stop();
4429 bool b_runCOGTimer = FrameCOGTimer.IsRunning();
4430 FrameCOGTimer.Stop();
4433 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4436 cc->InvalidateQuilt();
4437 cc->SetQuiltRefChart(-1);
4438 cc->m_singleChart = NULL;
4442 ChartData->PurgeCache();
4448 AbstractPlatform::ShowBusySpinner();
4450 wxGenericProgressDialog *pprog =
nullptr;
4452 wxString longmsg = _(
"OpenCPN Chart Update");
4454 _T(
"..................................................................")
4457 pprog = new wxGenericProgressDialog();
4460 pprog->SetFont(*qFont);
4462 pprog->Create(_("OpenCPN
Chart Update"), longmsg, 100, gFrame,
4463 wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
4464 wxPD_REMAINING_TIME);
4470 wxLogMessage(_T(" "));
4471 wxLogMessage(_T("Starting chart database Update..."));
4472 wxString gshhg_chart_loc = gWorldMapLocation;
4473 gWorldMapLocation = wxEmptyString;
4474 ChartData->Update(DirArray, b_force, pprog);
4475 ChartData->SaveBinary(ChartListFileName);
4476 wxLogMessage(_T("Finished chart database Update"));
4477 wxLogMessage(_T(" "));
4478 if (gWorldMapLocation.empty()) {
4482 gWorldMapLocation = gDefaultWorldMapLocation;
4483 gshhg_chart_loc = wxEmptyString;
4486 if (gWorldMapLocation != gshhg_chart_loc) {
4488 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4490 if (cc) cc->ResetWorldBackgroundChart();
4496 AbstractPlatform::HideBusySpinner();
4498 pConfig->UpdateChartDirs(DirArray);
4501 if (b_run) FrameTimer1.Start(TIMER_GFRAME_1, wxTIMER_CONTINUOUS);
4502 if (b_run) FrameTenHzTimer.Start(100, wxTIMER_CONTINUOUS);
4504 if (b_runCOGTimer) {
4506 int period_ms = 100;
4507 if (g_COGAvgSec > 0) period_ms = g_COGAvgSec * 1000;
4508 FrameCOGTimer.Start(period_ms, wxTIMER_CONTINUOUS);
4515 cc->ToggleCanvasQuiltMode();
4517 bool cur_mode = cc->GetQuiltMode();
4519 if( !cc->GetQuiltMode() )
4520 cc->SetQuiltMode(
true );
4522 if( cc->GetQuiltMode() ) {
4523 cc->SetQuiltMode(
false );
4524 g_sticky_chart = cc->GetQuiltReferenceChartIndex();
4528 if( cur_mode != cc->GetQuiltMode() ){
4534 g_bQuiltEnable = cc->GetQuiltMode();
4538 ps52plib->GenerateStateHash();
4543void MyFrame::DoStackDown(
ChartCanvas *cc) { DoStackDelta(cc, -1); }
4545void MyFrame::DoStackUp(
ChartCanvas *cc) { DoStackDelta(cc, 1); }
4547void MyFrame::DoStackDelta(
ChartCanvas *cc,
int direction) {
4549 cc->DoCanvasStackDelta(direction);
4553void MyFrame::PositionIENCToolbar() {
4555 if (g_iENCToolbar) {
4557 posn.x = (GetPrimaryCanvas()->GetSize().x - g_iENCToolbar->GetSize().x) / 2;
4559 g_iENCToolbar->Move(GetPrimaryCanvas()->ClientToScreen(posn));
4567void MyFrame::OnInitTimer(wxTimerEvent &event) {
4570 msg.Printf(_T(
"OnInitTimer...%d"), m_iInitCount);
4573 wxLog::FlushActive();
4575 switch (m_iInitCount++) {
4577 if (g_MainToolbar) g_MainToolbar->EnableTool(ID_SETTINGS,
false);
4579 if (g_bInlandEcdis) {
4580 double range = GetPrimaryCanvas()->GetCanvasRangeMeters();
4581 double range_set = 500.;
4583 range = wxRound(range * 10) / 10.;
4587 else if (range > 2000.)
4589 else if (range > 1600.)
4591 else if (range > 1200.)
4593 else if (range > 800.)
4598 GetPrimaryCanvas()->SetCanvasRangeMeters(range_set);
4602 g_Platform->SetFullscreen(g_bFullscreen);
4605 if (g_NeedDBUpdate > 0) {
4606 RebuildChartDatabase();
4607 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4610 cc->SetGroupIndex(0,
false);
4618 if (ChartData->GetCentroidOfLargestScaleChart(&clat, &clon,
4619 CHART_FAMILY_RASTER)) {
4622 gFrame->ClearbFollow(gFrame->GetPrimaryCanvas());
4624 if (ChartData->GetCentroidOfLargestScaleChart(&clat, &clon,
4625 CHART_FAMILY_VECTOR)) {
4628 gFrame->ClearbFollow(gFrame->GetPrimaryCanvas());
4637 auto colour_func = [](wxString c) {
return GetGlobalColor(c); };
4640 .SetColorScheme(global_color_scheme, g_Platform->GetDisplayDPmm());
4642 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4645 if (cc->SetUserOwnship()) cc->SetColorScheme(global_color_scheme);
4649 pConfig->LoadNavObjects();
4651 if (!g_AW1GUID.IsEmpty()) {
4652 pAnchorWatchPoint1 = pWayPointMan->FindRoutePointByGUID(g_AW1GUID);
4654 if (!g_AW2GUID.IsEmpty()) {
4655 pAnchorWatchPoint2 = pWayPointMan->FindRoutePointByGUID(g_AW2GUID);
4660 appendOSDirSlash(&layerdir);
4661 layerdir.Append(_T(
"layers"));
4663 if (wxDir::Exists(layerdir)) {
4665 laymsg.Printf(wxT(
"Getting .gpx layer files from: %s"),
4667 wxLogMessage(laymsg);
4668 pConfig->LoadLayers(layerdir);
4676 for (
auto *cp : TheConnectionParams()) {
4679 cp->b_IsSetup = TRUE;
4684 console->SetColorScheme(global_color_scheme);
4688 if (g_pRouteMan->IsAnyRouteActive()) {
4689 g_pRouteMan->GetDlgContext().show_with_fresh_fonts();
4696 if (m_initializing)
break;
4697 m_initializing =
true;
4698 AbstractPlatform::ShowBusySpinner();
4700 AbstractPlatform::HideBusySpinner();
4702 RequestNewMasterToolbar();
4705 if (pWayPointMan)
WayPointmanGui(*pWayPointMan).ReloadRoutepointIcons();
4707 if (g_MainToolbar) g_MainToolbar->EnableTool(ID_SETTINGS,
false);
4709 wxString perspective;
4710 pConfig->SetPath(_T (
"/AUI" ));
4711 pConfig->Read(_T (
"AUIPerspective" ), &perspective);
4718 bool bno_load =
false;
4720 wxArrayString name_array;
4721 wxStringTokenizer st(perspective, _T(
"|;"));
4722 while (st.HasMoreTokens()) {
4723 wxString s1 = st.GetNextToken();
4724 if (s1.StartsWith(_T(
"name="))) {
4725 wxString sc = s1.AfterFirst(
'=');
4730 wxAuiPaneInfoArray pane_array_val = g_pauimgr->GetAllPanes();
4731 for (
unsigned int i = 0; i < pane_array_val.GetCount(); i++) {
4732 wxAuiPaneInfo pane = pane_array_val.Item(i);
4736 if (name_array.Index(pane.name) == wxNOT_FOUND) {
4742 if (!bno_load) g_pauimgr->LoadPerspective(perspective,
false);
4746 for(
unsigned int i=0 ; i < g_canvasArray.GetCount() ; i++){
4749 g_pauimgr->GetPane(cc).MinSize(10,10);
4756 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4759 wxSize frameSize = GetClientSize();
4760 wxSize minSize = g_pauimgr->GetPane(cc).min_size;
4761 int width = wxMax(minSize.x, frameSize.x / 10);
4762 g_pauimgr->GetPane(cc).MinSize(frameSize.x * 1 / 5, frameSize.y);
4765 g_pauimgr->Update();
4769 g_pi_manager->NotifyAuiPlugIns();
4772 g_pi_manager->ShowDeferredBlacklistMessages();
4774 g_pi_manager->CallLateInit();
4779 if (g_pi_manager->IsAnyPlugInChartEnabled()) {
4780 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4782 if (cc) cc->SetFirstAuto(
true);
4785 b_reloadForPlugins =
true;
4792 if (g_MainToolbar) {
4793 g_MainToolbar->SetAutoHide(g_bAutoHideToolbar);
4794 g_MainToolbar->SetAutoHideTimer(g_nAutoHideToolbar);
4800 for(
unsigned int i=0 ; i < g_canvasArray.GetCount() ; i++){
4802 cc->RequestNewCanvasToolbar(
true );
4804 if(cc && cc->GetToolbarEnable()){
4805 cc->GetToolbar()->SetAutoHide(g_bAutoHideToolbar);
4806 cc->GetToolbar()->SetAutoHideTimer(g_nAutoHideToolbar);
4816 pConfig->SetPath(
"/Settings");
4817 pConfig->Read(
"OptionsSizeX", &sx, -1);
4818 pConfig->Read(
"OptionsSizeY", &sy, -1);
4820 wxWindow *optionsParent =
this;
4822 optionsParent = GetPrimaryCanvas();
4824 g_options =
new options(optionsParent, -1, _(
"Options"), wxPoint(-1, -1),
4827 BuildiENCToolbar(
true);
4834 if (!g_params.empty()) {
4835 for (
size_t n = 0; n < g_params.size(); n++) {
4836 wxString path = g_params[n];
4837 if (::wxFileExists(path)) {
4839 pSet->load_file(path.fn_str());
4842 pSet->LoadAllGPXObjects(
4843 !pSet->IsOpenCPN(), wpt_dups,
4845 LLBBox box = pSet->GetBBox();
4846 if (box.GetValid()) {
4847 CenterView(GetPrimaryCanvas(), box);
4856 InitAppMsgBusListener();
4864 wxLogMessage(_T(
"OnInitTimer...Last Call"));
4866 PositionIENCToolbar();
4868 g_bDeferredInitDone =
true;
4870 GetPrimaryCanvas()->SetFocus();
4871 g_focusCanvas = GetPrimaryCanvas();
4877 if (b_reloadForPlugins) {
4882 wxLogMessage(_T(
"OnInitTimer...Finalize Canvases"));
4884 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4888 cc->CheckGroupValid();
4893 androidEnableBackButton(
true);
4894 androidEnableRotation();
4895 androidEnableOptionItems(
true);
4899 if (g_MainToolbar) g_MainToolbar->EnableTool(ID_SETTINGS,
true);
4908 if (!g_bDeferredInitDone) InitTimer.Start(100, wxTIMER_ONE_SHOT);
4910 wxLog::FlushActive();
4912 RefreshAllCanvas(
true);
4913 wxGetApp().m_usb_watcher.Start();
4919void MyFrame::InitAppMsgBusListener() {
4920 auto &msgbus = AppMsgBus::GetInstance();
4923 AppMsg msg_basic(AppMsg::Type::BasicNavData);
4924 listener_basic_navdata.
Listen(msg_basic,
this, EVT_BASIC_NAV_DATA);
4927 auto ptr = ev.GetSharedPtr();
4928 auto basicnav_msg = std::static_pointer_cast<const BasicNavDataMsg>(ptr);
4929 HandleBasicNavMsg(basicnav_msg);
4933 AppMsg msg_watchdog(AppMsg::Type::GPSWatchdog);
4934 listener_gps_watchdog.
Listen(msg_watchdog,
this, EVT_GPS_WATCHDOG);
4937 auto ptr = ev.GetSharedPtr();
4938 auto msg = std::static_pointer_cast<const GPSWatchdogMsg>(ptr);
4939 HandleGPSWatchdogMsg(msg);
4946void MyFrame::ReleaseApiListeners() {}
4951 m_on_raise_listener.
Init(server.on_raise, [&](
ObservedEvt) { Raise(); });
4952 m_on_quit_listener.
Init(server.on_quit, [&](
ObservedEvt) { FastClose(); });
4953 server.SetGetRestApiEndpointCb(
4954 [&] {
return wxGetApp().m_rest_server.GetEndpoint(); });
4955 server.open_file_cb = [](
const std::string &path) {
4956 return wxGetApp().OpenFile(path);
4963void MyFrame::HandleGPSWatchdogMsg(std::shared_ptr<const GPSWatchdogMsg> msg) {
4964 if (msg->gps_watchdog <= 0) {
4965 if (msg->wd_source == GPSWatchdogMsg::WDSource::position) {
4966 bool last_bGPSValid = bGPSValid;
4969 if (last_bGPSValid != bGPSValid) UpdateGPSCompassStatusBoxes(
true);
4970 }
else if (msg->wd_source == GPSWatchdogMsg::WDSource::velocity) {
4971 bool last_bVelocityValid = bVelocityValid;
4972 bVelocityValid =
false;
4979void MyFrame::CalculateCOGAverage() {
4981 if (!std::isnan(gCog)) {
4982 if (g_COGAvgSec > 0) {
4984 for (
int i = g_COGAvgSec - 1; i > 0; i--) COGTable[i] = COGTable[i - 1];
4987 double sum = 0., count = 0;
4988 for (
int i = 0; i < g_COGAvgSec; i++) {
4989 double adder = COGTable[i];
4990 if (std::isnan(adder))
continue;
4992 if (fabs(adder - g_COGAvg) > 180.) {
4993 if ((adder - g_COGAvg) > 0.)
5006 else if (sum >= 360.)
5015void MyFrame::HandleBasicNavMsg(std::shared_ptr<const BasicNavDataMsg> msg) {
5016 m_fixtime = msg->time;
5017 double hdt_data_interval = 0;
5018 double fix_time_interval = 0;
5020 double msgtime = msg->set_time.tv_sec;
5021 double m1 = msg->set_time.tv_nsec / 1e9;
5024 if (((msg->vflag & POS_UPDATE) == POS_UPDATE) &&
5025 ((msg->vflag & POS_VALID) == POS_VALID)) {
5028 DistanceBearingMercator(gLat, gLon, gLat_gt, gLon_gt, &brg, &dist);
5031 fix_time_gt_last = fix_time_gt;
5032 uint64_t fix_time_gt_now =
5033 msg->set_time.tv_sec * 1e9 + msg->set_time.tv_nsec;
5034 fix_time_interval = (fix_time_gt_now - fix_time_gt_last) / (
double)1e9;
5038 double implied_sog = dist / (fix_time_interval / 3600);
5043 gLat_gt_m1 = gLat_gt;
5044 gLon_gt_m1 = gLon_gt;
5048 fix_time_gt = fix_time_gt_now;
5052 if (((msg->vflag & COG_UPDATE) == COG_UPDATE) &&
5053 ((msg->vflag & SOG_UPDATE) == SOG_UPDATE)) {
5054 gCog_gt_m1 = gCog_gt;
5064 if (!std::isnan(gCog_gt_m1)) {
5066 if ((fabs(gSog - implied_sog) / gSog) > 0.5) {
5073 if ((fix_time_gt - fix_time_gt_last) > .08) {
5078 if (gCog_gt > gCog_gt_m1) {
5079 if ((gCog_gt - gCog_gt_m1) > 180.)
5084 if ((gCog_gt_m1 - gCog_gt) > 180.)
5089 difft = fabs(gCog_gt - gCog_gt_m1);
5090 if (fabs(difft > 180.)) difft = fabs(difft - 360.);
5098 double tentative_cog_rate_gt = diff / (fix_time_gt - fix_time_gt_last);
5099 tentative_cog_rate_gt *= 1e9;
5100 cog_rate_gt = tentative_cog_rate_gt;
5108 if ((msg->vflag & HDT_UPDATE) == HDT_UPDATE) {
5109 if (!std::isnan(gHdt)) {
5111 uint64_t hdt_time_gt_last = hdt_time_gt;
5112 hdt_time_gt = msg->set_time.tv_sec * 1e9 + msg->set_time.tv_nsec;
5113 hdt_data_interval = (hdt_time_gt - hdt_time_gt_last) / 1e9;
5116 if (hdt_data_interval > .09) {
5118 gHdt_gt_m1 = gHdt_gt;
5121 if (!std::isnan(gHdt_gt_m1)) {
5123 double tentative_hdt_rate_gt =
5124 (gHdt_gt - gHdt_gt_m1) / (hdt_time_gt - hdt_time_gt_last);
5125 tentative_hdt_rate_gt *= 1e9;
5127 if (fabs(tentative_hdt_rate_gt - hdt_rate_gt) < 180.)
5128 hdt_rate_gt = tentative_hdt_rate_gt;
5136 if (std::isnan(gHdt)) gHdt_gt = NAN;
5139 CalculateCOGAverage();
5146 bool last_bGPSValid = bGPSValid;
5147 if ((msg->vflag & POS_UPDATE) == POS_UPDATE) {
5148 if ((msg->vflag & POS_VALID) == POS_VALID)
5153 if (last_bGPSValid != bGPSValid) UpdateGPSCompassStatusBoxes(
true);
5155 bVelocityValid =
true;
5159void MyFrame::UpdateStatusBar() {
5162 unsigned long uiCurrentTickCount;
5163 m_MMEAeventTime.SetToCurrent();
5164 uiCurrentTickCount =
5165 m_MMEAeventTime.GetMillisecond() / 100;
5166 uiCurrentTickCount += m_MMEAeventTime.GetTicks() * 10;
5167 if (uiCurrentTickCount > m_ulLastNMEATicktime + 1) {
5168 m_ulLastNMEATicktime = uiCurrentTickCount;
5170 if (m_tick_idx++ > 6) m_tick_idx = 0;
5175 if (NULL != GetStatusBar()) {
5178 tick_buf[0] = nmea_tick_chars[m_tick_idx];
5181 wxString s1(tick_buf, wxConvUTF8);
5183 s1 += toSDMM(1, gLat);
5185 s1 += toSDMM(2, gLon);
5187 if (STAT_FIELD_TICK >= 0) SetStatusText(s1, STAT_FIELD_TICK);
5191 if (!std::isnan(gSog))
5192 sogcog.Printf(_T(
"SOG %2.2f ") + getUsrSpeedUnit() + _T(
" "),
5195 sogcog.Printf(_T(
"SOG --- "));
5199 if (!std::isnan(gCog) && !std::isnan(gSog) && (gSog > 0.05)) {
5201 cogs << wxString::Format(wxString(
"COG %03d%c "), (
int)gCog, 0x00B0);
5203 cogs << wxString::Format(wxString(
"COG %03d%c(M) "),
5204 (
int)toMagnetic(gCog), 0x00B0);
5206 cogs.Printf((
"COG ---%c"), 0x00B0);
5208 sogcog.Append(cogs);
5209 SetStatusText(sogcog, STAT_FIELD_SOGCOG);
5214void MyFrame::OnMemFootTimer(wxTimerEvent &event) {
5215 MemFootTimer.Stop();
5217 int memsize = GetApplicationMemoryUse();
5220 printf(
"Memsize: %d \n", memsize);
5223 if (memsize > (g_MemFootMB * 1000)) {
5225 if (ChartData && cc) {
5227 wxArrayPtrVoid *pCache = ChartData->GetChartCache();
5228 unsigned int nCache = pCache->GetCount();
5231 for (
unsigned int i = 0; i < nCache; i++) {
5241 for (
unsigned int i = 0; i < nCache - 1; i++) {
5242 if (pcea[i].RecentTime > pcea[i + 1].RecentTime) {
5244 pcea[i] = pcea[i + 1];
5255 unsigned int idelete = 0;
5256 unsigned int idelete_max = pCache->GetCount();
5259 unsigned int minimum_cache = 1;
5260 if (cc->GetQuiltMode()) minimum_cache = cc->GetQuiltChartCount();
5262 while ((memsize > (g_MemFootMB * 1000)) &&
5263 (pCache->GetCount() > minimum_cache) &&
5264 (idelete < idelete_max)) {
5265 int memsizeb = memsize;
5267 ChartData->DeleteCacheChart((
ChartBase *)pcea[idelete].pChart);
5269 memsize = GetApplicationMemoryUse();
5270 printf(
"delete, before: %d after: %d\n", memsizeb, memsize);
5278 MemFootTimer.Start(9000, wxTIMER_CONTINUOUS);
5283void MyFrame::CheckToolbarPosition() {
5286 static bool bMaximized;
5288 if (IsMaximized() && !bMaximized) {
5290 if (g_MainToolbar) {
5291 g_MainToolbar->SetYAuxOffset(g_MainToolbar->GetToolSize().y * 15 / 10);
5292 g_MainToolbar->SetDefaultPosition();
5293 g_MainToolbar->Realize();
5295 PositionIENCToolbar();
5296 }
else if (!IsMaximized() && bMaximized) {
5298 if (g_MainToolbar) {
5299 g_MainToolbar->SetYAuxOffset(0);
5300 g_MainToolbar->SetDockY(-1);
5301 g_MainToolbar->SetDefaultPosition();
5302 g_MainToolbar->Realize();
5304 PositionIENCToolbar();
5309void MyFrame::ProcessUnitTest() {
5310 if (!g_bPauseTest && (g_unit_test_1 || g_unit_test_2)) {
5317 cc->m_bFollow =
false;
5318 if (g_MainToolbar && g_MainToolbar->GetToolbar())
5319 g_MainToolbar->GetToolbar()->ToggleTool(ID_FOLLOW, cc->m_bFollow);
5320 int ut_index_max = ((g_unit_test_1 > 0) ? (g_unit_test_1 - 1) : INT_MAX);
5323 if (cc->m_groupIndex > 0) {
5324 while (ut_index < ChartData->GetChartTableEntries() &&
5325 !ChartData->IsChartInGroup(ut_index, cc->m_groupIndex)) {
5329 if (ut_index < ChartData->GetChartTableEntries()) {
5331 const ChartTableEntry *cte = &ChartData->GetChartTableEntry(ut_index);
5333 double clat = (cte->GetLatMax() + cte->GetLatMin()) / 2;
5334 double clon = (cte->GetLonMax() + cte->GetLonMin()) / 2;
5341 if (cc->GetQuiltMode()) {
5342 if (cc->IsChartQuiltableRef(ut_index))
5343 cc->SelectQuiltRefdbChart(ut_index);
5345 cc->SelectdbChart(ut_index);
5348 if (g_unit_test_1) {
5356 DistanceBearingMercator(cte->GetLatMin(), cte->GetLonMin(),
5357 cte->GetLatMin(), cte->GetLonMax(), NULL,
5361 DistanceBearingMercator(cte->GetLatMin(), cte->GetLonMin(),
5362 cte->GetLatMax(), cte->GetLonMin(), NULL,
5365 cc->GetSize(&ww, &wh);
5366 ppm = wxMin(ww / (rw * 1852), wh / (rh * 1852)) * (100 - fabs(clat)) /
5368 ppm = wxMin(ppm, 1.0);
5375 if (ut_index > ut_index_max) exit(0);
5384void MyFrame::OnFrameTenHzTimer(wxTimerEvent &event) {
5386 bool b_rotate =
false;
5388 if (cc) b_rotate |= (cc->GetUpMode() != NORTH_UP_MODE);
5391 if (!b_rotate && !g_btenhertz)
return;
5393 bool b_update =
false;
5395 if (!std::isnan(gCog) && !std::isnan(gSog)) {
5398 struct timespec now;
5399 clock_gettime(CLOCK_MONOTONIC, &now);
5400 uint64_t diff = 1e9 * (now.tv_sec) + now.tv_nsec - fix_time_gt;
5401 double diffc = diff / 1e9;
5404 double gCog_tentative = gCog_gt_m1 + (cog_rate_gt * diffc);
5405 if (gCog_tentative >= 360.) gCog_tentative -= 360.;
5406 if (gCog_tentative < 0.) gCog_tentative += 360.;
5407 gCog = gCog_tentative;
5411 if (!std::isnan(gHdt_gt) && !std::isnan(gHdt_gt_m1)) {
5412 uint64_t diff = 1e9 * (now.tv_sec) + now.tv_nsec - hdt_time_gt;
5413 double diffc = diff / 1e9;
5414 gHdt = gHdt_gt_m1 + (hdt_rate_gt * diffc);
5418 if (gSog_gt && !std::isnan(gCog_gt)) {
5419 double delta_t = diffc / 3600;
5420 double distance = gSog_gt * delta_t;
5423 double angr = gCog_gt / 180 * M_PI;
5424 double latr = gLat_gt * M_PI / 180;
5425 double D = distance / 3443;
5426 double sD = sin(D), cD = cos(D);
5427 double sy = sin(latr), cy = cos(latr);
5428 double sa = sin(angr), ca = cos(angr);
5430 gLon = gLon_gt + asin(sa * sD / cy) * 180 / M_PI;
5431 gLat = asin(sy * cD + cy * sD * ca) * 180 / M_PI;
5441 if (cc) cc->DoCanvasCOGSet();
5452 if (b_rotate || cc->m_bFollow) {
5453 cc->DoCanvasUpdate();
5462 FrameTenHzTimer.Start(100, wxTIMER_CONTINUOUS);
5465void MyFrame::ProcessQuitFlag() {
5468 wxLogMessage(_T(
"Got quitflag from SIGNAL"));
5470 FrameTenHzTimer.Stop();
5477void MyFrame::ProcessDeferredTrackOn() {
5480 if (g_bDeferredStartTrack) {
5481 if (!g_bTrackActive) {
5484 g_bDeferredStartTrack =
false;
5487 g_bDeferredStartTrack =
false;
5492void MyFrame::ProcessAnchorWatch() {
5495 if (pAnchorWatchPoint1) {
5498 DistanceBearingMercator(pAnchorWatchPoint1->m_lat,
5499 pAnchorWatchPoint1->m_lon, gLat, gLon, &brg, &dist);
5500 double d = g_nAWMax;
5501 (pAnchorWatchPoint1->GetName()).ToDouble(&d);
5502 d = AnchorDistFix(d, AnchorPointMinDist, g_nAWMax);
5503 bool toofar =
false;
5504 bool tooclose =
false;
5505 if (d >= 0.0) toofar = (dist * 1852. > d);
5506 if (d < 0.0) tooclose = (dist * 1852 < -d);
5508 if (tooclose || toofar)
5509 AnchorAlertOn1 =
true;
5511 AnchorAlertOn1 =
false;
5513 AnchorAlertOn1 =
false;
5515 if (pAnchorWatchPoint2) {
5518 DistanceBearingMercator(pAnchorWatchPoint2->m_lat,
5519 pAnchorWatchPoint2->m_lon, gLat, gLon, &brg, &dist);
5521 double d = g_nAWMax;
5522 (pAnchorWatchPoint2->GetName()).ToDouble(&d);
5523 d = AnchorDistFix(d, AnchorPointMinDist, g_nAWMax);
5524 bool toofar =
false;
5525 bool tooclose =
false;
5526 if (d >= 0) toofar = (dist * 1852. > d);
5527 if (d < 0) tooclose = (dist * 1852 < -d);
5529 if (tooclose || toofar)
5530 AnchorAlertOn2 =
true;
5532 AnchorAlertOn2 =
false;
5534 AnchorAlertOn2 =
false;
5536 if ((pAnchorWatchPoint1 || pAnchorWatchPoint2) && !bGPSValid)
5537 AnchorAlertOn1 =
true;
5540void MyFrame::SendFixToPlugins() {
5544 GPSData.kLat = gLat;
5545 GPSData.kLon = gLon;
5546 GPSData.kCog = gCog;
5547 GPSData.kSog = gSog;
5548 GPSData.kVar = gVar;
5549 GPSData.kHdm = gHdm;
5550 GPSData.kHdt = gHdt;
5551 GPSData.nSats = g_SatsInView;
5553 wxDateTime tCheck((time_t)m_fixtime);
5554 if (tCheck.IsValid()) {
5559 GPSData.FixTime = m_fixtime;
5563 GPSData.FixTime = wxDateTime::Now().GetTicks();
5566 SendPositionFixToAllPlugIns(&GPSData);
5570void MyFrame::ProcessLogAndBells() {
5573 wxDateTime lognow = wxDateTime::Now();
5574 int hourLOC = lognow.GetHour();
5575 int minuteLOC = lognow.GetMinute();
5577 int minuteUTC = lognow.GetMinute();
5578 int second = lognow.GetSecond();
5580 wxTimeSpan logspan = lognow.Subtract(g_loglast_time);
5581 if ((logspan.IsLongerThan(wxTimeSpan(0, 30, 0, 0))) || (minuteUTC == 0) ||
5582 (minuteUTC == 30)) {
5583 if (logspan.IsLongerThan(wxTimeSpan(0, 1, 0, 0))) {
5584 wxString day = lognow.FormatISODate();
5585 wxString utc = lognow.FormatISOTime();
5586 wxString navmsg = _T(
"LOGBOOK: ");
5590 navmsg += _T(
" UTC ");
5594 data.Printf(_T(
" GPS Lat %10.5f Lon %10.5f "), gLat, gLon);
5598 if (std::isnan(gCog))
5599 cog.Printf(_T(
"COG ----- "));
5601 cog.Printf(_T(
"COG %10.5f "), gCog);
5604 if (std::isnan(gSog))
5605 sog.Printf(_T(
"SOG ----- "));
5607 sog.Printf(_T(
"SOG %6.2f ") + getUsrSpeedUnit(), toUsrSpeed(gSog));
5613 data.Printf(_T(
" DR Lat %10.5f Lon %10.5f"), gLat, gLon);
5616 wxLogMessage(navmsg);
5617 g_loglast_time = lognow;
5619 int bells = (hourLOC % 4) * 2;
5620 if (minuteLOC != 0) bells++;
5621 if (!bells) bells = 8;
5623 if (g_bPlayShipsBells && ((minuteLOC == 0) || (minuteLOC == 30))) {
5624 m_BellsToPlay = bells;
5625 wxCommandEvent ev(BELLS_PLAYED_EVTYPE);
5626 wxPostEvent(
this, ev);
5632void MyFrame::OnFrameTimer1(wxTimerEvent &event) {
5633 CheckToolbarPosition();
5639 if (bDBUpdateInProgress)
return;
5642 FrameTenHzTimer.Stop();
5644 ProcessDeferredTrackOn();
5646 ProcessAnchorWatch();
5647 ProcessLogAndBells();
5649 if (ShouldRestartTrack()) TrackDailyRestart();
5652 if (g_bSleep && !AnchorAlertOn1 && !AnchorAlertOn2) {
5653 FrameTimer1.Start(TIMER_GFRAME_1, wxTIMER_CONTINUOUS);
5654 FrameTenHzTimer.Start(100, wxTIMER_CONTINUOUS);
5660 if (gSog > 3.0) g_bCruising =
true;
5666 wxString sogcog(_T(
"SOG --- ") + getUsrSpeedUnit() + +_T(
" ") +
5667 _T(
" COG ---\u00B0"));
5668 if (GetStatusBar()) SetStatusText(sogcog, STAT_FIELD_SOGCOG);
5674 bool bnew_view =
false;
5675 if (!g_btenhertz) bnew_view = DoChartUpdate();
5680 bool bactiveRouteUpdate =
RoutemanGui(*g_pRouteMan).UpdateProgress();
5683 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5686 cc->DrawBlinkObjects();
5689 if (bactiveRouteUpdate) {
5691 if (g_pRouteMan->GetpActiveRoute())
5692 cc->RefreshRect(g_blink_rect,
false);
5696 cc->SetOwnShipState(SHIP_NORMAL);
5698 if (cc->GetQuiltMode()) {
5699 double erf = cc->GetQuiltMaxErrorFactor();
5700 if (erf > 0.02) cc->SetOwnShipState(SHIP_LOWACCURACY);
5702 if (cc->m_singleChart) {
5703 if (cc->m_singleChart->GetChart_Error_Factor() > 0.02)
5704 cc->SetOwnShipState(SHIP_LOWACCURACY);
5708 if (!bGPSValid) cc->SetOwnShipState(SHIP_INVALID);
5710 if ((bGPSValid != m_last_bGPSValid) ||
5711 (bVelocityValid != m_last_bVelocityValid)) {
5712 if (!g_bopengl) cc->UpdateShips();
5719 m_last_bGPSValid = bGPSValid;
5720 m_last_bVelocityValid = bVelocityValid;
5724 bool brq_dynamic =
false;
5726 auto *pplugin_array = PluginLoader::getInstance()->GetPlugInArray();
5727 for (
unsigned int i = 0; i < pplugin_array->GetCount(); i++) {
5729 if (pic->m_enabled && pic->m_init_state) {
5730 if (pic->
m_cap_flag & WANTS_DYNAMIC_OPENGL_OVERLAY_CALLBACK) {
5737 if (brq_dynamic) bnew_view =
true;
5741 if (AnchorAlertOn1 || AnchorAlertOn2) bnew_view =
true;
5744 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5749 if (cc->GetglCanvas()) {
5751 bool b_rotate = cc->GetUpMode() != NORTH_UP_MODE;
5754 if (cc->m_bFollow) {
5755 cc->DoCanvasUpdate();
5762 if (std::isnan(gCog)) cc->Refresh(
false);
5775 if ((!cc->m_bFollow) || (cc->GetUpMode() != NORTH_UP_MODE)) {
5789 if (g_pais_query_dialog_active && g_pais_query_dialog_active->IsShown())
5790 g_pais_query_dialog_active->UpdateText();
5793 if (g_pAISTargetList && (0 == (g_tick % (5))))
5794 g_pAISTargetList->UpdateAISTargetList();
5797 UpdateGPSCompassStatusBoxes();
5800 if (console && console->IsShown()) {
5802 console->RefreshConsoleData();
5809 if (m_bdefer_resize) {
5810 if (0 == (g_tick % (5))) {
5811 printf(
"___RESIZE\n");
5812 SetSize(m_defer_size);
5813 g_pauimgr->Update();
5814 m_bdefer_resize =
false;
5822 if (((g_tick % g_FlushNavobjChangesTimeout) == 0) || g_FlushNavobjChanges) {
5823 if (pConfig && pConfig->IsChangesFileDirty()) {
5824 androidShowBusyIcon();
5825 wxStopWatch update_sw;
5826 pConfig->UpdateNavObj(
true);
5827 wxString msg = wxString::Format(
5828 _T(
"OpenCPN periodic navobj update took %ld ms."), update_sw.Time());
5830 qDebug() << msg.mb_str();
5831 g_FlushNavobjChanges =
false;
5832 androidHideBusyIcon();
5841 FrameTimer1.Start(TIMER_GFRAME_1 * 3, wxTIMER_CONTINUOUS);
5843 FrameTimer1.Start(TIMER_GFRAME_1, wxTIMER_CONTINUOUS);
5844 FrameTenHzTimer.Start(100, wxTIMER_CONTINUOUS);
5848double MyFrame::GetMag(
double a,
double lat,
double lon) {
5849 double Variance = std::isnan(gVar) ? g_UserVar : gVar;
5850 auto loader = PluginLoader::getInstance();
5851 if (loader && loader->IsPlugInAvailable(_T(
"WMM"))) {
5858 wxDateTime now = wxDateTime::Now();
5859 SendJSON_WMM_Var_Request(lat, lon, now);
5860 if (fabs(gQueryVar) < 360.0)
5861 Variance = gQueryVar;
5863 return toMagnetic(a, Variance);
5866bool MyFrame::SendJSON_WMM_Var_Request(
double lat,
double lon,
5872 v[_T(
"Year")] = date.GetYear();
5873 v[_T(
"Month")] = date.GetMonth();
5874 v[_T(
"Day")] = date.GetDay();
5876 SendJSONMessageToAllPlugins(_T(
"WMM_VARIATION_REQUEST"), v);
5882void MyFrame::TouchAISActive(
void) {
5884 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5886 if (cc) cc->TouchAISToolActive();
5890void MyFrame::UpdateAISTool(
void) {
5891 if (!g_pAIS)
return;
5894 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5896 if (cc) cc->UpdateAISTBTool();
5901void MyFrame::OnFrameTCTimer(wxTimerEvent &event) {
5903 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5905 if (cc) cc->SetbTCUpdate(
true);
5908 RefreshAllCanvas(
false);
5913void MyFrame::OnFrameCOGTimer(wxTimerEvent &event) {
5917 bool b_rotate =
false;
5918 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5920 if (cc) b_rotate |= (cc->GetUpMode() != NORTH_UP_MODE);
5924 FrameCOGTimer.Stop();
5931 int period_ms = 100;
5933 FrameCOGTimer.Start(period_ms, wxTIMER_CONTINUOUS);
5936void MyFrame::DoCOGSet(
void) {
5938 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5940 if (cc) cc->DoCanvasCOGSet();
5944void RenderShadowText(wxDC *pdc, wxFont *pFont, wxString &str,
int x,
int y) {
5950 wxFont oldfont = pdc->GetFont();
5952 pdc->SetFont(*pFont);
5953 pdc->SetTextForeground(GetGlobalColor(_T(
"CHGRF")));
5954 pdc->SetBackgroundMode(wxTRANSPARENT);
5956 pdc->DrawText(str, x, y + 1);
5957 pdc->DrawText(str, x, y - 1);
5958 pdc->DrawText(str, x + 1, y);
5959 pdc->DrawText(str, x - 1, y);
5961 pdc->SetTextForeground(GetGlobalColor(_T(
"CHBLK")));
5963 pdc->DrawText(str, x, y);
5965 pdc->SetFont(oldfont);
5969void MyFrame::UpdateRotationState(
double rotation) {
5971 g_bCourseUp =
false;
5973 if (fabs(rotation) > .001) {
5974 SetMenubarItemState(ID_MENU_CHART_COGUP,
false);
5975 SetMenubarItemState(ID_MENU_CHART_NORTHUP,
true);
5977 m_pMenuBar->SetLabel(ID_MENU_CHART_NORTHUP, _(
"Rotated Mode"));
5980 SetMenubarItemState(ID_MENU_CHART_COGUP, g_bCourseUp);
5981 SetMenubarItemState(ID_MENU_CHART_NORTHUP, !g_bCourseUp);
5983 m_pMenuBar->SetLabel(ID_MENU_CHART_NORTHUP, _(
"North Up Mode"));
5987 UpdateGPSCompassStatusBoxes(
true);
5991void MyFrame::UpdateGPSCompassStatusBoxes(
bool b_force_new) {
5993 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5995 if (cc) cc->UpdateGPSCompassStatusBox(b_force_new);
6001int MyFrame::GetApplicationMemoryUse(
void) {
6007 wxWindow *fWin = wxWindow::FindFocus();
6009 wxArrayString outputArray;
6010 wxString cmd(_T(
"ps --no-headers -o vsize "));
6011 unsigned long pid = wxGetProcessId();
6013 cmd1.Printf(_T(
"%ld"), pid);
6015 wxExecute(cmd, outputArray);
6017 if (outputArray.GetCount()) {
6018 wxString s = outputArray.Item(0);
6020 if (s.ToLong(&vtmp)) memsize = vtmp;
6023 if (fWin) fWin->SetFocus();
6029 PROCESS_MEMORY_COUNTERS pmc;
6031 unsigned long processID = wxGetProcessId();
6033 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,
6035 if (NULL == hProcess)
return 0;
6037 if (GetProcessMemoryInfo(hProcess, &pmc,
sizeof(pmc))) {
6055 memsize = pmc.WorkingSetSize / 1024;
6058 CloseHandle(hProcess);
6065double MyFrame::GetBestVPScale(
ChartBase *pchart) {
6066 return GetPrimaryCanvas()->GetBestVPScale(pchart);
6069void MyFrame::SetChartUpdatePeriod() {
6072 g_ChartUpdatePeriod = 0;
6077 bool bskewdc =
false;
6078 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6081 if (!g_bopengl && !cc->GetVP().b_quilt) {
6082 if (fabs(cc->GetVP().
skew) > 0.0001) bskewdc =
true;
6084 if (cc->m_bFollow) g_ChartUpdatePeriod = 1;
6088 if (bskewdc) g_ChartUpdatePeriod = g_SkewCompUpdatePeriod;
6090 m_ChartUpdatePeriod = g_ChartUpdatePeriod;
6095 cc->UpdateCanvasControlBar();
6098void MyFrame::selectChartDisplay(
int type,
int family) {
6100 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6102 if (cc) cc->selectCanvasChartDisplay(type, family);
6105 UpdateGlobalMenuItems();
6114bool MyFrame::DoChartUpdate(
void) {
6115 bool return_val =
false;
6118 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6120 if (cc) return_val |= cc->DoCanvasUpdate();
6126void MyFrame::MouseEvent(wxMouseEvent &event) {
6128 event.GetPosition(&x, &y);
6133#include <mach/mach.h>
6134#include <mach/message.h>
6135#include <mach/kern_return.h>
6136#include <mach/task_info.h>
6138#include <malloc/malloc.h>
6145#if defined(__linux__)
6146#include "sys/types.h"
6147#include "sys/sysinfo.h"
6150int g_lastMemTick = -1;
6154bool GetMemoryStatus(
int *mem_total,
int *mem_used) {
6156 return androidGetMemoryStatus(mem_total, mem_used);
6159#if defined(__linux__)
6163 struct sysinfo sys_info;
6164 if (sysinfo(&sys_info) != -1)
6165 *mem_total = ((uint64_t)sys_info.totalram * sys_info.mem_unit) / 1024;
6179 FILE *file = fopen(
"/proc/self/statm",
"r");
6181 if (fscanf(file,
"%d", mem_used) != 1) {
6182 wxLogWarning(
"Cannot parse /proc/self/statm (!)");
6195 PROCESS_MEMORY_COUNTERS pmc;
6197 unsigned long processID = wxGetProcessId();
6200 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,
6203 if (hProcess && GetProcessMemoryInfo(hProcess, &pmc,
sizeof(pmc))) {
6221 *mem_used = pmc.WorkingSetSize / 1024;
6224 CloseHandle(hProcess);
6228 MEMORYSTATUSEX statex;
6230 statex.dwLength =
sizeof(statex);
6232 GlobalMemoryStatusEx(&statex);
6250 *mem_total = statex.ullTotalPhys / 1024;
6257 if (g_tick != g_lastMemTick) {
6258 malloc_zone_pressure_relief(NULL, 0);
6261 int blocksInUse = 0;
6262 int sizeAllocated = 0;
6264 malloc_statistics_t stats;
6265 stats.blocks_in_use = 0;
6266 stats.size_in_use = 0;
6267 stats.max_size_in_use = 0;
6268 stats.size_allocated = 0;
6269 malloc_zone_statistics(NULL, &stats);
6270 bytesInUse += stats.size_in_use;
6271 blocksInUse += stats.blocks_in_use;
6272 sizeAllocated += stats.size_allocated;
6274 g_memUsed = sizeAllocated >> 10;
6277 g_lastMemTick = g_tick;
6280 if (mem_used) *mem_used = g_memUsed;
6283 FILE *fpIn = popen(
"sysctl -n hw.memsize",
"r");
6285 double pagesUsed = 0.0, totalPages = 0.0;
6287 if (fgets(buf,
sizeof(buf), fpIn) != NULL) {
6288 *mem_total = atol(buf) >> 10;
6296 if (mem_used) *mem_used = 0;
6297 if (mem_total) *mem_total = 0;
6301void MyFrame::DoPrint(
void) {
6303 g_PrintingInProgress =
true;
6306 GetPrimaryCanvas()->GetglCanvas()->Render();
6307 GetPrimaryCanvas()->GetglCanvas()->SwapBuffers();
6312 if (NULL == g_printData) {
6313 g_printData =
new wxPrintData;
6314 g_printData->SetOrientation(wxLANDSCAPE);
6315 g_pageSetupData =
new wxPageSetupDialogData;
6318 wxPrintDialogData printDialogData(*g_printData);
6319 printDialogData.EnablePageNumbers(
false);
6321 wxPrinter printer(&printDialogData);
6328 if (g_bopengl) printout.GenerateGLbmp();
6330 if (!printer.Print(
this, &printout,
true)) {
6331 if (wxPrinter::GetLastError() == wxPRINTER_ERROR)
6332 OCPNMessageBox(NULL,
6333 _(
"There was a problem printing.\nPerhaps your current "
6334 "printer is not set correctly?"),
6335 _T(
"OpenCPN"), wxOK);
6339 (*g_printData) = printer.GetPrintDialogData().GetPrintData();
6358 g_PrintingInProgress =
false;
6361 GetPrimaryCanvas()->SetFocus();
6366wxDateTime gTimeSource;
6369 wxString message_ID =
event.GetID();
6370 wxString message_JSONText =
event.GetJSONText();
6378 if (message_ID == _T(
"WMM_VARIATION_BOAT")) {
6386 int numErrors = reader.
Parse(message_JSONText, &root);
6387 if (numErrors > 0) {
6393 wxString decl = root[_T(
"Decl")].
AsString();
6395 decl.ToDouble(&decl_val);
6401 if (message_ID == _T(
"WMM_VARIATION")) {
6409 int numErrors = reader.
Parse(message_JSONText, &root);
6410 if (numErrors > 0) {
6416 wxString decl = root[_T(
"Decl")].
AsString();
6418 decl.ToDouble(&decl_val);
6420 gQueryVar = decl_val;
6423 if (message_ID == _T(
"GRIB_TIMELINE")) {
6426 r.
Parse(message_JSONText, &v);
6427 if (v[_T(
"Day")].AsInt() == -1)
6428 gTimeSource = wxInvalidDateTime;
6430 gTimeSource.Set(v[_T(
"Day")].AsInt(),
6431 (wxDateTime::Month)v[_T(
"Month")].AsInt(),
6432 v[_T(
"Year")].AsInt(), v[_T(
"Hour")].AsInt(),
6433 v[_T(
"Minute")].AsInt(), v[_T(
"Second")].AsInt());
6435 if (message_ID == _T(
"OCPN_TRACK_REQUEST")) {
6438 wxString trk_id = wxEmptyString;
6440 int numErrors = reader.
Parse(message_JSONText, &root);
6441 if (numErrors > 0)
return;
6444 trk_id = root[_T(
"Track_ID")].
AsString();
6447 v[_T(
"Track_ID")] = trk_id;
6448 for (
Track *ptrack : g_TrackList) {
6449 wxString name = wxEmptyString;
6450 if (ptrack->m_GUID == trk_id) {
6451 name = ptrack->GetName();
6452 if (name.IsEmpty()) {
6454 if (rp && rp->GetCreateTime().IsValid())
6455 name = rp->GetCreateTime().FormatISODate() + _T(
" ") +
6456 rp->GetCreateTime().FormatISOTime();
6458 name = _(
"(Unnamed Track)");
6464 v[_T(
"error")] =
false;
6465 v[_T(
"TotalNodes")] = ptrack->GetnPoints();
6466 for (
int j = 0; j < ptrack->GetnPoints(); j++) {
6468 v[_T(
"lat")] = tp->m_lat;
6469 v[_T(
"lon")] = tp->m_lon;
6470 v[_T(
"NodeNr")] = i;
6472 wxString msg_id(_T(
"OCPN_TRACKPOINTS_COORDS"));
6473 SendJSONMessageToAllPlugins(msg_id, v);
6477 v[_T(
"error")] =
true;
6479 wxString msg_id(_T(
"OCPN_TRACKPOINTS_COORDS"));
6480 SendJSONMessageToAllPlugins(msg_id, v);
6482 }
else if (message_ID == _T(
"OCPN_ROUTE_REQUEST")) {
6485 wxString guid = wxEmptyString;
6487 int numErrors = reader.
Parse(message_JSONText, &root);
6488 if (numErrors > 0) {
6495 v[_T(
"GUID")] = guid;
6496 for (RouteList::iterator it = pRouteList->begin(); it != pRouteList->end();
6498 wxString name = wxEmptyString;
6500 if ((*it)->m_GUID == guid) {
6501 name = (*it)->m_RouteNameString;
6502 if (name.IsEmpty()) name = _(
"(Unnamed Route)");
6504 v[_T(
"Name")] = name;
6505 v[_T(
"error")] =
false;
6508 for (RoutePointList::iterator itp = (*it)->pRoutePointList->begin();
6509 itp != (*it)->pRoutePointList->end(); itp++) {
6510 w[i][_T(
"lat")] = (*itp)->m_lat;
6511 w[i][_T(
"lon")] = (*itp)->m_lon;
6512 w[i][_T(
"Name")] = (*itp)->GetName();
6513 w[i][_T(
"Description")] = (*itp)->GetDescription();
6514 w[i][_T(
"GUID")] = (*itp)->m_GUID;
6515 w[i][_T(
"ArrivalRadius")] = (*itp)->GetWaypointArrivalRadius();
6516 wxHyperlinkListNode *node = (*itp)->m_HyperlinkList->GetFirst();
6521 v[i][_T(
"WPLink") + wxString::Format(_T(
"%d"), n)] =
6523 v[i][_T(
"WPLinkDesciption") + wxString::Format(_T(
"%d"), n++)] =
6524 httpLink->DescrText;
6525 node = node->GetNext();
6530 v[_T(
"waypoints")] = w;
6531 wxString msg_id(_T(
"OCPN_ROUTE_RESPONSE"));
6532 SendJSONMessageToAllPlugins(msg_id, v);
6537 v[_T(
"error")] =
true;
6539 wxString msg_id(_T(
"OCPN_ROUTE_RESPONSE"));
6540 SendJSONMessageToAllPlugins(msg_id, v);
6541 }
else if (message_ID == _T(
"OCPN_ROUTELIST_REQUEST")) {
6546 int numErrors = reader.
Parse(message_JSONText, &root);
6547 if (numErrors > 0)
return;
6550 wxString str = root[_T(
"mode")].
AsString();
6551 if (str == _T(
"Track")) route =
false;
6556 for (RouteList::iterator it = pRouteList->begin();
6557 it != pRouteList->end(); it++) {
6558 wxString name = (*it)->m_RouteNameString;
6559 if (name.IsEmpty()) name = _(
"(Unnamed Route)");
6561 v[i][_T(
"error")] =
false;
6562 v[i][_T(
"name")] = name;
6563 v[i][_T(
"GUID")] = (*it)->m_GUID;
6564 v[i][_T(
"active")] = (*it)->IsActive();
6568 for (
Track *ptrack : g_TrackList) {
6569 wxString name = ptrack->GetName();
6570 if (name.IsEmpty()) {
6572 if (tp && tp->GetCreateTime().IsValid())
6573 name = tp->GetCreateTime().FormatISODate() + _T(
" ") +
6574 tp->GetCreateTime().FormatISOTime();
6576 name = _(
"(Unnamed Track)");
6578 v[i][_T(
"error")] =
false;
6579 v[i][_T(
"name")] = name;
6580 v[i][_T(
"GUID")] = ptrack->m_GUID;
6581 v[i][_T(
"active")] = g_pActiveTrack == ptrack;
6585 wxString msg_id(_T(
"OCPN_ROUTELIST_RESPONSE"));
6586 SendJSONMessageToAllPlugins(msg_id, v);
6589 v[0][_T(
"error")] =
true;
6590 wxString msg_id(_T(
"OCPN_ROUTELIST_RESPONSE"));
6591 SendJSONMessageToAllPlugins(msg_id, v);
6593 }
else if (message_ID == _T(
"OCPN_ACTIVE_ROUTELEG_REQUEST")) {
6595 v[0][_T(
"error")] =
true;
6596 if (g_pRouteMan->GetpActiveRoute()) {
6597 if (g_pRouteMan->m_bDataValid) {
6598 v[0][_T(
"error")] =
false;
6599 v[0][_T(
"range")] = g_pRouteMan->GetCurrentRngToActivePoint();
6600 v[0][_T(
"bearing")] = g_pRouteMan->GetCurrentBrgToActivePoint();
6601 v[0][_T(
"XTE")] = g_pRouteMan->GetCurrentXTEToActivePoint();
6602 v[0][_T(
"active_route_GUID")] =
6603 g_pRouteMan->GetpActiveRoute()->GetGUID();
6604 v[0][_T(
"active_waypoint_lat")] =
6605 g_pRouteMan->GetpActiveRoute()->m_pRouteActivePoint->GetLatitude();
6606 v[0][_T(
"active_waypoint_lon")] =
6607 g_pRouteMan->GetpActiveRoute()->m_pRouteActivePoint->GetLongitude();
6610 wxString msg_id(_T(
"OCPN_ACTIVE_ROUTELEG_RESPONSE"));
6611 SendJSONMessageToAllPlugins(msg_id, v);
6615void MyFrame::FilterCogSog(
void) {
6616 if (g_bfilter_cogsog && !g_own_ship_sog_cog_calc) {
6618 double cog_last = gCog;
6621 for (
int i = g_COGFilterSec - 1; i > 0; i--)
6622 COGFilterTable[i] = COGFilterTable[i - 1];
6623 COGFilterTable[0] = cog_last;
6626 if (!std::isnan(cog_last)) {
6628 double sum = 0., count = 0;
6629 for (
int i = 0; i < g_COGFilterSec; i++) {
6630 double adder = COGFilterTable[i];
6631 if (std::isnan(adder))
continue;
6633 if (fabs(adder - cog_last) > 180.) {
6634 if ((adder - cog_last) > 0.)
6647 else if (sum >= 360.)
6654 double sog_last = gSog;
6657 for (
int i = g_SOGFilterSec - 1; i > 0; i--)
6658 SOGFilterTable[i] = SOGFilterTable[i - 1];
6659 SOGFilterTable[0] = sog_last;
6662 if (!std::isnan(gSog)) {
6663 double sum = 0., count = 0;
6664 for (
int i = 0; i < g_SOGFilterSec; i++) {
6665 if (std::isnan(SOGFilterTable[i]))
continue;
6667 sum += SOGFilterTable[i];
6677void MyFrame::LoadHarmonics() {
6680 ptcmgr->LoadDataSources(TideCurrentDataSet);
6682 bool b_newdataset =
false;
6685 for (
auto a : ptcmgr->GetDataSet()) {
6686 bool b_foundi =
false;
6687 for (
auto b : TideCurrentDataSet) {
6694 b_newdataset =
true;
6699 for (
auto a : TideCurrentDataSet) {
6700 bool b_foundi =
false;
6701 for (
auto b : ptcmgr->GetDataSet()) {
6708 b_newdataset =
true;
6713 if (b_newdataset) ptcmgr->LoadDataSources(TideCurrentDataSet);
6717void MyFrame::ActivateAISMOBRoute(
const AisTargetData *ptarget) {
6718 if (!ptarget)
return;
6721 wxDateTime mob_time = wxDateTime::Now();
6722 wxString mob_label(_(
"AIS MAN OVERBOARD"));
6723 mob_label += _(
" at ");
6724 mob_label += mob_time.FormatTime();
6725 mob_label += _(
" on ");
6726 mob_label += mob_time.FormatISODate();
6729 mob_label, wxEmptyString);
6730 pWP_MOB->SetShared(
true);
6731 pWP_MOB->m_bIsolatedMark =
true;
6732 pSelect->AddSelectableRoutePoint(ptarget->Lat, ptarget->Lon, pWP_MOB);
6733 pConfig->AddNewWayPoint(pWP_MOB, -1);
6734 pWP_MOB->SetUseSca(
false);
6742 wxString(_(
"Own ship")), wxEmptyString);
6743 pSelect->AddSelectableRoutePoint(gLat, gLon, pWP_src);
6744 pWP_MOB->SetUseSca(
false);
6745 pAISMOBRoute =
new Route();
6746 pRouteList->Append(pAISMOBRoute);
6748 pAISMOBRoute->AddPoint(pWP_src);
6749 pAISMOBRoute->AddPoint(pWP_MOB);
6751 pSelect->AddSelectableRouteSegment(ptarget->Lat, ptarget->Lon, gLat, gLon,
6752 pWP_src, pWP_MOB, pAISMOBRoute);
6754 pAISMOBRoute->m_RouteNameString = _(
"Temporary AISMOB Route");
6755 pAISMOBRoute->m_RouteStartString = _(
"Present own ship");
6756 pAISMOBRoute->m_RouteEndString = mob_label;
6758 pAISMOBRoute->m_bDeleteOnArrival =
false;
6760 pAISMOBRoute->SetRouteArrivalRadius(-1.0);
6762 if (g_pRouteMan->GetpActiveRoute()) g_pRouteMan->DeactivateRoute();
6766 v[_T(
"GUID")] = pAISMOBRoute->m_GUID;
6767 wxString msg_id(_T(
"OCPN_MAN_OVERBOARD"));
6768 SendJSONMessageToAllPlugins(msg_id, v);
6771 if (RouteManagerDialog::getInstanceFlag()) {
6772 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
6773 pRouteManagerDialog->UpdateRouteListCtrl();
6774 pRouteManagerDialog->UpdateWptListCtrl();
6778 RefreshAllCanvas(
false);
6780 wxString mob_message(_(
"AIS MAN OVERBOARD"));
6781 mob_message += _(
" Time: ");
6782 mob_message += mob_time.Format();
6783 mob_message += _(
" Ownship Position: ");
6784 mob_message += toSDMM(1, gLat);
6785 mob_message += _T(
" ");
6786 mob_message += toSDMM(2, gLon);
6787 mob_message += _(
" MOB Position: ");
6788 mob_message += toSDMM(1, ptarget->Lat);
6789 mob_message += _T(
" ");
6790 mob_message += toSDMM(2, ptarget->Lon);
6791 wxLogMessage(mob_message);
6794void MyFrame::UpdateAISMOBRoute(
const AisTargetData *ptarget) {
6795 if (pAISMOBRoute && ptarget) {
6797 RoutePoint *OwnPoint = pAISMOBRoute->GetPoint(1);
6798 OwnPoint->m_lat = gLat;
6799 OwnPoint->m_lon = gLon;
6801 pSelect->DeleteSelectableRoutePoint(OwnPoint);
6802 pSelect->AddSelectableRoutePoint(gLat, gLon, OwnPoint);
6805 RoutePoint *MOB_Point = pAISMOBRoute->GetPoint(2);
6806 MOB_Point->m_lat = ptarget->Lat;
6807 MOB_Point->m_lon = ptarget->Lon;
6809 pSelect->DeleteSelectableRoutePoint(MOB_Point);
6810 pSelect->AddSelectableRoutePoint(ptarget->Lat, ptarget->Lon, MOB_Point);
6812 pSelect->UpdateSelectableRouteSegments(OwnPoint);
6813 pSelect->UpdateSelectableRouteSegments(MOB_Point);
6816 RefreshAllCanvas(
false);
6819 wxDateTime mob_time = wxDateTime::Now();
6821 wxString mob_message(_(
"AIS MAN OVERBOARD UPDATE"));
6822 mob_message += _(
" Time: ");
6823 mob_message += mob_time.Format();
6824 mob_message += _(
" Ownship Position: ");
6825 mob_message += toSDMM(1, gLat);
6826 mob_message += _T(
" ");
6827 mob_message += toSDMM(2, gLon);
6828 mob_message += _(
" MOB Position: ");
6829 mob_message += toSDMM(1, ptarget->Lat);
6830 mob_message += _T(
" ");
6831 mob_message += toSDMM(2, ptarget->Lon);
6833 wxLogMessage(mob_message);
6837void MyFrame::applySettingsString(wxString settings) {
6839 int last_UIScaleFactor = g_GUIScaleFactor;
6840 bool previous_expert = g_bUIexpert;
6841 g_last_ChartScaleFactor = g_ChartScaleFactor;
6842 ArrayOfCDI *pNewDirArray =
new ArrayOfCDI;
6845 g_Platform->platformApplyPrivateSettingsString(settings, pNewDirArray);
6848 pConfig->UpdateSettings();
6851 if (g_last_ChartScaleFactor != g_ChartScaleFactor) rr |= S52_CHANGED;
6853 if (rr & S52_CHANGED) {
6855 ps52plib->FlushSymbolCaches(ChartCtxFactory());
6857 ->ClearCNSYLUPArray();
6858 ps52plib->GenerateStateHash();
6862 ProcessOptionsDialog(rr, pNewDirArray);
6867 bool b_newToolbar =
false;
6869 if (g_GUIScaleFactor != last_UIScaleFactor) b_newToolbar =
true;
6871 if (previous_expert != g_bUIexpert) b_newToolbar =
true;
6873 if (rr & TOOLBAR_CHANGED) b_newToolbar =
true;
6877 if (previous_expert && !g_bUIexpert) {
6878 androidForceFullRepaint();
6882 if (previous_expert != g_bUIexpert) g_Platform->applyExpertMode(g_bUIexpert);
6886 SetGPSCompassScale();
6888 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6890 if (cc) cc->GetCompass()->SetScaleFactor(g_compass_scalefactor);
6892 UpdateGPSCompassStatusBoxes(
true);
6895 AbstractPlatform::ShowBusySpinner();
6897 SetAllToolbarScale();
6901 AbstractPlatform::HideBusySpinner();
6903 RequestNewMasterToolbar(
true);
6910 UpdateControlBar(GetPrimaryCanvas());
6913 if (console) console->Raise();
6917 if (NMEALogWindow::GetInstance().Active())
6918 NMEALogWindow::GetInstance().GetTTYWindow()->Raise();
6921#ifdef wxHAS_POWER_EVENTS
6922void MyFrame::OnSuspending(wxPowerEvent &event) {
6926 wxLogMessage(_T(
"System suspend starting..."));
6929void MyFrame::OnSuspended(wxPowerEvent &WXUNUSED(event)) {
6932 wxLogMessage(_T(
"System is going to suspend."));
6935void MyFrame::OnSuspendCancel(wxPowerEvent &WXUNUSED(event)) {
6938 wxLogMessage(_T(
"System suspend was cancelled."));
6941int g_last_resume_ticks;
6942void MyFrame::OnResume(wxPowerEvent &WXUNUSED(event)) {
6943 wxDateTime now = wxDateTime::Now();
6944 wxLogMessage(_T(
"System resumed from suspend."));
6946 if ((now.GetTicks() - g_last_resume_ticks) > 5) {
6949 wxLogMessage(
"Restarting streams.");
6950 g_last_resume_ticks = now.GetTicks();
6954 g_pMUX->ClearStreams();
6956 g_pMUX->StartAllStreams();
6965 if (IsMaximized()) {
6970 wxSize sz = GetSize();
6971 SetSize(wxSize(sz.x - 1, sz.y));
6983void MyFrame::RequestNewMasterToolbar(
bool bforcenew) {
6984 bool btbRebuild =
false;
6986 bool b_reshow =
true;
6987 if (g_MainToolbar) {
6989 float ff = fabs(g_MainToolbar->GetScaleFactor() - g_toolbar_scalefactor);
6990 if ((ff > 0.01f) || bforcenew) {
6991 g_MainToolbar->DestroyToolBar();
6992 delete g_MainToolbar;
6993 g_MainToolbar = NULL;
6999 if (!g_MainToolbar) {
7000 long orient = g_Platform->GetDefaultToolbarOrientation();
7001 wxWindow *toolbarParent =
this;
7003 toolbarParent = GetPrimaryCanvas();
7006 toolbarParent, wxPoint(-1, -1), orient, g_toolbar_scalefactor);
7007 g_MainToolbar->SetBackGroundColorString(_T(
"GREY3"));
7008 g_MainToolbar->SetToolbarHideMethod(TOOLBAR_HIDE_TO_FIRST_TOOL);
7009 g_MainToolbar->SetToolConfigString(g_toolbarConfig);
7010 g_MainToolbar->EnableRolloverBitmaps(
false);
7012 g_MainToolbar->CreateConfigMenu();
7013 g_MainToolbar->SetDefaultPosition();
7015 g_bmasterToolbarFull =
true;
7018 if (g_MainToolbar) {
7019 CreateMasterToolbar();
7023 g_MainToolbar->SetColorScheme(global_color_scheme);
7029 g_MainToolbar->SetAutoHide(g_bAutoHideToolbar);
7030 g_MainToolbar->SetAutoHideTimer(g_nAutoHideToolbar);
7034bool MyFrame::CollapseGlobalToolbar() {
7035 if (g_MainToolbar) {
7036 m_nMasterToolCountShown = 1;
7037 g_MainToolbar->SetToolShowCount(m_nMasterToolCountShown);
7038 g_MainToolbar->GetToolbar()->InvalidateBitmaps();
7039 g_MainToolbar->Realize();
7040 g_bmasterToolbarFull =
false;
7049 if (g_MainToolbar) tb = g_MainToolbar->GetToolbar();
7056 ID_MASTERTOGGLE, style->GetToolIcon(_T(
"MUI_menu"), TOOLICON_NORMAL),
7057 wxITEM_NORMAL, _(
"Hide Toolbar"), _T(
"MUI_menu"));
7058 tic->m_bRequired =
true;
7060 g_MainToolbar->AddToolItem(tic);
7063 ID_SETTINGS, style->GetToolIcon(_T(
"MUI_settings"), TOOLICON_NORMAL),
7064 wxITEM_NORMAL, _(
"Options"), _T(
"MUI_settings"));
7065 g_MainToolbar->AddToolItem(tic);
7068 ID_MENU_ROUTE_NEW, style->GetToolIcon(_T(
"MUI_route"), TOOLICON_NORMAL),
7069 style->GetToolIcon(_T(
"MUI_route"), TOOLICON_TOGGLED), wxITEM_CHECK,
7070 wxString(_(
"Create Route")) << _T(
" (Ctrl-R)"), _T(
"MUI_route"));
7072 g_MainToolbar->AddToolItem(tic);
7075 ID_ROUTEMANAGER, style->GetToolIcon(_T(
"MUI_RMD"), TOOLICON_NORMAL),
7076 wxITEM_NORMAL, _(
"Route & Mark Manager"), _T(
"MUI_RMD"));
7077 g_MainToolbar->AddToolItem(tic);
7080 ID_TRACK, style->GetToolIcon(_T(
"MUI_track"), TOOLICON_NORMAL),
7081 style->GetToolIcon(_T(
"MUI_track"), TOOLICON_TOGGLED), wxITEM_CHECK,
7082 _(
"Enable Tracking"), _T(
"MUI_track"));
7083 g_MainToolbar->AddToolItem(tic);
7086 ID_COLSCHEME, style->GetToolIcon(_T(
"MUI_colorscheme"), TOOLICON_NORMAL),
7087 wxITEM_NORMAL, _(
"Change Color Scheme"), _T(
"MUI_colorscheme"));
7088 g_MainToolbar->AddToolItem(tic);
7099 ID_PRINT, style->GetToolIcon(_T(
"MUI_print"), TOOLICON_NORMAL),
7100 wxITEM_NORMAL, _(
"Print Chart"), _T(
"MUI_print"));
7101 g_MainToolbar->AddToolItem(tic);
7104 ID_ABOUT, style->GetToolIcon(_T(
"MUI_help"), TOOLICON_NORMAL),
7105 wxITEM_NORMAL, _(
"About OpenCPN"), _T(
"MUI_help"));
7106 g_MainToolbar->AddToolItem(tic);
7109 AddDefaultPositionPlugInTools();
7113 ID_MOB, style->GetToolIcon(_T(
"mob_btn"), TOOLICON_NORMAL), wxITEM_NORMAL,
7114 wxString(_(
"Drop MOB Marker")) << _(
" (Ctrl-Space)"), _T(
"mob_btn"));
7115 g_MainToolbar->AddToolItem(tic);
7118 g_MainToolbar->RebuildToolbar();
7122 g_MainToolbar->Realize();
7125 ArrayOfPlugInToolbarTools tool_array =
7126 g_pi_manager->GetPluginToolbarToolArray();
7127 for (
unsigned int i = 0; i < tool_array.GetCount(); i++) {
7129 if (!pttc->b_viz)
continue;
7131 if (pttc->kind == wxITEM_CHECK) tb->ToggleTool(pttc->id, pttc->b_toggle);
7134 SetMasterToolbarItemState(ID_TRACK, g_bTrackActive);
7135 if (g_bTrackActive) {
7136 g_MainToolbar->SetToolShortHelp(ID_TRACK, _(
"Disable Tracking"));
7138 g_MainToolbar->Realize();
7143bool MyFrame::CheckAndAddPlugInTool() {
7144 if (!g_pi_manager)
return false;
7149 if (g_MainToolbar) tb = g_MainToolbar->GetToolbar();
7151 if (!tb)
return false;
7153 int n_tools = tb->GetToolsCount();
7157 ArrayOfPlugInToolbarTools tool_array =
7158 g_pi_manager->GetPluginToolbarToolArray();
7160 for (
unsigned int i = 0; i < tool_array.GetCount(); i++) {
7162 if (pttc->position == n_tools) {
7163 wxBitmap *ptool_bmp;
7165 switch (global_color_scheme) {
7166 case GLOBAL_COLOR_SCHEME_DAY:
7167 ptool_bmp = pttc->bitmap_day;
7170 case GLOBAL_COLOR_SCHEME_DUSK:
7171 ptool_bmp = pttc->bitmap_dusk;
7173 case GLOBAL_COLOR_SCHEME_NIGHT:
7174 ptool_bmp = pttc->bitmap_night;
7177 ptool_bmp = pttc->bitmap_day;
7182 pttc->id, *(ptool_bmp), pttc->kind, pttc->shortHelp, _T(
""));
7184 tic->m_NormalIconSVG = pttc->pluginNormalIconSVG;
7185 tic->m_RolloverIconSVG = pttc->pluginRolloverIconSVG;
7186 tic->m_ToggledIconSVG = pttc->pluginToggledIconSVG;
7187 tic->m_bPlugin =
true;
7196 while (CheckAndAddPlugInTool()) {
7202bool MyFrame::AddDefaultPositionPlugInTools() {
7203 if (!g_pi_manager)
return false;
7209 ArrayOfPlugInToolbarTools tool_array =
7210 g_pi_manager->GetPluginToolbarToolArray();
7212 for (
unsigned int i = 0; i < tool_array.GetCount(); i++) {
7216 if (!pttc->b_viz)
continue;
7218 if (pttc->position == -1)
7220 wxBitmap *ptool_bmp;
7222 switch (global_color_scheme) {
7223 case GLOBAL_COLOR_SCHEME_DAY:
7224 ptool_bmp = pttc->bitmap_day;
7226 case GLOBAL_COLOR_SCHEME_DUSK:
7227 ptool_bmp = pttc->bitmap_dusk;
7229 case GLOBAL_COLOR_SCHEME_NIGHT:
7230 ptool_bmp = pttc->bitmap_night;
7233 ptool_bmp = pttc->bitmap_day;
7238 pttc->id, *(ptool_bmp), pttc->kind, pttc->shortHelp, _T(
""));
7240 tic->m_NormalIconSVG = pttc->pluginNormalIconSVG;
7241 tic->m_RolloverIconSVG = pttc->pluginRolloverIconSVG;
7242 tic->m_ToggledIconSVG = pttc->pluginToggledIconSVG;
7243 tic->m_bPlugin =
true;
7245 g_MainToolbar->AddToolItem(tic);
7258wxColour GetGlobalColor(wxString colorName);
7260static const char *usercolors[] = {
7261 "Table:DAY",
"GREEN1;120;255;120;",
"GREEN2; 45;150; 45;",
7262 "GREEN3;200;220;200;",
"GREEN4; 0;255; 0;",
"BLUE1; 170;170;255;",
7263 "BLUE2; 45; 45;170;",
"BLUE3; 0; 0;255;",
"GREY1; 200;200;200;",
7264 "GREY2; 230;230;230;",
"RED1; 220;200;200;",
"UBLCK; 0; 0; 0;",
7265 "UWHIT; 255;255;255;",
"URED; 255; 0; 0;",
"UGREN; 0;255; 0;",
7266 "YELO1; 243;229; 47;",
"YELO2; 128; 80; 0;",
"TEAL1; 0;128;128;",
7267 "GREEN5;170;254; 0;",
"COMPT; 245;247;244",
7269 "DILG0; 255;255;255;",
7271 "DILG0; 238;239;242;",
7273 "DILG1; 212;208;200;",
7274 "DILG2; 255;255;255;",
7278 "CHGRF; 163; 180; 183;",
"UINFM; 197; 69; 195;",
"UINFG; 104; 228; 86;",
7279 "UINFF; 125; 137; 140;",
"UINFR; 241; 84; 105;",
"SHIPS; 7; 7; 7;",
7280 "CHYLW; 244; 218; 72;",
"CHWHT; 212; 234; 238;",
7282 "UDKRD; 124; 16; 0;",
7283 "UARTE; 200; 0; 0;",
7285 "NODTA; 163; 180; 183;",
"CHBLK; 7; 7; 7;",
"SNDG1; 125; 137; 140;",
7286 "SNDG2; 7; 7; 7;",
"SCLBR; 235; 125; 54;",
"UIBDR; 125; 137; 140;",
7287 "UINFB; 58; 120; 240;",
"UINFD; 7; 7; 7;",
"UINFO; 235; 125; 54;",
7288 "PLRTE; 220; 64; 37;",
"CHMGD; 197; 69; 195;",
"UIBCK; 212; 234; 238;",
7290 "DASHB; 255;255;255;",
7291 "DASHL; 175;175;175;",
7292 "DASHF; 50; 50; 50;",
7293 "DASHR; 200; 0; 0;",
7295 "DASHN; 200;120; 0;",
7296 "DASH1; 204;204;255;",
7297 "DASH2; 122;131;172;",
7298 "COMP1; 211;211;211;",
7300 "GREY3; 40; 40; 40;",
7301 "BLUE4; 100;100;200;",
7302 "VIO01; 171; 33;141;",
"VIO02; 209;115;213;",
7303 "BLUEBACK; 212;234;238;",
7304 "LANDBACK; 201;185;122;",
7307 "Table:DUSK",
"GREEN1; 60;128; 60;",
"GREEN2; 22; 75; 22;",
7308 "GREEN3; 80;100; 80;",
"GREEN4; 0;128; 0;",
"BLUE1; 80; 80;160;",
7309 "BLUE2; 30; 30;120;",
"BLUE3; 0; 0;128;",
"GREY1; 100;100;100;",
7310 "GREY2; 128;128;128;",
"RED1; 150;100;100;",
"UBLCK; 0; 0; 0;",
7311 "UWHIT; 255;255;255;",
"URED; 120; 54; 11;",
"UGREN; 35;110; 20;",
7312 "YELO1; 120;115; 24;",
"YELO2; 64; 40; 0;",
"TEAL1; 0; 64; 64;",
7313 "GREEN5; 85;128; 0;",
"COMPT; 124;126;121",
7315 "CHGRF; 41; 46; 46;",
"UINFM; 58; 20; 57;",
"UINFG; 35; 76; 29;",
7316 "UINFF; 41; 46; 46;",
"UINFR; 80; 28; 35;",
"SHIPS; 71; 78; 79;",
7317 "CHYLW; 81; 73; 24;",
"CHWHT; 71; 78; 79;",
7319 "DILG0; 110;110;110;",
7320 "DILG1; 110;110;110;",
7322 "DILG3; 130;130;130;",
7323 "UITX1; 41; 46; 46;",
7325 "UARTE; 64; 64; 64;",
7327 "NODTA; 41; 46; 46;",
"CHBLK; 54; 60; 61;",
"SNDG1; 41; 46; 46;",
7328 "SNDG2; 71; 78; 79;",
"SCLBR; 75; 38; 19;",
"UIBDR; 54; 60; 61;",
7329 "UINFB; 19; 40; 80;",
"UINFD; 71; 78; 79;",
"UINFO; 75; 38; 19;",
7330 "PLRTE; 73; 21; 12;",
"CHMGD; 74; 58; 81;",
"UIBCK; 7; 7; 7;",
7332 "DASHB; 77; 77; 77;",
7333 "DASHL; 54; 54; 54;",
7335 "DASHR; 58; 21; 21;",
7336 "DASHG; 21; 58; 21;",
7337 "DASHN; 100; 50; 0;",
7338 "DASH1; 76; 76;113;",
7339 "DASH2; 48; 52; 72;",
7340 "COMP1; 107;107;107;",
7342 "GREY3; 20; 20; 20;",
7343 "BLUE4; 80; 80;160;",
7344 "VIO01; 128; 25;108;",
"VIO02; 171; 33;141;",
"BLUEBACK; 186;213;235;",
7345 "LANDBACK; 201;185;122;",
7347 "Table:NIGHT",
"GREEN1; 30; 80; 30;",
"GREEN2; 15; 60; 15;",
7348 "GREEN3; 12; 23; 9;",
"GREEN4; 0; 64; 0;",
"BLUE1; 60; 60;100;",
7349 "BLUE2; 22; 22; 85;",
"BLUE3; 0; 0; 40;",
"GREY1; 48; 48; 48;",
7350 "GREY2; 32; 32; 32;",
"RED1; 100; 50; 50;",
"UWHIT; 255;255;255;",
7351 "UBLCK; 0; 0; 0;",
"URED; 60; 27; 5;",
"UGREN; 17; 55; 10;",
7352 "YELO1; 60; 65; 12;",
"YELO2; 32; 20; 0;",
"TEAL1; 0; 32; 32;",
7353 "GREEN5; 44; 64; 0;",
"COMPT; 48; 49; 51",
7354 "DILG0; 80; 80; 80;",
7355 "DILG1; 80; 80; 80;",
7357 "DILG3; 65; 65; 65;",
7358 "UITX1; 31; 34; 35;",
7360 "UARTE; 64; 64; 64;",
7362 "CHGRF; 16; 18; 18;",
"UINFM; 52; 18; 52;",
"UINFG; 22; 24; 7;",
7363 "UINFF; 31; 34; 35;",
"UINFR; 59; 17; 10;",
"SHIPS; 37; 41; 41;",
7364 "CHYLW; 31; 33; 10;",
"CHWHT; 37; 41; 41;",
7366 "NODTA; 7; 7; 7;",
"CHBLK; 31; 34; 35;",
"SNDG1; 31; 34; 35;",
7367 "SNDG2; 43; 48; 48;",
"SCLBR; 52; 28; 12;",
"UIBDR; 31; 34; 35;",
7368 "UINFB; 21; 29; 69;",
"UINFD; 43; 48; 58;",
"UINFO; 52; 28; 12;",
7369 "PLRTE; 66; 19; 11;",
"CHMGD; 52; 18; 52;",
"UIBCK; 7; 7; 7;",
7372 "DASHL; 20; 20; 20;",
7373 "DASHF; 64; 64; 64;",
7374 "DASHR; 70; 15; 15;",
7375 "DASHG; 15; 70; 15;",
7376 "DASHN; 17; 80; 56;",
7377 "DASH1; 48; 52; 72;",
7378 "DASH2; 36; 36; 53;",
7379 "COMP1; 24; 24; 24;",
7381 "GREY3; 10; 10; 10;",
7382 "BLUE4; 70; 70;140;",
7383 "VIO01; 85; 16; 72;",
"VIO02; 128; 25;108;",
"BLUEBACK; 186;213;235;",
7384 "LANDBACK; 201;185;122;",
7388int get_static_line(
char *d,
const char **p,
int index,
int n) {
7389 if (!strcmp(p[index],
"*****"))
return 0;
7391 strncpy(d, p[index], n);
7395void InitializeUserColors(
void) {
7396 const char **p = usercolors;
7404 UserColorTableArray =
new wxArrayPtrVoid;
7405 UserColourHashTableArray =
new wxArrayPtrVoid;
7409 ct->tableName =
new wxString(_T(
"DAY"));
7410 ct->color =
new wxArrayPtrVoid;
7411 UserColorTableArray->Add((
void *)ct);
7414 ct->tableName =
new wxString(_T(
"DUSK"));
7415 ct->color =
new wxArrayPtrVoid;
7416 UserColorTableArray->Add((
void *)ct);
7419 ct->tableName =
new wxString(_T(
"NIGHT"));
7420 ct->color =
new wxArrayPtrVoid;
7421 UserColorTableArray->Add((
void *)ct);
7423 while ((get_static_line(buf, p, index,
sizeof(buf) - 1))) {
7424 if (!strncmp(buf,
"Table", 5)) {
7425 sscanf(buf,
"Table:%s", TableName);
7427 for (
unsigned int it = 0; it < UserColorTableArray->GetCount(); it++) {
7428 ctp = (colTable *)(UserColorTableArray->Item(it));
7429 if (!strcmp(TableName, ctp->tableName->mb_str())) {
7438 while (buf[j] !=
';' && j < 20) {
7444 S52color *c =
new S52color;
7445 strcpy(c->colName, name);
7447 sscanf(&buf[j],
";%i;%i;%i", &R, &G, &B);
7460 for (
unsigned int its = 0; its < UserColorTableArray->GetCount(); its++) {
7461 wxColorHashMap *phash =
new wxColorHashMap;
7462 UserColourHashTableArray->Add((
void *)phash);
7464 colTable *ctp = (colTable *)(UserColorTableArray->Item(its));
7466 for (
unsigned int ic = 0; ic < ctp->color->GetCount(); ic++) {
7467 S52color *c2 = (S52color *)(ctp->color->Item(ic));
7469 wxColour c(c2->R, c2->G, c2->B);
7470 wxString key(c2->colName, wxConvUTF8);
7477 pcurrent_user_color_hash =
7478 (wxColorHashMap *)UserColourHashTableArray->Item(0);
7481void DeInitializeUserColors(
void) {
7482 if (!UserColorTableArray)
return;
7483 for (
unsigned i = 0; i < UserColorTableArray->GetCount(); i++) {
7484 colTable *ct = (colTable *)UserColorTableArray->Item(i);
7486 for (
unsigned int j = 0; j < ct->color->GetCount(); j++) {
7487 S52color *c = (S52color *)ct->color->Item(j);
7491 delete ct->tableName;
7497 delete UserColorTableArray;
7499 for (
unsigned i = 0; i < UserColourHashTableArray->GetCount(); i++) {
7500 wxColorHashMap *phash = (wxColorHashMap *)UserColourHashTableArray->Item(i);
7504 delete UserColourHashTableArray;
7511typedef struct _MSW_COLOR_SPEC {
7513 wxString S52_RGB_COLOR;
7517MSW_COLOR_SPEC color_spec[] = {{COLOR_MENU, _T(
"UIBCK"), 0},
7518 {COLOR_MENUTEXT, _T(
"UITX1"), 0},
7519 {COLOR_BTNSHADOW, _T(
"UIBCK"), 0},
7522void SaveSystemColors() {
7536 MSW_COLOR_SPEC *pcspec = &color_spec[0];
7537 while (pcspec->COLOR_NAME != -1) {
7538 pcspec->SysRGB_COLOR = pGetSysColor(pcspec->COLOR_NAME);
7543void RestoreSystemColors() {
7544 int element[NCOLORS];
7545 int rgbcolor[NCOLORS];
7548 MSW_COLOR_SPEC *pcspec = &color_spec[0];
7549 while (pcspec->COLOR_NAME != -1) {
7550 element[i] = pcspec->COLOR_NAME;
7551 rgbcolor[i] = pcspec->SysRGB_COLOR;
7557 pSetSysColors(i, (
unsigned long *)&element[0], (
unsigned long *)&rgbcolor[0]);
7562void SetSystemColors(ColorScheme cs) {
7564 int element[NCOLORS];
7565 int rgbcolor[NCOLORS];
7567 if ((GLOBAL_COLOR_SCHEME_DUSK == cs) || (GLOBAL_COLOR_SCHEME_NIGHT == cs)) {
7568 MSW_COLOR_SPEC *pcspec = &color_spec[0];
7569 while (pcspec->COLOR_NAME != -1) {
7570 wxColour color = GetGlobalColor(pcspec->S52_RGB_COLOR);
7571 rgbcolor[i] = (color.Red() << 16) + (color.Green() << 8) + color.Blue();
7572 element[i] = pcspec->COLOR_NAME;
7578 pSetSysColors(i, (
unsigned long *)&element[0],
7579 (
unsigned long *)&rgbcolor[0]);
7583 RestoreSystemColors();
7588wxColor GetDimColor(wxColor c) {
7589 if ((global_color_scheme == GLOBAL_COLOR_SCHEME_DAY) ||
7590 (global_color_scheme == GLOBAL_COLOR_SCHEME_RGB))
7594 if (global_color_scheme == GLOBAL_COLOR_SCHEME_DUSK) factor = 0.5;
7595 if (global_color_scheme == GLOBAL_COLOR_SCHEME_NIGHT) factor = 0.25;
7597 wxImage::RGBValue rgb(c.Red(), c.Green(), c.Blue());
7598 wxImage::HSVValue hsv = wxImage::RGBtoHSV(rgb);
7599 hsv.value = hsv.value * factor;
7600 wxImage::RGBValue nrgb = wxImage::HSVtoRGB(hsv);
7602 return wxColor(nrgb.red, nrgb.green, nrgb.blue);
7608double AnchorDistFix(
double const d,
double const AnchorPointMinDist,
7609 double const AnchorPointMaxDist)
7612 if (d < AnchorPointMinDist)
7613 return AnchorPointMinDist;
7614 else if (d > AnchorPointMaxDist)
7615 return AnchorPointMaxDist;
7621 if (d > -AnchorPointMinDist)
7622 return -AnchorPointMinDist;
7623 else if (d < -AnchorPointMaxDist)
7624 return -AnchorPointMaxDist;
7631static const WORD MAX_CONSOLE_LINES =
7636void RedirectIOToConsole()
7641 wxIntPtr lStdHandle;
7643 CONSOLE_SCREEN_BUFFER_INFO coninfo;
7653 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
7654 coninfo.dwSize.Y = MAX_CONSOLE_LINES;
7655 SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
7659 lStdHandle = (wxIntPtr)GetStdHandle(STD_OUTPUT_HANDLE);
7660 hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
7661 fp = _fdopen(hConHandle,
"w");
7663 setvbuf(stdout, NULL, _IONBF, 0);
7667 lStdHandle = (wxIntPtr)GetStdHandle(STD_INPUT_HANDLE);
7668 hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
7669 fp = _fdopen(hConHandle,
"r");
7671 setvbuf(stdin, NULL, _IONBF, 0);
7675 lStdHandle = (wxIntPtr)GetStdHandle(STD_ERROR_HANDLE);
7676 hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
7677 fp = _fdopen(hConHandle,
"w");
7679 setvbuf(stderr, NULL, _IONBF, 0);
7691bool TestGLCanvas(wxString prog_dir) {
7693 wxString test_app = prog_dir;
7694 test_app += _T(
"ocpn_gltest1.exe");
7696 if (::wxFileExists(test_app)) {
7697 long proc_return = ::wxExecute(test_app, wxEXEC_SYNC);
7698 printf(
"OpenGL Test Process returned %0X\n", proc_return);
7699 if (proc_return == 0)
7700 printf(
"GLCanvas OK\n");
7702 printf(
"GLCanvas failed to start, disabling OpenGL.\n");
7704 return (proc_return == 0);
7714bool ReloadLocale() {
7719 (!g_Platform->ChangeLocale(g_locale, plocale_def_lang, &plocale_def_lang)
7726 FontMgr::Get().SetLocale(g_locale);
7734 if (pRoutePropDialog) {
7735 pRoutePropDialog->Hide();
7736 pRoutePropDialog->Destroy();
7737 pRoutePropDialog = NULL;
7740 if (pRouteManagerDialog) {
7741 pRouteManagerDialog->Hide();
7742 pRouteManagerDialog->Destroy();
7743 pRouteManagerDialog = NULL;
7746 if (console) console->SetColorScheme(global_color_scheme);
7747 if (g_pais_query_dialog_active) {
7748 g_pais_query_dialog_active->Destroy();
7749 g_pais_query_dialog_active = NULL;
7752 auto alert_dlg_active =
7754 if (alert_dlg_active) {
7755 alert_dlg_active->Destroy();
7756 g_pais_alert_dialog_active =
nullptr;
7759 if (g_pAISTargetList) {
7760 if (g_pauimgr) g_pauimgr->DetachPane(g_pAISTargetList);
7761 g_pAISTargetList->Disconnect_decoder();
7762 g_pAISTargetList->Destroy();
7763 g_pAISTargetList = NULL;
7767 if (gFrame->m_pMenuBar) {
7768 gFrame->SetMenuBar(NULL);
7769 gFrame->m_pMenuBar->Destroy();
7770 gFrame->m_pMenuBar = NULL;
7772 gFrame->BuildMenuBar();
7775 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
7777 if (cc) cc->CanvasApplyLocale();
7782 wxString perspective;
7783 pConfig->SetPath(_T (
"/AUI" ));
7784 pConfig->Read(_T (
"AUIPerspective" ), &perspective);
7789 PluginLoader::getInstance()->DeactivateAllPlugIns();
7790 PluginLoader::getInstance()->UpdatePlugIns();
7798 bool bno_load =
false;
7799 wxAuiPaneInfoArray pane_array_val = g_pauimgr->GetAllPanes();
7801 for (
unsigned int i = 0; i < pane_array_val.GetCount(); i++) {
7802 wxAuiPaneInfo pane = pane_array_val[i];
7803 if (perspective.Find(pane.name) == wxNOT_FOUND) {
7809 if (!bno_load) g_pauimgr->LoadPerspective(perspective,
false);
7811 g_pauimgr->Update();
7814 gFrame->RequestNewToolbars(
true);
7815 gFrame->RequestNewMasterToolbar(
true);
7819extern s57RegistrarMgr *m_pRegistrarMan;
7820extern wxString g_UserPresLibData;
7821extern wxString g_SENCPrefix;
7822extern wxString g_csv_locn;
7838 g_csv_locn = g_Platform->GetSharedDataDir();
7839 g_csv_locn.Append(_T(
"s57data"));
7842 g_csv_locn = _T(
".");
7843 appendOSDirSlash(&g_csv_locn);
7844 g_csv_locn.Append(_T(
"s57data"));
7849 if (g_SENCPrefix.IsEmpty()) {
7851 appendOSDirSlash(&g_SENCPrefix);
7852 g_SENCPrefix.Append(_T(
"SENC"));
7856 wxFileName f(g_SENCPrefix);
7858 g_SENCPrefix = f.GetFullPath();
7860 g_SENCPrefix = _T(
"SENC");
7866 bool b_force_legacy =
false;
7868 if (g_UserPresLibData.IsEmpty()) {
7869 plib_data = g_csv_locn;
7870 appendOSDirSlash(&plib_data);
7871 plib_data.Append(_T(
"S52RAZDS.RLE"));
7873 plib_data = g_UserPresLibData;
7874 b_force_legacy =
true;
7877 ps52plib =
new s52plib(plib_data, b_force_legacy);
7892 if (!ps52plib->m_bOK) {
7895 wxStandardPaths &std_path = g_Platform->GetStdPaths();
7897 wxString look_data_dir;
7898 look_data_dir.Append(std_path.GetUserDataDir());
7899 appendOSDirSlash(&look_data_dir);
7900 wxString tentative_SData_Locn = look_data_dir;
7901 look_data_dir.Append(_T(
"s57data"));
7903 plib_data = look_data_dir;
7904 appendOSDirSlash(&plib_data);
7905 plib_data.Append(_T(
"S52RAZDS.RLE"));
7907 wxLogMessage(_T(
"Looking for s57data in ") + look_data_dir);
7908 ps52plib =
new s52plib(plib_data);
7910 if (ps52plib->m_bOK) {
7911 g_csv_locn = look_data_dir;
7920 if (!ps52plib->m_bOK) {
7923 wxString look_data_dir;
7924 look_data_dir = g_Platform->GetSharedDataDir();
7925 look_data_dir.Append(_T(
"s57data"));
7927 plib_data = look_data_dir;
7928 appendOSDirSlash(&plib_data);
7929 plib_data.Append(_T(
"S52RAZDS.RLE"));
7931 wxLogMessage(_T(
"Looking for s57data in ") + look_data_dir);
7932 ps52plib =
new s52plib(plib_data);
7934 if (ps52plib->m_bOK) g_csv_locn = look_data_dir;
7937 if (ps52plib->m_bOK) {
7938 wxLogMessage(_T(
"Using s57data in ") + g_csv_locn);
7940 new s57RegistrarMgr(g_csv_locn, g_Platform->GetLogFilePtr());
7945 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
7947 OBJLElement *pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
7948 if (!strncmp(pOLE->OBJLName,
"DEPARE", 6)) pOLE->nViz = 1;
7949 if (!strncmp(pOLE->OBJLName,
"LNDARE", 6)) pOLE->nViz = 1;
7950 if (!strncmp(pOLE->OBJLName,
"COALNE", 6)) pOLE->nViz = 1;
7953 pConfig->LoadS57Config();
7954 ps52plib->SetPLIBColorScheme(global_color_scheme, ChartCtxFactory());
7957 ps52plib->SetDisplayWidth(g_monitor_info[g_current_monitor].width);
7958 ps52plib->SetPPMM(g_BasePlatform->GetDisplayDPmm());
7960 ps52plib->SetDIPFactor(dip_factor);
7961 ps52plib->SetContentScaleFactor(OCPN_GetDisplayContentScaleFactor());
7965 ps52plib->SetScaleFactorExp(
7966 g_Platform->GetChartScaleFactorExp(g_ChartScaleFactor));
7967 ps52plib->SetScaleFactorZoomMod(g_chart_zoom_modifier_vector);
7972 extern bool g_b_EnableVBO;
7973 extern GLenum g_texture_rectangle_format;
7978 wxString renderer = wxString(GL_Caps->Renderer.c_str());
7979 ps52plib->SetGLRendererString(renderer);
7982 ps52plib->SetGLOptions(
7983 glChartCanvas::s_b_useStencil, glChartCanvas::s_b_useStencilAP,
7984 glChartCanvas::s_b_useScissorTest, glChartCanvas::s_b_useFBO,
7985 g_b_EnableVBO, g_texture_rectangle_format, 1, 1);
7991 _T(
" S52PLIB Initialization failed, disabling Vector charts."));
8000 : wxThread(wxTHREAD_JOINABLE) {
8001 m_filename = filename;
8012 newChart->SetNativeScale(m_scale);
8013 newChart->SetFullExtent(m_ext);
8015 newChart->FindOrCreateSenc(m_filename);
8020 wxString m_filename;
8026static double chart_dist(
int index) {
8032 if (cte.GetBBox().Contains(gLat, gLon))
8037 clon = (cte.GetLonMax() + cte.GetLonMin()) / 2;
8038 d = DistGreatCircle(cte.GetLatMax(), clon, gLat, gLon);
8039 t = DistGreatCircle(cte.GetLatMin(), clon, gLat, gLon);
8042 clat = (cte.GetLatMax() + cte.GetLatMin()) / 2;
8043 t = DistGreatCircle(clat, cte.GetLonMin(), gLat, gLon);
8045 t = DistGreatCircle(clat, cte.GetLonMax(), gLat, gLon);
8051WX_DEFINE_SORTED_ARRAY_INT(
int, MySortedArrayInt);
8052static int CompareInts(
int n1,
int n2) {
8053 double d1 = chart_dist(n1);
8054 double d2 = chart_dist(n2);
8055 return (
int)(d1 - d2);
8060 wxString chart_path;
8065WX_DEFINE_OBJARRAY(ArrayOfCompressTargets);
8067#include <wx/arrimpl.cpp>
8070void ParseAllENC(wxWindow *parent) {
8071 MySortedArrayInt idx_sorted_by_distance(CompareInts);
8079 for (
int i = 0; i < ChartData->GetChartTableEntries(); i++) {
8082 if (CHART_TYPE_S57 != cte.GetChartType())
continue;
8084 idx_sorted_by_distance.Add(i);
8088 if (count == 0)
return;
8090 wxLogMessage(wxString::Format(_T(
"ParseAllENC() count = %d"), count));
8096 ArrayOfCompressTargets ct_array;
8097 for (
unsigned int j = 0; j < idx_sorted_by_distance.GetCount(); j++) {
8098 int i = idx_sorted_by_distance[j];
8101 double distance = chart_dist(i);
8103 wxString filename(cte.GetpFullPath(), wxConvUTF8);
8106 pct->distance = distance;
8107 pct->chart_path = filename;
8109 ct_array.push_back(pct);
8112 int thread_count = 0;
8115 extern int g_nCPUCount;
8116 if (g_nCPUCount > 0)
8117 thread_count = g_nCPUCount;
8119 thread_count = wxThread::GetCPUCount();
8121 if (thread_count < 1) {
8130 for(
int t = 0; t < thread_count; t++)
8134 wxGenericProgressDialog *prog =
nullptr;
8135 wxSize csz = GetOCPNCanvasWindow()->GetClientSize();
8138 long style = wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
8139 wxPD_REMAINING_TIME | wxPD_CAN_SKIP;
8141 prog =
new wxGenericProgressDialog();
8143 prog->SetFont(*qFont);
8145 prog->Create(_(
"OpenCPN ENC Prepare"),
8146 _T(
"Longgggggggggggggggggggggggggggg"), count + 1, parent,
8156 prog->ShowWindowModal();
8165 for (
unsigned int j = 0; j < ct_array.size(); j++) {
8166 wxString filename = ct_array[j].chart_path;
8167 double distance = ct_array[j].distance;
8168 int index = ChartData->FinddbIndex(filename);
8169 if (index < 0)
continue;
8172 ext.NLAT = cte.GetLatMax();
8173 ext.SLAT = cte.GetLatMin();
8174 ext.WLON = cte.GetLonMin();
8175 ext.ELON = cte.GetLonMax();
8177 int scale = cte.GetScale();
8180 msg.Printf(_(
"Distance from Ownship: %4.0f NMi"), distance);
8183 if (wxThread::IsMain()) {
8185 wxSize sz = prog->GetSize();
8187 msg += _T(
" Chart:");
8190 prog->Update(count, msg, &skip);
8202 newChart->SetNativeScale(
scale);
8203 newChart->SetFullExtent(ext);
8204 newChart->DisableBackgroundSENC();
8206 newChart->FindOrCreateSenc(filename,
8210 if (wxThread::IsMain()) {
8211 msg.Printf(_(
"ENC Completed."));
8213 prog->Update(count, msg, &skip);
8223 for (
int t = 0;; t = (t + 1) % thread_count) {
8230 if (!workers[t]->IsAlive()) {
8243#if defined(__WXMSW__) || defined(__WXOSX__)
8250 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.
Implements the AboutFrame class with additional functionality.
Represents an active track that is currently being recorded.
Handles the AIS information GUI and sound alerts.
A modal message dialog with a cancel and confirmation button.
void AddHtmlContent(const std::stringstream &html)
Display HTML content.
void SetInitialSize()
Initialize by display geometry.
int ShowModal() override
Show dialog and return response.
Dialog for managing CM93 chart offsets.
Base class for all chart types.
double m_cursor_lat
The latitude at the mouse cursor position in degrees.
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 at the mouse cursor position in degrees.
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.
Primary navigation console display for route and vessel tracking.
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.
bool Active() const
Return true if log is visible i.
void Add(const wxString &s)
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.
Adds a std::shared<void> element to wxCommandEvent.
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.
EventVar on_routes_update
Notified when list of routes is updated (no data in event)
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.
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.
Represents the About dialog for OpenCPN.
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.
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.
wxWindow * GetTopWindow()
Return the top level window a k a gFrame.
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.
Tools to send data to plugins.
Represents an entry in the chart table, containing information about a single chart.
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.