42#include "ocpn_frame.h"
79#include <wx/stdpaths.h>
80#include <wx/tokenzr.h>
83#include "ocpn_frame.h"
85#include "OCPN_AUIManager.h"
88#include "glChartCanvas.h"
89#include "plugin_loader.h"
91#include "comm_drv_factory.h"
94#include "AboutFrameImpl.h"
96#include "color_handler.h"
97#include "config_vars.h"
98#include "ais_decoder.h"
100#include "AISTargetAlertDialog.h"
101#include "ais_target_data.h"
102#include "AISTargetListDialog.h"
103#include "ais_decoder.h"
104#include "TrackPropDlg.h"
107#include "routemanagerdialog.h"
108#include "pluginmanager.h"
109#include "OCPNPlatform.h"
110#include "AISTargetQueryDialog.h"
111#include "ais_info_gui.h"
112#include "CanvasConfig.h"
120#include "ConfigMgr.h"
127#include "GoToPositionDialog.h"
129#include "iENCToolbar.h"
134#include "multiplexer.h"
135#include "nav_object_database.h"
137#include "navutil_base.h"
138#include "NMEALogWindow.h"
142#include "OCPNPlatform.h"
143#include "OCPN_Sound.h"
148#include "pluginmanager.h"
151#include "routemanagerdialog.h"
153#include "route_point_gui.h"
155#include "RoutePropDlgImpl.h"
159#include "S57QueryDialog.h"
165#include "SystemCmdSound.h"
169#include "routeman_gui.h"
171#include "TrackPropDlg.h"
173#include "waypointman_gui.h"
176#include "N2KParser.h"
178#include "comm_drv_registry.h"
179#include "comm_n0183_output.h"
180#include "comm_navmsg_bus.h"
208#ifdef __OCPN__ANDROID__
209#include "androidUTIL.h"
216static void UpdatePositionCalculatedSogCog();
221WX_DEFINE_ARRAY_PTR(
ChartCanvas *, arrayofCanvasPtr);
229extern arrayofCanvasPtr g_canvasArray;
244extern about *g_pAboutDlgLegacy;
247extern double vLat, vLon;
248extern double initial_scale_ppm, initial_rotation;
249extern wxString g_locale;
250extern ColorScheme global_color_scheme;
254#if wxUSE_XLOCALE || !wxCHECK_VERSION(3, 0, 0)
255extern wxLocale *plocale_def_lang;
262extern s52plib *ps52plib;
266extern bool g_bTrackActive;
268extern bool g_bmasterToolbarFull;
269extern bool g_bInlandEcdis;
270extern int g_nAutoHideToolbar;
271extern bool g_bAutoHideToolbar;
272extern bool g_bshowToolbar;
273extern int g_maintoolbar_x;
274extern int g_maintoolbar_y;
275extern wxString g_toolbarConfig;
276extern wxString g_toolbarConfigSecondary;
277extern float g_toolbar_scalefactor;
278extern float g_compass_scalefactor;
279extern bool g_bShowMenuBar;
280extern bool g_bShowCompassWin;
282extern bool g_benable_rotate;
283extern int g_GUIScaleFactor;
284extern int g_ChartScaleFactor;
285extern float g_ChartScaleFactorExp;
286extern int g_last_ChartScaleFactor;
287extern int g_ShipScaleFactor;
288extern float g_ShipScaleFactorExp;
289extern int g_ENCSoundingScaleFactor;
290extern int g_ENCTextScaleFactor;
292extern bool g_bShowTide;
293extern bool g_bShowCurrent;
294extern bool g_bUIexpert;
296extern RouteList *pRouteList;
297extern wxString g_default_wp_icon;
298extern wxArrayString TideCurrentDataSet;
299extern wxString g_TCData_Dir;
301extern bool g_bShowTrue;
302extern bool g_bShowMag;
303extern char nmea_tick_chars[];
306extern double AnchorPointMinDist;
307extern bool AnchorAlertOn1, AnchorAlertOn2;
308extern wxString g_AW1GUID;
309extern wxString g_AW2GUID;
310extern bool g_bCruising;
311extern double g_COGAvg;
312extern int g_COGAvgSec;
314extern std::vector<Track *> g_TrackList;
315extern double gQueryVar;
316extern wxPrintData *g_printData;
317extern wxPageSetupData *g_pageSetupData;
318extern int g_ChartUpdatePeriod;
319extern int g_SkewCompUpdatePeriod;
320extern double g_VPRotate;
321extern bool g_bCourseUp;
322extern bool g_bLookAhead;
323extern bool g_bskew_comp;
324extern bool g_bopengl;
325extern int g_unit_test_1;
326extern int g_unit_test_2;
327extern bool g_bPauseTest;
328extern wxRect g_blink_rect;
330extern bool g_bPlayShipsBells;
331extern wxDateTime g_loglast_time;
332extern int g_nAWDefault;
334extern bool g_bDeferredStartTrack;
335extern bool bDBUpdateInProgress;
339extern bool g_boptionsactive;
340extern bool g_bDeferredInitDone;
341extern int options_lastPage;
342extern int options_subpage;
343extern bool b_reloadForPlugins;
345extern wxVector<wxString> g_params;
346extern bool g_bNeedDBUpdate;
347extern bool g_bFullscreen;
348extern wxString gWorldMapLocation, gDefaultWorldMapLocation;
349extern ChartGroupArray *g_pGroupArray;
350extern bool g_bEnableZoomToCursor;
351extern double g_display_size_mm;
352extern double g_config_display_size_mm;
353extern int g_nTrackPrecision;
354extern wxString ChartListFileName;
355extern bool g_bFullscreenToolbar;
356extern arrayofCanvasPtr g_canvasArray;
357extern arrayofCanvasConfigPtr g_canvasConfigArray;
358extern wxString g_lastAppliedTemplateGUID;
359extern wxPoint options_lastWindowPos;
360extern wxSize options_lastWindowSize;
361extern unsigned int g_canvasConfig;
362extern bool g_bFullScreenQuilt;
363extern bool g_bQuiltEnable;
364extern wxString *pInit_Chart_Dir;
365extern bool g_bAIS_CPA_Alert;
366extern bool g_bAIS_CPA_Alert_Audio;
367extern bool g_bAISShowTracks;
368extern bool g_bAllowShowScaled;
369extern bool g_bHideMoored;
370extern bool g_bShowScaled;
371extern bool g_bShowAIS;
372extern bool g_bShowOutlines;
373extern bool g_bTempShowMenuBar;
374extern bool g_bShowStatusBar;
375extern int g_track_rotate_time;
376extern int g_track_rotate_time_type;
377extern bool g_bTrackCarryOver;
378extern bool g_bTrackDaily;
379extern bool g_FlushNavobjChanges;
380extern int g_FlushNavobjChangesTimeout;
381extern bool g_bShowChartBar;
382extern double g_plus_minus_zoom_factor;
383extern int g_nframewin_x;
384extern int g_nframewin_y;
385extern int g_nframewin_posx;
386extern int g_nframewin_posy;
387extern bool g_bframemax;
388extern LayerList *pLayerList;
389extern bool g_bAutoAnchorMark;
390extern wxDateTime g_start_time;
391extern bool g_bcompression_wait;
392extern bool g_bquiting;
393extern wxString g_AisTargetList_perspective;
394extern bool b_inCloseWindow;
395extern bool b_inCompressAllCharts;
396extern long g_maintoolbar_orient;
397extern int g_ais_query_dialog_x, g_ais_query_dialog_y;
398extern wxAuiDefaultDockArt *g_pauidockart;
399extern int g_click_stop;
400extern wxString g_CmdSoundString;
401extern std::vector<OcpnSound *> bells_sound;
402extern char bells_sound_file_name[2][12];
403extern int g_sticky_chart;
404extern int g_sticky_projection;
405extern bool g_bdisable_opengl;
406extern int Usercolortable_index;
407extern wxArrayPtrVoid *UserColorTableArray;
408extern wxArrayPtrVoid *UserColourHashTableArray;
409extern wxColorHashMap *pcurrent_user_color_hash;
412extern bool g_bfilter_cogsog;
413extern int g_COGFilterSec;
414extern int g_SOGFilterSec;
415extern bool g_own_ship_sog_cog_calc;
416extern int g_own_ship_sog_cog_calc_damp_sec;
417extern wxDateTime last_own_ship_sog_cog_calc_ts;
418extern double last_own_ship_sog_cog_calc_lat, last_own_ship_sog_cog_calc_lon;
419extern bool g_bHasHwClock;
420extern bool s_bSetSystemTime;
421extern bool bGPSValid;
422extern bool bVelocityValid;
423extern int g_total_NMEAerror_messages;
424extern int gGPS_Watchdog;
425extern int gHDx_Watchdog;
426extern int gHDT_Watchdog;
427extern int gVAR_Watchdog;
428extern int gSAT_Watchdog;
431extern bool g_bCPAWarn;
433extern bool g_bUseGLL;
434extern int g_MemFootSec;
435extern int g_MemFootMB;
438extern int g_chart_zoom_modifier_vector;
444typedef DWORD(WINAPI *SetSysColors_t)(DWORD, DWORD *, DWORD *);
445typedef DWORD(WINAPI *GetSysColor_t)(DWORD);
447SetSysColors_t pSetSysColors;
448GetSysColor_t pGetSysColor;
450void SaveSystemColors(
void);
451void RestoreSystemColors(
void);
456DWORD color_3ddkshadow;
458DWORD color_activecaption;
459DWORD color_gradientactivecaption;
460DWORD color_captiontext;
461DWORD color_windowframe;
462DWORD color_inactiveborder;
470#define _CRTDBG_MAP_ALLOC
473#define DEBUG_NEW new (_NORMAL_BLOCK, __FILE__, __LINE__)
478static const long long lNaN = 0xfff8000000000000;
479#define NAN (*(double *)&lNaN)
483void appendOSDirSlash(wxString *pString);
485void InitializeUserColors(
void);
486void DeInitializeUserColors(
void);
487void SetSystemColors(ColorScheme cs);
489static bool LoadAllPlugIns(
bool load_enabled) {
490 g_Platform->ShowBusySpinner();
491 bool b = PluginLoader::getInstance()->LoadAllPlugIns(load_enabled);
492 g_Platform->HideBusySpinner();
500#if defined(__WXGTK__) || defined(__WXQT__)
501#include "bitmaps/opencpn.xpm"
516int g_iENCToolbarPosX;
517int g_iENCToolbarPosY;
519void BuildiENCToolbar(
bool bnew) {
520 if (g_bInlandEcdis) {
523 wxPoint locn = g_iENCToolbar->GetPosition();
524 wxPoint tbp_incanvas = gFrame->GetPrimaryCanvas()->ScreenToClient(locn);
526 g_iENCToolbarPosY = tbp_incanvas.y;
527 g_iENCToolbarPosX = tbp_incanvas.x;
529 delete g_iENCToolbar;
534 if (!g_iENCToolbar) {
535 wxPoint posn(g_iENCToolbarPosX, g_iENCToolbarPosY);
539 if ((g_iENCToolbarPosY > g_maintoolbar_y) &&
540 (g_iENCToolbarPosY < g_maintoolbar_y + g_MainToolbar->GetSize().y))
541 g_iENCToolbarPosY = -1;
544 if ((g_iENCToolbarPosX < 0) || (g_iENCToolbarPosY < 0)) {
549 posn = wxPoint(g_maintoolbar_x + g_MainToolbar->GetSize().x + 4,
553 double tool_scale_factor =
554 g_Platform->GetToolbarScaleFactor(g_GUIScaleFactor);
557 new iENCToolbar(gFrame, posn, wxTB_HORIZONTAL, tool_scale_factor);
558 g_iENCToolbar->SetColorScheme(global_color_scheme);
559 g_iENCToolbar->EnableSubmerge(
false);
562 delete g_iENCToolbar;
563 g_iENCToolbar = NULL;
567int ShowNavWarning() {
570OpenCPN is distributed in the hope that it will be useful, \
571but WITHOUT ANY WARRANTY; without even the implied \
572warranty of MERCHANTABILITY or FITNESS FOR A \
573PARTICULAR PURPOSE.\n\n\
574See the GNU General Public License for more details.\n\n\
575OpenCPN must only be used in conjunction with approved \
576paper charts and traditional methods of navigation.\n\n\
577DO NOT rely upon OpenCPN for safety of life or property.\n\n\
578Please click \"OK\" to agree and proceed, \"Cancel\" to quit.\n"));
580 wxString vs = wxString::Format(wxT(
" .. Version %s"), VERSION_FULL);
582#ifdef __OCPN__ANDROID__
583 androidShowDisclaimer(_(
"OpenCPN for Android") + vs, msg0);
586 wxColor fg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
588 msg1.Printf(_T(
"<html><body><font color=#%02x%02x%02x><hr />"), fg.Red(),
589 fg.Green(), fg.Blue());
591 for (
unsigned int i = 0; i < msg0.Length(); i++) {
598 msg1 << _T(
"<hr /></font></body></html>");
601 gFrame, msg1, _(
"Welcome to OpenCPN") + vs, -1, wxCANCEL | wxOK);
605 return (infoDlg.GetReturnCode());
610 if (chart ==
nullptr)
return false;
613 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
615 if (cc && cc->m_singleChart == chart) {
622#if defined(__WXGTK__) && defined(OCPN_HAVE_X11)
625static char *get_X11_property(Display *disp, Window win, Atom xa_prop_type,
626 const char *prop_name) {
630 unsigned long ret_nitems;
631 unsigned long ret_bytes_after;
632 unsigned char *ret_prop;
634 xa_prop_name = XInternAtom(disp, prop_name, False);
642 if (XGetWindowProperty(disp, win, xa_prop_name, 0, 1024, False, xa_prop_type,
643 &xa_ret_type, &ret_format, &ret_nitems,
644 &ret_bytes_after, &ret_prop) != Success)
647 if (xa_ret_type != xa_prop_type) {
651 return (
char *)ret_prop;
656static bool isTransparentToolbarInOpenGLOK(
void) {
663 if (!g_bdisable_opengl) {
664 Display *disp = XOpenDisplay(NULL);
666 if ((sup_window = (Window *)get_X11_property(disp, DefaultRootWindow(disp),
668 "_NET_SUPPORTING_WM_CHECK")) ||
669 (sup_window = (Window *)get_X11_property(disp, DefaultRootWindow(disp),
671 "_WIN_SUPPORTING_WM_CHECK"))) {
674 if ((wm_name = get_X11_property(disp, *sup_window,
675 XInternAtom(disp,
"UTF8_STRING", False),
677 (wm_name = get_X11_property(disp, *sup_window, XA_STRING,
680 if (strstr(wm_name,
"Xfwm4") || strstr(wm_name,
"Compiz"))
700wxDEFINE_EVENT(BELLS_PLAYED_EVTYPE, wxCommandEvent);
702BEGIN_EVENT_TABLE(
MyFrame, wxFrame)
703EVT_CLOSE(MyFrame::OnCloseWindow)
704EVT_MENU(wxID_EXIT, MyFrame::OnExit)
705EVT_SIZE(MyFrame::OnSize)
706EVT_MOVE(MyFrame::OnMove)
707EVT_ICONIZE(MyFrame::OnIconize)
708EVT_MENU(-1, MyFrame::OnToolLeftClick)
709EVT_TIMER(INIT_TIMER, MyFrame::OnInitTimer)
711EVT_TIMER(FRAME_TC_TIMER, MyFrame::OnFrameTCTimer)
712EVT_TIMER(FRAME_COG_TIMER, MyFrame::OnFrameCOGTimer)
713EVT_TIMER(MEMORY_FOOTPRINT_TIMER, MyFrame::OnMemFootTimer)
714EVT_MAXIMIZE(MyFrame::OnMaximize)
715EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_TOOL_RCLICKED,
716 MyFrame::RequestNewToolbarArgEvent)
717EVT_ERASE_BACKGROUND(MyFrame::OnEraseBackground)
719EVT_TIMER(RECAPTURE_TIMER, MyFrame::OnRecaptureTimer)
720EVT_TIMER(TOOLBAR_ANIMATE_TIMER, MyFrame::OnToolbarAnimateTimer)
721EVT_COMMAND(wxID_ANY, BELLS_PLAYED_EVTYPE, MyFrame::OnBellsFinished)
723#ifdef wxHAS_POWER_EVENTS
724EVT_POWER_SUSPENDING(MyFrame::OnSuspending)
725EVT_POWER_SUSPENDED(MyFrame::OnSuspended)
726EVT_POWER_SUSPEND_CANCEL(MyFrame::OnSuspendCancel)
727EVT_POWER_RESUME(MyFrame::OnResume)
736static
void onBellsFinishedCB(
void *ptr) {
737 auto framePtr =
static_cast<MyFrame *
>(ptr);
739 wxCommandEvent ev(BELLS_PLAYED_EVTYPE);
740 wxPostEvent(framePtr, ev);
745MyFrame::MyFrame(wxFrame *frame,
const wxString &title,
const wxPoint &pos,
746 const wxSize &size,
long style)
747 : wxFrame(frame, -1, title, pos, size,
751 m_last_track_rotation_ts = 0;
752 m_ulLastNMEATicktime = 0;
755 m_StatusBarFieldCount = g_Platform->GetStatusBarFieldCount();
759 piano_ctx_menu = NULL;
762 InitTimer.SetOwner(
this, INIT_TIMER);
764 m_initializing =
false;
767 FrameTimer1.SetOwner(
this, FRAME_TIMER_1);
770 FrameTCTimer.SetOwner(
this, FRAME_TC_TIMER);
773 FrameCOGTimer.SetOwner(
this, FRAME_COG_TIMER);
776 MemFootTimer.SetOwner(
this, MEMORY_FOOTPRINT_TIMER);
779 ToolbarAnimateTimer.SetOwner(
this, TOOLBAR_ANIMATE_TIMER);
781#ifdef __OCPN__ANDROID__
788 m_bTimeIsSet =
false;
789 m_bDateIsSet =
false;
792 m_bdefer_resize =
false;
795 for (
int i = 0; i < MAX_COGSOG_FILTER_SECONDS; i++) {
796 COGFilterTable[i] = NAN;
797 SOGFilterTable[i] = NAN;
799 m_last_bGPSValid =
false;
800 m_last_bVelocityValid =
false;
808 for (
int i = 0; i < MAX_COG_AVERAGE_SECONDS; i++) COGTable[i] = NAN;
812 m_bpersistent_quilt =
false;
814 m_ChartUpdatePeriod = 1;
818 log_callbacks.log_is_active = []() {
return NMEALogWindow::Get().Active(); };
819 log_callbacks.log_message = [](
const std::string& s) { NMEALogWindow::Get().Add(s); };
823 ais_callbacks.confirm_stop_track = []() {
824 int r = OCPNMessageBox(NULL,
825 _(
"This AIS target has Persistent tracking selected by MMSI properties\n"
826 "A Persistent track recording will therefore be restarted for this target.\n\n"
827 "Do you instead want to stop Persistent tracking for this target?"),
828 _(
"OpenCPN Info"), wxYES_NO | wxCENTER, 60);
829 return r == wxID_YES;
836 wxLogMessage(
" **** Connect stuff");
842 Connect(wxEVT_OCPN_MSG,
843 (wxObjectEventFunction)(wxEventFunction)&MyFrame::OnEvtPlugInMessage);
850 Connect(wxEVT_OCPN_BUILDSENCTHREAD,
851 (wxObjectEventFunction)(wxEventFunction)&MyFrame::OnSENCEvtThread);
859#if defined(__WXGTK__) || defined(__WXQT__)
860 wxIcon app_icon(opencpn);
868 wxDynamicLibrary dllUser32(_T(
"user32.dll"));
870 pSetSysColors = (SetSysColors_t)dllUser32.GetSymbol(wxT(
"SetSysColors"));
871 pGetSysColor = (GetSysColor_t)dllUser32.GetSymbol(wxT(
"GetSysColor"));
876 m_next_available_plugin_tool_id = ID_PLUGIN_BASE;
879 g_sticky_projection = -1;
882 m_resizeTimer.SetOwner(
this, RESIZE_TIMER);
883 m_recaptureTimer.SetOwner(
this, RECAPTURE_TIMER);
889 EnableFullScreenView();
899 wxRouteListNode *node = pRouteList->GetFirst();
902 Route *pRouteDelete = node->GetData();
905 node = node->GetNext();
912 (wxObjectEventFunction)(wxEventFunction)&MyFrame::OnEvtPlugInMessage);
920 switch (event.type) {
921 case SENC_BUILD_STARTED:
924 case SENC_BUILD_DONE_NOERROR:
926 chart =
event.m_ticket->m_chart;
928 chart->PostInit(FULL_INIT, global_color_scheme);
930 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
932 if (cc) cc->ClearS52PLIBStateHash();
938 case SENC_BUILD_DONE_ERROR:
946void MyFrame::RebuildChartDatabase() {
947 bool b_SetInitialPoint =
false;
950 ArrayOfCDI ChartDirArray;
951 pConfig->LoadChartDirArray(ChartDirArray);
953 if (ChartDirArray.GetCount()) {
958 _(
"OpenCPN needs to update the chart database from config file "
962 wxICON_INFORMATION | wxOK);
964 dlg_ret = mdlg.ShowModal();
970 _(
"Rebuilding chart database from configuration file entries..."));
974 wxString dummy1 = _(
"Elapsed time : ");
975 wxString dummy2 = _(
"Estimated time : ");
976 wxString dummy3 = _(
"Remaining time : ");
977 wxGenericProgressDialog *pprog =
new wxGenericProgressDialog(
978 _(
"OpenCPN Chart Update"), line, 100, NULL,
979 wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
980 wxPD_REMAINING_TIME);
982 ChartData->Create(ChartDirArray, pprog);
983 ChartData->SaveBinary(ChartListFileName);
988 ChartData->ApplyGroupArray(g_pGroupArray);
993void MyFrame::OnBellsFinished(wxCommandEvent &event) {
994 int bells = wxMin(m_BellsToPlay, 2);
995 if (bells <= 0)
return;
997 wxString soundfile = _T(
"sounds");
998 appendOSDirSlash(&soundfile);
999 soundfile += wxString(bells_sound_file_name[bells - 1], wxConvUTF8);
1000 soundfile.Prepend(g_Platform->GetSharedDataDir());
1001 wxLogMessage(_T(
"Using bells sound file: ") + soundfile);
1003 OcpnSound *sound = bells_sound[bells - 1];
1004 sound->SetFinishedCallback(onBellsFinishedCB,
this);
1005 auto cmd_sound =
dynamic_cast<SystemCmdSound *
>(sound);
1006 if (cmd_sound) cmd_sound->SetCmd(g_CmdSoundString.mb_str(wxConvUTF8));
1007 sound->Load(soundfile);
1008 if (!sound->IsOk()) {
1009 wxLogMessage(_T(
"Failed to load bells sound file: ") + soundfile);
1013 m_BellsToPlay -= bells;
1016void MyFrame::OnEraseBackground(wxEraseEvent &event) {}
1018void MyFrame::OnMaximize(wxMaximizeEvent &event) {
1025ColorScheme GetColorScheme() {
return global_color_scheme; }
1027ColorScheme MyFrame::GetColorScheme() {
return global_color_scheme; }
1029void MyFrame::ReloadAllVP() {
1030 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1032 if (cc) cc->ReloadVP();
1036void MyFrame::SetAndApplyColorScheme(ColorScheme cs) {
1037 global_color_scheme = cs;
1039 wxString SchemeName;
1041 case GLOBAL_COLOR_SCHEME_DAY:
1042 SchemeName = _T(
"DAY");
1044 case GLOBAL_COLOR_SCHEME_DUSK:
1045 SchemeName = _T(
"DUSK");
1047 case GLOBAL_COLOR_SCHEME_NIGHT:
1048 SchemeName = _T(
"NIGHT");
1051 SchemeName = _T(
"DAY");
1055 g_pauidockart->SetMetric(wxAUI_DOCKART_GRADIENT_TYPE, wxAUI_GRADIENT_NONE);
1057 g_pauidockart->SetColour(wxAUI_DOCKART_BORDER_COLOUR, wxColour(0, 0, 0));
1058 g_pauidockart->SetMetric(wxAUI_DOCKART_PANE_BORDER_SIZE, 1);
1059 g_pauidockart->SetColour(wxAUI_DOCKART_SASH_COLOUR, wxColour(0, 0, 0));
1060 g_pauidockart->SetMetric(wxAUI_DOCKART_SASH_SIZE, 0);
1061 g_pauidockart->SetColour(wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR,
1063 g_pauidockart->SetColour(wxAUI_DOCKART_BACKGROUND_COLOUR, wxColour(0, 0, 0));
1092 g_pauidockart->SetColour(wxAUI_DOCKART_SASH_COLOUR, wxColour(0, 0, 0));
1093 g_pauidockart->SetMetric(wxAUI_DOCKART_SASH_SIZE, 6);
1095 g_pauimgr->Update();
1097 g_StyleManager->GetCurrentStyle()->SetColorScheme(cs);
1100 Usercolortable_index = 0;
1101 for (
unsigned int i = 0; i < UserColorTableArray->GetCount(); i++) {
1103 if (SchemeName.IsSameAs(*ct->tableName)) {
1104 Usercolortable_index = i;
1109 if (ps52plib) ps52plib->SetPLIBColorScheme(SchemeName);
1112 pcurrent_user_color_hash =
1113 (wxColorHashMap *)UserColourHashTableArray->Item(Usercolortable_index);
1115 SetSystemColors(cs);
1118 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1121 cc->SetColorScheme(cs);
1122 cc->GetWorldBackgroundChart()->SetColorScheme(cs);
1123 cc->HideChartInfoWindow();
1124 cc->SetQuiltChartHiLiteIndex(-1);
1130 g_Platform->GetDisplayDPmm());
1131 if (ChartData) ChartData->ApplyColorSchemeToCachedCharts(cs);
1134 g_options->SetColorScheme(cs);
1138 console->SetColorScheme(cs);
1142 g_pRouteMan->SetColorScheme(cs, g_Platform->GetDisplayDPmm());
1145 if (g_pMarkInfoDialog) {
1146 g_pMarkInfoDialog->SetColorScheme(cs);
1149 if (pRoutePropDialog) {
1150 pRoutePropDialog->SetColorScheme(cs);
1155 if (g_pais_query_dialog_active) {
1156 bool b_isshown = g_pais_query_dialog_active->IsShown();
1157 int n_mmsi = g_pais_query_dialog_active->GetMMSI();
1158 if (b_isshown) g_pais_query_dialog_active->Show(
false);
1160 g_pais_query_dialog_active->Close();
1163 g_pais_query_dialog_active->
Create(
1164 this, -1, _(
"AIS Target Query"),
1165 wxPoint(g_ais_query_dialog_x, g_ais_query_dialog_y));
1166 g_pais_query_dialog_active->SetMMSI(n_mmsi);
1167 g_pais_query_dialog_active->UpdateText();
1168 if (b_isshown) g_pais_query_dialog_active->Show();
1171 if (pRouteManagerDialog) pRouteManagerDialog->SetColorScheme();
1173 if (g_pAISTargetList) g_pAISTargetList->SetColorScheme();
1175 if (g_pObjectQueryDialog) g_pObjectQueryDialog->SetColorScheme();
1177 ApplyGlobalColorSchemetoStatusBar();
1179 UpdateAllToolbars(cs);
1181 if (g_MainToolbar) {
1182 if (g_MainToolbar->GetColorScheme() != cs) {
1184 bool btoolbarFull = g_bmasterToolbarFull;
1186 g_MainToolbar->SetColorScheme(cs);
1190 if (!btoolbarFull) {
1191 g_MainToolbar->Hide();
1192 RequestNewMasterToolbar();
1193 g_MainToolbar->SetColorScheme(cs);
1194 CollapseGlobalToolbar();
1195 g_MainToolbar->Show();
1197 RequestNewMasterToolbar();
1198 g_MainToolbar->SetColorScheme(cs);
1203 if (g_pi_manager) g_pi_manager->SetColorSchemeForAllPlugIns(cs);
1206void MyFrame::ApplyGlobalColorSchemetoStatusBar(
void) {
1207 if (m_pStatusBar != NULL) {
1208 m_pStatusBar->SetBackgroundColour(GetGlobalColor(_T(
"UIBDR")));
1209 m_pStatusBar->ClearBackground();
1214 if (g_canvasArray.GetCount() > 0)
1215 return g_canvasArray.Item(0);
1219void MyFrame::CancelAllMouseRoute() {
1221 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1223 if (cc) cc->CancelMouseRoute();
1227void MyFrame::NotifyChildrenResize() {}
1229void MyFrame::CreateCanvasLayout(
bool b_useStoredSize) {
1231 if (ChartData) ChartData->PurgeCache();
1234 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1237 g_pauimgr->DetachPane(cc);
1242 for (
unsigned int i = 1; i < g_canvasArray.GetCount(); i++) {
1246 cc->DestroyToolbar();
1252 for (
unsigned int i = 1; i < g_canvasConfigArray.GetCount(); i++) {
1253 g_canvasConfigArray.Item(i)->canvas = NULL;
1259 for (
unsigned int i = 1; i < g_canvasArray.GetCount(); i++) {
1260 g_canvasArray.RemoveAt(i);
1264 switch (g_canvasConfig) {
1267 if (!g_canvasArray.GetCount() || !g_canvasConfigArray.Item(0)) {
1269 g_canvasArray.Add(cc);
1271 cc = g_canvasArray[0];
1276 if (!cc->GetglCanvas()) cc->SetupGlCanvas();
1277 cc->GetglCanvas()->Show();
1280 g_canvasConfigArray.Item(0)->canvas = cc;
1282 cc->SetDisplaySizeMM(g_display_size_mm);
1284 cc->ApplyCanvasConfig(g_canvasConfigArray.Item(0));
1288 cc->ConfigureChartBar();
1289 cc->SetColorScheme(global_color_scheme);
1290 cc->GetCompass()->SetScaleFactor(g_compass_scalefactor);
1291 cc->SetShowGPS(
true);
1293 g_pauimgr->AddPane(cc);
1294 g_pauimgr->GetPane(cc).Name(_T(
"ChartCanvas"));
1295 g_pauimgr->GetPane(cc).Fixed();
1296 g_pauimgr->GetPane(cc).CaptionVisible(
false);
1297 g_pauimgr->GetPane(cc).CenterPane();
1302 if (!g_canvasArray.GetCount() || !g_canvasArray[0]) {
1304 g_canvasArray.Add(cc);
1306 cc = g_canvasArray[0];
1311 if (!cc->GetglCanvas()) cc->SetupGlCanvas();
1314 g_canvasConfigArray.Item(0)->canvas = cc;
1316 cc->ApplyCanvasConfig(g_canvasConfigArray.Item(0));
1318 cc->SetDisplaySizeMM(g_display_size_mm);
1319 cc->ConfigureChartBar();
1320 cc->SetColorScheme(global_color_scheme);
1321 cc->GetCompass()->SetScaleFactor(g_compass_scalefactor);
1322 cc->SetShowGPS(
false);
1324 g_pauimgr->AddPane(cc);
1325 g_pauimgr->GetPane(cc).Name(_T(
"ChartCanvas"));
1326 g_pauimgr->GetPane(cc)
1327 .CaptionVisible(
false)
1329 .CloseButton(
false);
1331 g_pauimgr->GetPane(cc).CenterPane();
1334 g_canvasArray.Add(cc);
1338 if (g_canvasConfigArray.GetCount() < 2) {
1340 pcc->configIndex = 1;
1344 pcc->canvasSize = wxSize(GetClientSize().x / 2, GetClientSize().y);
1345 g_canvasConfigArray.Add(pcc);
1348 g_canvasConfigArray.Item(1)->canvas = cc;
1350 cc->ApplyCanvasConfig(g_canvasConfigArray.Item(1));
1352 cc->SetDisplaySizeMM(g_display_size_mm);
1353 cc->SetToolbarOrientation(g_maintoolbar_orient);
1354 cc->ConfigureChartBar();
1355 cc->SetColorScheme(global_color_scheme);
1356 cc->SetShowGPS(
true);
1358 g_pauimgr->AddPane(cc);
1359 g_pauimgr->GetPane(cc).Name(_T(
"ChartCanvas2"));
1360 g_pauimgr->GetPane(cc)
1361 .CaptionVisible(
false)
1363 .CloseButton(
false);
1364 g_pauimgr->GetPane(cc).RightDockable(
true);
1365 g_pauimgr->GetPane(cc).Right();
1367#ifdef __OCPN__ANDROID__
1368 g_canvasConfigArray.Item(1)->canvasSize =
1369 wxSize(GetClientSize().x / 2, GetClientSize().y);
1370 g_pauimgr->GetPane(cc).BestSize(GetClientSize().x / 2, GetClientSize().y);
1376 if (b_useStoredSize) {
1377 int ccw = g_canvasConfigArray.Item(1)->canvasSize.x;
1378 int cch = g_canvasConfigArray.Item(1)->canvasSize.y;
1381 if (ccw < GetClientSize().x / 10) {
1382 ccw = GetClientSize().x / 2;
1383 cch = GetClientSize().y;
1386 g_pauimgr->GetPane(cc).BestSize(ccw, cch);
1387 cc->SetSize(ccw, cch);
1398 g_focusCanvas = GetPrimaryCanvas();
1401void MyFrame::RequestNewToolbars(
bool bforcenew) {
1402 if (b_inCloseWindow) {
1406 BuildiENCToolbar(bforcenew);
1407 PositionIENCToolbar();
1409#ifdef __OCPN__ANDROID__
1416void MyFrame::UpdateAllToolbars(ColorScheme cs) {
1417 if (g_iENCToolbar) g_iENCToolbar->SetColorScheme(cs);
1422void MyFrame::SetAllToolbarScale() {
1423 double scale_factor = g_Platform->GetToolbarScaleFactor(g_GUIScaleFactor);
1424 g_toolbar_scalefactor = g_Platform->GetToolbarScaleFactor(g_GUIScaleFactor);
1427 scale_factor = wxRound(scale_factor * 4.0) / 4.0;
1430 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1432 if (cc) cc->SetToolbarScaleFactor(scale_factor);
1436void MyFrame::SetGPSCompassScale() {
1437 g_compass_scalefactor = g_Platform->GetCompassScaleFactor(g_GUIScaleFactor);
1441 wxPoint screenPoint = ::wxGetMousePosition();
1444 switch (g_canvasConfig) {
1446 cc = g_canvasConfigArray.Item(0);
1449 if (canvas->GetScreenRect().Contains(
1453 cc = g_canvasConfigArray.Item(1);
1456 if (canvas->GetScreenRect().Contains(
1463 cc = g_canvasConfigArray.Item(0);
1466 if (canvas->GetScreenRect().Contains(
1467 canvas->ScreenToClient(screenPoint)))
1475int MyFrame::GetCanvasIndexUnderMouse() {
1476 wxPoint screenPoint = ::wxGetMousePosition();
1479 switch (g_canvasConfig) {
1481 cc = g_canvasConfigArray.Item(0);
1484 if (canvas->GetScreenRect().Contains(
1488 cc = g_canvasConfigArray.Item(1);
1491 if (canvas->GetScreenRect().Contains(
1498 cc = g_canvasConfigArray.Item(0);
1501 if (canvas->GetScreenRect().Contains(
1502 canvas->ScreenToClient(screenPoint)))
1510bool MyFrame::DropMarker(
bool atOwnShip) {
1517 if (!canvas)
return false;
1519 lat = canvas->m_cursor_lat;
1520 lon = canvas->m_cursor_lon;
1524 new RoutePoint(lat, lon, g_default_wp_icon, wxEmptyString, wxEmptyString);
1525 pWP->m_bIsolatedMark =
true;
1526 pSelect->AddSelectableRoutePoint(lat, lon, pWP);
1527 pConfig->AddNewWayPoint(pWP, -1);
1528 if (!
RoutePointGui(*pWP).IsVisibleSelectable(GetCanvasUnderMouse()))
1529 RoutePointGui(*pWP).ShowScaleWarningMessage(GetCanvasUnderMouse());
1530 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
1531 pRouteManagerDialog->UpdateWptListCtrl();
1536 RefreshAllCanvas(
false);
1541void MyFrame::SwitchKBFocus(
ChartCanvas *pCanvas) {
1542 if (g_canvasConfig != 0) {
1545 int nTargetGTK = -1;
1547 wxWindow *source = FindFocus();
1553 switch (g_canvasConfig) {
1555 cc = g_canvasConfigArray.Item(0);
1558 if (canvas && (canvas == test)) {
1563 cc = g_canvasConfigArray.Item(1);
1566 if (canvas && (canvas == test)) {
1574 int nfinalTarget = nTarget;
1576 nfinalTarget = nTargetGTK;
1578 target = g_canvasConfigArray.Item(nfinalTarget)->canvas;
1580 wxWindow *win = wxDynamicCast(target, wxWindow);
1582 target->Refresh(
true);
1593void MyFrame::FastClose() {
1596 FrameTimer1.Start(1);
1600void MyFrame::OnExit(wxCommandEvent &event) {
1604void MyFrame::OnCloseWindow(wxCloseEvent &event) {
1607 if (b_inCloseWindow) {
1616#ifndef __OCPN__ANDROID__
1617 if (!g_bDeferredInitDone)
return;
1628 if (b_inCompressAllCharts) {
1632 if (bDBUpdateInProgress)
return;
1634 b_inCloseWindow =
true;
1636 ::wxSetCursor(wxCURSOR_WAIT);
1640 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1642 if (cc && cc->IsMeasureActive()) {
1643 cc->CancelMeasureRoute();
1649 if (g_pAISTargetList) {
1650 wxAuiPaneInfo &pane = g_pauimgr->GetPane(g_pAISTargetList);
1651 g_AisTargetList_perspective = g_pauimgr->SavePaneInfo(pane);
1652 g_pauimgr->DetachPane(g_pAISTargetList);
1663 pConfig->SetPath(_T (
"/AUI" ));
1664 pConfig->Write(_T (
"AUIPerspective" ), g_pauimgr->SavePerspective());
1671 if (g_glTextureManager) {
1672 g_glTextureManager->PurgeJobList();
1674 if (g_glTextureManager->GetRunningJobCount()) g_bcompression_wait =
true;
1679 SetCursor(wxCURSOR_WAIT);
1681 RefreshAllCanvas(
true);
1687 RestoreScreenBrightness();
1690 if (g_MainToolbar) {
1691 g_MainToolbar->GetFrameRelativePosition(&g_maintoolbar_x, &g_maintoolbar_y);
1694 if (g_iENCToolbar) {
1695 wxPoint locn = g_iENCToolbar->GetPosition();
1696 wxPoint tbp_incanvas = GetPrimaryCanvas()->ScreenToClient(locn);
1697 g_iENCToolbarPosY = tbp_incanvas.y;
1698 g_iENCToolbarPosX = tbp_incanvas.x;
1701 g_bframemax = IsMaximized();
1704 FrameCOGTimer.Stop();
1718 if (g_bAutoAnchorMark) {
1719 bool watching_anchor =
false;
1720 if (pAnchorWatchPoint1)
1721 watching_anchor = (pAnchorWatchPoint1->GetIconName().StartsWith(
1723 if (pAnchorWatchPoint2)
1724 watching_anchor |= (pAnchorWatchPoint2->GetIconName().StartsWith(
1727 wxDateTime now = wxDateTime::Now();
1728 wxTimeSpan uptime = now.Subtract(g_start_time);
1730 if (!watching_anchor && (g_bCruising) && (gSog < 0.5) &&
1731 (uptime.IsLongerThan(wxTimeSpan(0, 30, 0, 0))))
1736 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
1739 if (pr->GetName().StartsWith(_T(
"Anchorage"))) {
1740 double a = gLat - pr->m_lat;
1741 double b = gLon - pr->m_lon;
1742 double l = sqrt((a * a) + (b * b));
1745 if ((l * 60. * 1852.) < (.25 * 1852.)) {
1746 pConfig->DeleteWayPoint(pr);
1747 pSelect->DeleteSelectablePoint(pr, SELTYPE_ROUTEPOINT);
1753 node = node->GetNext();
1756 wxString name = now.Format();
1757 name.Prepend(_(
"Anchorage created "));
1759 new RoutePoint(gLat, gLon, _T(
"anchorage"), name, wxEmptyString);
1760 pWP->m_bShowName =
false;
1761 pWP->m_bIsolatedMark =
true;
1763 pConfig->AddNewWayPoint(pWP, -1);
1768 pConfig->UpdateSettings();
1771 auto plugin_loader = PluginLoader::getInstance();
1772 if (plugin_loader) {
1773 plugin_loader->DeactivateAllPlugIns();
1776 wxLogMessage(_T(
"opencpn::MyFrame exiting cleanly."));
1780 pConfig->UpdateNavObj();
1783 pConfig->m_pNavObjectChangesSet->reset();
1787 pConfig->DeleteGroup(_T (
"/Routes" ));
1788 pConfig->DeleteGroup(_T (
"/Marks" ));
1792 delete g_pageSetupData;
1794 if (g_pAboutDlg) g_pAboutDlg->Destroy();
1795 if (g_pAboutDlgLegacy) g_pAboutDlgLegacy->Destroy();
1800 if (g_pCM93OffsetDialog) {
1801 g_pCM93OffsetDialog->Destroy();
1802 g_pCM93OffsetDialog = NULL;
1805#ifndef __OCPN__ANDROID__
1808 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1810 if (cc) cc->DestroyToolbar();
1813 if (g_MainToolbar) g_MainToolbar->Destroy();
1814 g_MainToolbar = NULL;
1817 if (g_iENCToolbar) {
1818 wxPoint locn = g_iENCToolbar->GetPosition();
1819 g_iENCToolbarPosY = locn.y;
1820 g_iENCToolbarPosX = locn.x;
1821 g_iENCToolbar->Destroy();
1824 if (g_pAISTargetList) {
1825 g_pAISTargetList->Disconnect_decoder();
1826 g_pAISTargetList->Destroy();
1833 if (RouteManagerDialog::getInstanceFlag()) {
1834 if (pRouteManagerDialog) {
1835 pRouteManagerDialog->Destroy();
1836 pRouteManagerDialog = NULL;
1841 if (ChartData) ChartData->PurgeCache();
1847 g_focusCanvas = NULL;
1850 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1852 if (cc) cc->Destroy();
1855 g_canvasArray.Clear();
1857 g_pauimgr->UnInit();
1867 if (ChartData) ChartData->PurgeCachePlugins();
1869 if (PluginLoader::getInstance())
1870 PluginLoader::getInstance()->UnLoadAllPlugIns();
1873 delete g_pi_manager;
1874 g_pi_manager = NULL;
1877 MyApp& app = wxGetApp();
1878 app.m_comm_bridge.SaveConfig();
1894 auto& registry = CommDriverRegistry::GetInstance();
1895 registry.CloseAllDrivers();
1898 for (
size_t i = 0; i < TheConnectionParams()->Count(); i++) {
1902 delete TheConnectionParams();
1905 LayerList::iterator it;
1906 while (pLayerList->GetCount()) {
1907 Layer *lay = pLayerList->GetFirst()->GetData();
1912 NMEALogWindow::Shutdown();
1914 g_MainToolbar = NULL;
1915 g_bTempShowMenuBar =
false;
1917#define THREAD_WAIT_SECONDS 5
1923 if (g_bopengl && g_glTextureManager &&
1924 g_glTextureManager->GetRunningJobCount()) {
1925 g_glTextureManager->ClearAllRasterTextures();
1927 wxLogMessage(_T(
"Starting compressor pool drain"));
1928 wxDateTime now = wxDateTime::Now();
1929 time_t stall = now.GetTicks();
1930 time_t end = stall + THREAD_WAIT_SECONDS;
1933 while (stall < end) {
1934 wxDateTime later = wxDateTime::Now();
1935 stall = later.GetTicks();
1938 msg.Printf(_T(
"Time: %d Job Count: %d"), n_comploop,
1939 g_glTextureManager->GetRunningJobCount());
1941 if (!g_glTextureManager->GetRunningJobCount())
break;
1947 fmsg.Printf(_T(
"Finished compressor pool drain..Time: %d Job Count: %d"),
1948 n_comploop, g_glTextureManager->GetRunningJobCount());
1951 delete g_glTextureManager;
1957 wxLogMessage(_T(
"gFrame destroyed."));
1959#ifdef __OCPN__ANDROID__
1960#ifndef USE_ANDROID_GLES2
1961 qDebug() <<
"Calling OnExit()";
1967void MyFrame::OnMove(wxMoveEvent &event) {
1969 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
1971 if (cc) cc->SetMUIBarPosition();
1974 UpdateGPSCompassStatusBoxes();
1976 if (console && console->IsShown()) PositionConsole();
1979 if (g_MainToolbar) {
1980 g_MainToolbar->RestoreRelativePosition(g_maintoolbar_x, g_maintoolbar_y);
1981 g_MainToolbar->Realize();
1984 PositionIENCToolbar();
1990 g_nframewin_posx = GetPosition().x;
1991 g_nframewin_posy = GetPosition().y;
1994void MyFrame::ProcessCanvasResize(
void) {
1995 UpdateGPSCompassStatusBoxes(
true);
1997 if (console && console->IsShown()) PositionConsole();
1999 PositionIENCToolbar();
2001#ifndef __OCPN__ANDROID__
2002 TriggerRecaptureTimer();
2006void MyFrame::TriggerRecaptureTimer() {
2007 m_recaptureTimer.Start(
2008 1000, wxTIMER_ONE_SHOT);
2011void MyFrame::OnRecaptureTimer(wxTimerEvent &event) { Raise(); }
2013void MyFrame::SetCanvasSizes(wxSize frameSize) {
2014 if (!g_canvasArray.GetCount())
return;
2017 int cccw = frameSize.x;
2018 int ccch = frameSize.y;
2022 switch (g_canvasConfig) {
2026 cc = g_canvasArray.Item(0);
2028 cc->GetSize( &cur_width, &cur_height );
2029 if( ( cur_width != cccw ) || ( cur_height != ccch ) ) {
2030 if( g_pauimgr->GetPane( cc ).IsOk() )
2031 g_pauimgr->GetPane( cc ).BestSize( cccw, ccch );
2033 cc->SetSize( 0, 0, cccw, ccch );
2041 cc = g_canvasArray.Item(1);
2043 int ccw = g_canvasConfigArray.Item(1)->canvasSize.x;
2044 int cch = g_canvasConfigArray.Item(1)->canvasSize.y;
2046 ccw = wxMin(ccw, cccw * 8 / 10);
2047 ccw = wxMax(ccw, cccw * 2 / 10);
2051 g_canvasConfigArray.Item(1)->canvasSize = wxSize(ccw, cch);
2058 g_pauimgr->GetPane(cc).MinSize(ccw, cch);
2059 g_pauimgr->GetPane(cc).Fixed();
2060 g_pauimgr->Update();
2063 g_pauimgr->GetPane(cc).Resizable();
2075void MyFrame::OnIconize(wxIconizeEvent &event) {
2077 if (g_MainToolbar) {
2078 g_MainToolbar->Show(!event.IsIconized());
2080 if (g_iENCToolbar) {
2081 g_iENCToolbar->Show(!event.IsIconized());
2083 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2085 if (cc && cc->GetMUIBar()) {
2086 cc->GetMUIBar()->Show(!event.IsIconized());
2092void MyFrame::OnSize(wxSizeEvent &event) { ODoSetSize(); }
2094void MyFrame::ODoSetSize(
void) {
2096 GetClientSize(&x, &y);
2099 if (m_pStatusBar != NULL) {
2100 m_StatusBarFieldCount = g_Platform->GetStatusBarFieldCount();
2101 int currentCount = m_pStatusBar->GetFieldsCount();
2102 if (currentCount != m_StatusBarFieldCount) {
2103 if ((currentCount > 0) && (currentCount < 7)) {
2106 int widths[] = {2, 2, 2, 2, 2, 2};
2107 m_pStatusBar->SetStatusWidths(currentCount, widths);
2110 m_pStatusBar->SetFieldsCount(m_StatusBarFieldCount);
2113 if (m_StatusBarFieldCount) {
2118 if (m_StatusBarFieldCount > 2) {
2119 int widths[] = {-6, -5, -5, -6, -4};
2120 m_pStatusBar->SetStatusWidths(m_StatusBarFieldCount, widths);
2121 }
else if (m_StatusBarFieldCount == 2) {
2122 int cwidth = x * 90 / 100;
2123 int widths[] = {100, 100};
2124 widths[0] = cwidth * 6.4 / 10.0;
2125 widths[1] = cwidth * 3.6 / 10.0;
2126 m_pStatusBar->SetStatusWidths(m_StatusBarFieldCount, widths);
2128 int widths[] = {100, 100};
2129 widths[0] = x * 90 / 100;
2130 m_pStatusBar->SetStatusWidths(m_StatusBarFieldCount, widths);
2133 int styles[] = {wxSB_FLAT, wxSB_FLAT, wxSB_FLAT,
2134 wxSB_FLAT, wxSB_FLAT, wxSB_FLAT};
2135 m_pStatusBar->SetStatusStyles(m_StatusBarFieldCount, styles);
2137 wxString sogcog(_T(
"SOG --- ") + getUsrSpeedUnit() + +_T(
" ") +
2138 _T(
" COG ---\u00B0"));
2139 m_pStatusBar->SetStatusText(sogcog, STAT_FIELD_SOGCOG);
2147 m_pStatusBar->GetFieldRect(0, stat_box);
2150 int max_font_size = wxMin((stat_box.width / 28), (stat_box.height));
2152 wxFont sys_font = *wxNORMAL_FONT;
2153 int try_font_size = sys_font.GetPointSize();
2156 int min_font_size = 10;
2166 wxFont *statusBarFont =
2167 FontMgr::Get().GetFont(_(
"StatusBar"), try_font_size);
2168 int font_size = statusBarFont->GetPointSize();
2170 font_size = wxMin(font_size,
2173 wxMax(font_size, min_font_size);
2175#ifdef __OCPN__ANDROID__
2176 font_size = statusBarFont->GetPointSize();
2180 font_size /= OCPN_GetDisplayContentScaleFactor();
2182 wxFont *pstat_font = FontMgr::Get().FindOrCreateFont(
2183 font_size, statusBarFont->GetFamily(), statusBarFont->GetStyle(),
2184 statusBarFont->GetWeight(),
false, statusBarFont->GetFaceName());
2186 int min_height = stat_box.height;
2188 m_pStatusBar->SetFont(*pstat_font);
2189 m_pStatusBar->SetForegroundColour(
2190 FontMgr::Get().GetFontColor(_(
"StatusBar")));
2191#ifdef __OCPN__ANDROID__
2192 min_height = (pstat_font->GetPointSize() * getAndroidDisplayDensity()) + 10;
2194 (min_height >> 1) * 2;
2195 m_pStatusBar->SetMinHeight(min_height);
2204 SetCanvasSizes(GetClientSize());
2206 UpdateGPSCompassStatusBoxes(
true);
2208 if (console) PositionConsole();
2211 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2213 if (cc) cc->FormatPianoKeys();
2217 if (g_MainToolbar) {
2218 bool bShow = g_MainToolbar->IsShown();
2219 wxSize szBefore = g_MainToolbar->GetSize();
2224 double deltay = g_nframewin_y - GetSize().y;
2225 if ((fabs(deltay) > (g_Platform->getDisplaySize().y / 5)))
2226 g_MainToolbar->Hide();
2228 g_MainToolbar->RestoreRelativePosition(g_maintoolbar_x, g_maintoolbar_y);
2230 g_MainToolbar->SetGeometry(GetPrimaryCanvas()->GetCompass()->IsShown(),
2231 GetPrimaryCanvas()->GetCompass()->GetRect());
2233 g_MainToolbar->Realize();
2235 if (szBefore != g_MainToolbar->GetSize()) g_MainToolbar->Refresh(
true);
2236 g_MainToolbar->Show(bShow);
2245 if (g_pi_manager) g_pi_manager->SendResizeEventToAllPlugIns(x, y);
2258 options_lastWindowSize = wxSize(0, 0);
2259 options_lastWindowPos = wxPoint(0, 0);
2261#ifdef __OCPN__ANDROID__
2266 if (!b_inCloseWindow) {
2267 if (g_options) g_options->Raise();
2269 resizeAndroidPersistents();
2274 if (g_pauimgr) g_pauimgr->Update();
2277void MyFrame::PositionConsole(
void) {
2278 if (NULL == GetPrimaryCanvas())
return;
2280 int ccx, ccy, ccsx, ccsy, consx, consy;
2282 if (g_canvasConfig > 0) consoleHost = g_canvasArray[1];
2285 consoleHost->GetSize(&ccsx, &ccsy);
2286 consoleHost->GetPosition(&ccx, &ccy);
2288 GetPrimaryCanvas()->GetSize(&ccsx, &ccsy);
2289 GetPrimaryCanvas()->GetPosition(&ccx, &ccy);
2290 consoleHost = GetPrimaryCanvas();
2295 if(consoleHost->GetCompass()){
2296 wxRect compass_rect = consoleHost->GetCompass()->GetRect();
2298 if(compass_rect.y < 100)
2299 yOffset = compass_rect.y + compass_rect.height + 45;
2303 console->GetSize(&consx, &consy);
2305 wxPoint screen_pos =
2306 ClientToScreen(wxPoint(ccx + ccsx - consx - 2, ccy + yOffset));
2307 console->Move(screen_pos);
2310void MyFrame::UpdateAllFonts() {
2312 console->UpdateFonts();
2319 DestroyPersistentDialogs();
2321 if (pWayPointMan) pWayPointMan->ClearRoutePointFonts();
2326void MyFrame::DestroyPersistentDialogs() {
2327 if (g_pais_query_dialog_active) {
2328 g_pais_query_dialog_active->Hide();
2329 g_pais_query_dialog_active->Destroy();
2330 g_pais_query_dialog_active = NULL;
2333 if (RoutePropDlgImpl::getInstanceFlag() && pRoutePropDialog) {
2334 pRoutePropDialog->Hide();
2335 pRoutePropDialog->Destroy();
2336 pRoutePropDialog = NULL;
2339 if (TrackPropDlg::getInstanceFlag() && pTrackPropDialog) {
2340 pTrackPropDialog->Hide();
2341 pTrackPropDialog->Destroy();
2342 pTrackPropDialog = NULL;
2345 if (g_pMarkInfoDialog) {
2346 g_pMarkInfoDialog->Hide();
2347 g_pMarkInfoDialog->Destroy();
2348 g_pMarkInfoDialog = NULL;
2351 if (g_pObjectQueryDialog) {
2352 g_pObjectQueryDialog->Hide();
2353 g_pObjectQueryDialog->Destroy();
2354 g_pObjectQueryDialog = NULL;
2358void MyFrame::RefreshGroupIndices(
void) {
2360 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2362 if (cc) cc->canvasRefreshGroupIndex();
2366void MyFrame::OnToolLeftClick(wxCommandEvent &event) {
2367 if (g_MainToolbar) g_MainToolbar->HideTooltip();
2369 switch (event.GetId()) {
2370 case ID_MENU_SCALE_OUT:
2371 DoStackDelta(GetPrimaryCanvas(), 1);
2375 case ID_MENU_SCALE_IN:
2376 DoStackDelta(GetPrimaryCanvas(), -1);
2380 case ID_MENU_ZOOM_IN: {
2381 if (GetFocusCanvas()) {
2382 GetFocusCanvas()->ZoomCanvas(g_plus_minus_zoom_factor,
false);
2387 case ID_MENU_ZOOM_OUT: {
2388 if (GetFocusCanvas()) {
2389 GetFocusCanvas()->ZoomCanvas(1.0 / g_plus_minus_zoom_factor,
false);
2394 case ID_MENU_ROUTE_NEW: {
2395 if (GetFocusCanvas()) {
2396 if (0 == GetFocusCanvas()->m_routeState) {
2397 GetFocusCanvas()->StartRoute();
2399 GetFocusCanvas()->FinishRoute();
2405 case ID_MENU_TOOL_MEASURE: {
2406 GetPrimaryCanvas()->StartMeasureRoute();
2410 case ID_MENU_MARK_BOAT: {
2415 case ID_MENU_MARK_CURSOR: {
2420 case ID_MENU_NAV_FOLLOW: {
2421 if (gFrame->GetPrimaryCanvas())
2422 gFrame->GetPrimaryCanvas()->TogglebFollow();
2426 case ID_MENU_CHART_OUTLINES: {
2427 ToggleChartOutlines(GetFocusCanvas());
2431 case ID_MENU_CHART_QUILTING: {
2432 ToggleQuiltMode(GetFocusCanvas());
2436 case ID_MENU_UI_CHARTBAR: {
2437 ToggleChartBar(GetFocusCanvas());
2441 case ID_MENU_ENC_TEXT:
2443 ToggleENCText(GetFocusCanvas());
2446 case ID_MENU_ENC_LIGHTS: {
2447 ToggleLights(GetFocusCanvas());
2450 case ID_MENU_ENC_SOUNDINGS: {
2451 ToggleSoundings(GetFocusCanvas());
2454 case ID_MENU_ENC_ANCHOR: {
2455 ToggleAnchor(GetFocusCanvas());
2458 case ID_MENU_ENC_DATA_QUALITY: {
2459 ToggleDataQuality(GetFocusCanvas());
2462 case ID_MENU_SHOW_NAVOBJECTS: {
2463 ToggleNavobjects(GetFocusCanvas());
2467 case ID_MENU_AIS_TARGETS: {
2468 ToggleAISDisplay(GetFocusCanvas());
2471 case ID_MENU_AIS_MOORED_TARGETS: {
2472 g_bHideMoored = !g_bHideMoored;
2475 case ID_MENU_AIS_SCALED_TARGETS: {
2476 ToggleAISMinimizeTargets(GetFocusCanvas());
2480 case ID_MENU_AIS_TARGETLIST: {
2481 if (GetPrimaryCanvas()) GetPrimaryCanvas()->ShowAISTargetList();
2485 case ID_MENU_AIS_TRACKS: {
2486 g_bAISShowTracks = !g_bAISShowTracks;
2487 SetMenubarItemState(ID_MENU_AIS_TRACKS, g_bAISShowTracks);
2491 case ID_MENU_AIS_CPADIALOG: {
2492 g_bAIS_CPA_Alert = !g_bAIS_CPA_Alert;
2493 SetMenubarItemState(ID_MENU_AIS_CPADIALOG, g_bAIS_CPA_Alert);
2497 case ID_MENU_AIS_CPASOUND: {
2498 g_bAIS_CPA_Alert_Audio = !g_bAIS_CPA_Alert_Audio;
2499 SetMenubarItemState(ID_MENU_AIS_CPASOUND, g_bAIS_CPA_Alert_Audio);
2503 case ID_MENU_AIS_CPAWARNING: {
2504 if (GetPrimaryCanvas()) GetPrimaryCanvas()->ToggleCPAWarn();
2505 SetMenubarItemState(ID_MENU_AIS_CPAWARNING, g_bCPAWarn);
2509 case wxID_PREFERENCES:
2511 g_MainToolbar->HideTooltip();
2516 case ID_MENU_SETTINGS_BASIC: {
2517#ifdef __OCPN__ANDROID__
2519 androidDisableFullScreen();
2520 g_MainToolbar->HideTooltip();
2521 DoAndroidPreferences();
2528 case ID_MENU_UI_FULLSCREEN: {
2533 case ID_MENU_SHOW_CURRENTS: {
2534 GetFocusCanvas()->ShowCurrents(!GetFocusCanvas()->GetbShowCurrent());
2535 GetFocusCanvas()->ReloadVP();
2536 GetFocusCanvas()->Refresh(
false);
2540 case ID_MENU_SHOW_TIDES: {
2541 GetFocusCanvas()->ShowTides(!GetFocusCanvas()->GetbShowTide());
2542 GetFocusCanvas()->ReloadVP();
2543 GetFocusCanvas()->Refresh(
false);
2549 g_Platform->DoHelpDialog();
2554 g_Platform->LaunchLocalHelp();
2563 case ID_MENU_UI_COLSCHEME:
2564 case ID_COLSCHEME: {
2565 ToggleColorScheme();
2574 case ID_MENU_OQUIT: {
2579 case ID_MENU_ROUTE_MANAGER:
2580 case ID_ROUTEMANAGER: {
2581 pRouteManagerDialog = RouteManagerDialog::getInstance(
2584 if (pRouteManagerDialog->IsShown())
2585 pRouteManagerDialog->Hide();
2587 pRouteManagerDialog->UpdateRouteListCtrl();
2588 pRouteManagerDialog->UpdateTrkListCtrl();
2589 pRouteManagerDialog->UpdateWptListCtrl();
2590 pRouteManagerDialog->UpdateLayListCtrl();
2592 pRouteManagerDialog->Show();
2596 pRouteManagerDialog->Centre();
2597 pRouteManagerDialog->Raise();
2603 case ID_MENU_NAV_TRACK:
2605 if (!g_bTrackActive) {
2607 g_bTrackCarryOver =
true;
2610 if (pConfig && pConfig->IsChangesFileDirty()) {
2611 pConfig->UpdateNavObj(
true);
2613 g_bTrackCarryOver =
false;
2614 RefreshAllCanvas(
true);
2619 case ID_MENU_CHART_NORTHUP: {
2620 SetUpMode(GetPrimaryCanvas(), NORTH_UP_MODE);
2623 case ID_MENU_CHART_COGUP: {
2624 SetUpMode(GetPrimaryCanvas(), COURSE_UP_MODE);
2627 case ID_MENU_CHART_HEADUP: {
2628 SetUpMode(GetPrimaryCanvas(), HEAD_UP_MODE);
2632 case ID_MENU_MARK_MOB:
2638 case ID_MASTERTOGGLE: {
2639 if (g_MainToolbar) {
2640 wxString tip = _(
"Show Toolbar");
2641 if (!g_bmasterToolbarFull) tip = _(
"Hide Toolbar");
2642 if (g_MainToolbar->GetToolbar())
2643 g_MainToolbar->GetToolbar()->SetToolShortHelp(ID_MASTERTOGGLE, tip);
2645 g_bmasterToolbarFull = !g_bmasterToolbarFull;
2648 if (g_bmasterToolbarFull)
2649 m_nMasterToolCountShown =
2650 g_MainToolbar->GetToolCount() -
2653 m_nMasterToolCountShown = 2;
2655 m_nMasterToolCountShown =
2656 g_MainToolbar->GetToolShowCount();
2658 ToolbarAnimateTimer.Start(10, wxTIMER_ONE_SHOT);
2666 case ID_CMD_SELECT_CHART_TYPE: {
2667 selectChartDisplay(event.GetExtraLong(), -1);
2671 case ID_CMD_SELECT_CHART_FAMILY: {
2672 selectChartDisplay(-1, event.GetExtraLong());
2676 case ID_CMD_APPLY_SETTINGS: {
2677 applySettingsString(event.GetString());
2678#ifdef __OCPN__ANDROID__
2679 androidRestoreFullScreen();
2685 case ID_CMD_NULL_REFRESH: {
2690 case ID_CMD_SETVP: {
2691 setStringVP(event.GetString());
2695 case ID_CMD_INVALIDATE: {
2701 case ID_CMD_POST_JSON_TO_PLUGINS: {
2705 wxJSONReader reader;
2707 int numErrors = reader.Parse(event.GetString(), &root);
2708 if (numErrors == 0) {
2709 if (root[_T(
"MessageID")].IsString()) {
2710 wxString MsgID = root[_T(
"MessageID")].AsString();
2711 SendPluginMessage(MsgID, event.GetString());
2723 g_MainToolbar->HideTooltip();
2725 ArrayOfPlugInToolbarTools tool_array =
2726 g_pi_manager->GetPluginToolbarToolArray();
2727 for (
unsigned int i = 0; i < tool_array.size(); i++) {
2729 if (event.GetId() == pttc->id) {
2730 if (pttc->m_pplugin)
2731 pttc->m_pplugin->OnToolbarToolCallback(pttc->id);
2749bool MyFrame::SetGlobalToolbarViz(
bool viz) {
2750 bool viz_now = g_bmasterToolbarFull;
2752 g_MainToolbar->HideTooltip();
2753 wxString tip = _(
"Show Toolbar");
2755 tip = _(
"Hide Toolbar");
2756 if (g_MainToolbar->GetToolbar())
2757 g_MainToolbar->GetToolbar()->SetToolShortHelp(ID_MASTERTOGGLE, tip);
2760 bool toggle =
false;
2761 if (viz && !g_bmasterToolbarFull)
2764 else if (!viz && g_bmasterToolbarFull)
2768 g_bmasterToolbarFull = !g_bmasterToolbarFull;
2771 if (g_bmasterToolbarFull)
2772 m_nMasterToolCountShown =
2773 g_MainToolbar->GetToolCount() -
2776 m_nMasterToolCountShown = 2;
2778 m_nMasterToolCountShown =
2779 g_MainToolbar->GetToolShowCount();
2781 ToolbarAnimateTimer.Start(10, wxTIMER_ONE_SHOT);
2787void MyFrame::ScheduleSettingsDialog() {
2788 wxCommandEvent evt(wxEVT_COMMAND_MENU_SELECTED);
2789 evt.SetId(ID_SETTINGS );
2790 GetEventHandler()->AddPendingEvent(evt);
2794 if ((g_canvasConfig != 0) && g_focusCanvas)
2795 return g_focusCanvas;
2797 return GetPrimaryCanvas();
2800void MyFrame::OnToolbarAnimateTimer(wxTimerEvent &event) {
2801 if (g_bmasterToolbarFull) {
2802 if (m_nMasterToolCountShown < (
int)g_MainToolbar->GetToolCount()) {
2803 m_nMasterToolCountShown++;
2804 g_MainToolbar->SetToolShowCount(m_nMasterToolCountShown);
2805 g_MainToolbar->Realize();
2807 ToolbarAnimateTimer.Start(20, wxTIMER_ONE_SHOT);
2810 g_MainToolbar->GetToolbar()->InvalidateBitmaps();
2811 g_MainToolbar->Realize();
2812 g_MainToolbar->Show();
2815 if (m_nMasterToolCountShown > 1) {
2816 m_nMasterToolCountShown--;
2817 g_MainToolbar->SetToolShowCount(m_nMasterToolCountShown);
2818 g_MainToolbar->Realize();
2819 ToolbarAnimateTimer.Start(10, wxTIMER_ONE_SHOT);
2821 g_MainToolbar->GetToolbar()->InvalidateBitmaps();
2822 g_MainToolbar->Realize();
2823 g_MainToolbar->Show();
2828void MyFrame::InvalidateAllGL() {
2831 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2841void MyFrame::RefreshAllCanvas(
bool bErase) {
2843 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2846 cc->Refresh(bErase);
2851void MyFrame::SetAISDisplayStyle(
ChartCanvas *cc,
int StyleIndx) {
2852 cc->SetAISCanvasDisplayStyle(StyleIndx);
2854 UpdateGlobalMenuItems();
2858void MyFrame::setStringVP(wxString VPS) {
2863 wxStringTokenizer tkz(VPS, _T(
";"));
2865 wxString token = tkz.GetNextToken();
2867 token.ToDouble(&lat);
2869 token = tkz.GetNextToken();
2871 token.ToDouble(&lon);
2873 token = tkz.GetNextToken();
2874 double scale_ppm = cc->GetVP().view_scale_ppm;
2875 token.ToDouble(&scale_ppm);
2877 cc->SetViewPoint(lat, lon, scale_ppm, 0, cc->GetVPRotation());
2880void MyFrame::DoSettings() {
2881 if (g_boptionsactive)
return;
2883 bool bnewtoolbar = !(DoOptionsDialog() == 0);
2886 ApplyGlobalSettings(bnewtoolbar);
2888 if (g_MainToolbar) g_MainToolbar->RefreshFadeTimer();
2891 bool b_loadHarmonics =
false;
2892 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
2895 if (cc->GetbShowCurrent() || cc->GetbShowTide()) b_loadHarmonics =
true;
2898 if (b_loadHarmonics) LoadHarmonics();
2906 g_bShowChartBar = !g_bShowChartBar;
2908 if (g_bShowChartBar) cc->m_brepaint_piano =
true;
2913 if (g_bShowChartBar) {
2915 UpdateControlBar(cc);
2918 SetMenubarItemState(ID_MENU_UI_CHARTBAR, g_bShowChartBar);
2921void MyFrame::ToggleColorScheme() {
2922 static bool lastIsNight;
2923 ColorScheme s = GetColorScheme();
2926 if (lastIsNight && is == 3)
2929 lastIsNight =
false;
2931 if (lastIsNight) is = 2;
2932 if (is == 3) lastIsNight =
true;
2933 s = (ColorScheme)is;
2934 if (s == N_COLOR_SCHEMES) s = GLOBAL_COLOR_SCHEME_RGB;
2936 SetAndApplyColorScheme(s);
2939void MyFrame::ToggleFullScreen() {
2940 bool to = !IsFullScreen();
2945 long style = wxFULLSCREEN_NOBORDER | wxFULLSCREEN_NOCAPTION;
2947 ShowFullScreen(to, style);
2950 UpdateAllToolbars(global_color_scheme);
2952 UpdateControlBar(GetPrimaryCanvas());
2954 TriggerRecaptureTimer();
2957void MyFrame::ActivateMOB(
void) {
2959 wxDateTime mob_time = wxDateTime::Now();
2960 wxString mob_label(_(
"MAN OVERBOARD"));
2961 mob_label += _(
" at ");
2962 mob_label += mob_time.FormatTime();
2963 mob_label += _(
" on ");
2964 mob_label += mob_time.FormatISODate();
2967 new RoutePoint(gLat, gLon, _T (
"mob" ), mob_label, wxEmptyString);
2968 pWP_MOB->SetShared(
true);
2969 pWP_MOB->m_bIsolatedMark =
true;
2970 pWP_MOB->SetWaypointArrivalRadius(
2972 pWP_MOB->SetUseSca(
false);
2973 pSelect->AddSelectableRoutePoint(gLat, gLon, pWP_MOB);
2974 pConfig->AddNewWayPoint(pWP_MOB, -1);
2976 if (bGPSValid && !std::isnan(gCog) && !std::isnan(gSog)) {
2979 ll_gc_ll(gLat, gLon, gCog, 1.0, &zlat, &zlon);
2982 new RoutePoint(zlat, zlon, g_default_wp_icon,
2983 wxString(_(
"1.0 NM along COG")), wxEmptyString);
2984 pSelect->AddSelectableRoutePoint(zlat, zlon, pWP_src);
2987 pRouteList->Append(temp_route);
2989 temp_route->AddPoint(pWP_src);
2990 temp_route->AddPoint(pWP_MOB);
2992 pSelect->AddSelectableRouteSegment(gLat, gLon, zlat, zlon, pWP_src, pWP_MOB,
2995 temp_route->m_RouteNameString = _(
"Temporary MOB Route");
2996 temp_route->m_RouteStartString = _(
"Assumed 1 Mile Point");
2998 temp_route->m_RouteEndString = mob_label;
3000 temp_route->m_bDeleteOnArrival =
false;
3002 temp_route->SetRouteArrivalRadius(-1.0);
3004 if (g_pRouteMan->GetpActiveRoute()) g_pRouteMan->DeactivateRoute();
3005 g_pRouteMan->ActivateRoute(temp_route, pWP_MOB);
3008 v[_T(
"GUID")] = temp_route->m_GUID;
3009 wxString msg_id(_T(
"OCPN_MAN_OVERBOARD"));
3010 g_pi_manager->SendJSONMessageToAllPlugins(msg_id, v);
3013 if (RouteManagerDialog::getInstanceFlag()) {
3014 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
3015 pRouteManagerDialog->UpdateRouteListCtrl();
3016 pRouteManagerDialog->UpdateWptListCtrl();
3021 RefreshAllCanvas(
false);
3023 wxString mob_message(_(
"MAN OVERBOARD"));
3024 mob_message += _(
" Time: ");
3025 mob_message += mob_time.Format();
3026 mob_message += _(
" Position: ");
3027 mob_message += toSDMM(1, gLat);
3028 mob_message += _T(
" ");
3029 mob_message += toSDMM(2, gLon);
3030 wxLogMessage(mob_message);
3032void MyFrame::TrackOn(
void) {
3033 g_bTrackActive =
true;
3036 g_TrackList.push_back(g_pActiveTrack);
3037 if (pConfig) pConfig->AddNewTrack(g_pActiveTrack);
3039 g_pActiveTrack->Start();
3042 SetMasterToolbarItemState(ID_TRACK, g_bTrackActive);
3044 g_MainToolbar->SetToolShortHelp(ID_TRACK, _(
"Disable Tracking"));
3046 SetMenubarItemState(ID_MENU_NAV_TRACK, g_bTrackActive);
3048#ifdef __OCPN__ANDROID__
3049 androidSetTrackTool(
true);
3052 if (RouteManagerDialog::getInstanceFlag()) {
3053 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
3054 pRouteManagerDialog->UpdateTrkListCtrl();
3055 pRouteManagerDialog->UpdateRouteListCtrl();
3061 now = now.Now().ToUTC();
3062 wxString name = g_pActiveTrack->GetName();
3063 if (name.IsEmpty()) {
3064 TrackPoint *tp = g_pActiveTrack->GetPoint(0);
3065 if (tp->GetCreateTime().IsValid())
3066 name = tp->GetCreateTime().FormatISODate() + _T(
" ") +
3067 tp->GetCreateTime().FormatISOTime();
3069 name = _(
"(Unnamed Track)");
3071 v[_T(
"Name")] = name;
3072 v[_T(
"GUID")] = g_pActiveTrack->m_GUID;
3073 wxString msg_id(_T(
"OCPN_TRK_ACTIVATED"));
3074 g_pi_manager->SendJSONMessageToAllPlugins(msg_id, v);
3075 g_FlushNavobjChangesTimeout =
3079Track *MyFrame::TrackOff(
bool do_add_point) {
3080 Track *return_val = g_pActiveTrack;
3082 if (g_pActiveTrack) {
3084 wxString msg_id(_T(
"OCPN_TRK_DEACTIVATED"));
3085 v[_T(
"GUID")] = g_pActiveTrack->m_GUID;
3086 g_pi_manager->SendJSONMessageToAllPlugins(msg_id, v);
3088 g_pActiveTrack->Stop(do_add_point);
3090 if (g_pActiveTrack->GetnPoints() < 2) {
3091 RoutemanGui(*g_pRouteMan).DeleteTrack(g_pActiveTrack);
3094 if (g_bTrackDaily) {
3095 Track *pExtendTrack = g_pActiveTrack->DoExtendDaily();
3097 RoutemanGui(*g_pRouteMan).DeleteTrack(g_pActiveTrack);
3098 return_val = pExtendTrack;
3102 g_pActiveTrack = NULL;
3105 g_bTrackActive =
false;
3107 if (RouteManagerDialog::getInstanceFlag()) {
3108 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
3109 pRouteManagerDialog->UpdateTrkListCtrl();
3110 pRouteManagerDialog->UpdateRouteListCtrl();
3114 SetMasterToolbarItemState(ID_TRACK, g_bTrackActive);
3116 g_MainToolbar->SetToolShortHelp(ID_TRACK, _(
"Enable Tracking"));
3117 SetMenubarItemState(ID_MENU_NAV_TRACK, g_bTrackActive);
3119#ifdef __OCPN__ANDROID__
3120 androidSetTrackTool(
false);
3123 g_FlushNavobjChangesTimeout =
3129bool MyFrame::ShouldRestartTrack(
void) {
3130 if (!g_pActiveTrack || !g_bTrackDaily)
return false;
3131 time_t now = wxDateTime::Now().GetTicks();
3132 time_t today = wxDateTime::Today().GetTicks();
3134 switch (g_track_rotate_time_type) {
3136 rotate_at = g_track_rotate_time + wxRound(gLon * 3600. / 15.);
3138 case TIME_TYPE_COMPUTER:
3139 rotate_at = g_track_rotate_time;
3143 wxDateTime::Now().GetTicks() - wxDateTime::Now().ToUTC().GetTicks();
3144 rotate_at = g_track_rotate_time + utc_offset;
3147 if (rotate_at > 86400)
3149 else if (rotate_at < 0)
3151 if (now >= m_last_track_rotation_ts + 86400 - 3600 &&
3152 now - today >= rotate_at) {
3153 if (m_last_track_rotation_ts == 0) {
3154 if (now - today > rotate_at)
3155 m_last_track_rotation_ts = today + rotate_at;
3157 m_last_track_rotation_ts = today + rotate_at - 86400;
3160 m_last_track_rotation_ts = now;
3166void MyFrame::TrackDailyRestart(
void) {
3167 if (!g_pActiveTrack)
return;
3169 Track *pPreviousTrack = TrackOff(
true);
3170 if (pConfig && pConfig->IsChangesFileDirty()) {
3171 pConfig->UpdateNavObj(
true);
3180 if (pPreviousTrack) {
3181 TrackPoint *pMidnightPoint = pPreviousTrack->GetLastPoint();
3182 g_pActiveTrack->AdjustCurrentTrackPoint(pMidnightPoint);
3185 if (RouteManagerDialog::getInstanceFlag()) {
3186 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
3187 pRouteManagerDialog->UpdateTrkListCtrl();
3188 pRouteManagerDialog->UpdateRouteListCtrl();
3193void MyFrame::SetUpMode(
ChartCanvas *cc,
int mode) {
3195 cc->SetUpMode(mode);
3197 SetMenubarItemState(ID_MENU_CHART_COGUP, mode == COURSE_UP_MODE);
3198 SetMenubarItemState(ID_MENU_CHART_NORTHUP, mode == NORTH_UP_MODE);
3199 SetMenubarItemState(ID_MENU_CHART_HEADUP, mode == HEAD_UP_MODE);
3202 m_pMenuBar->SetLabel(ID_MENU_CHART_NORTHUP, _(
"North Up Mode"));
3207 cc->SetShowENCText(!cc->GetShowENCText());
3209 SetMenubarItemState(ID_MENU_ENC_TEXT, cc->GetShowENCText());
3217void MyFrame::SetENCDisplayCategory(
ChartCanvas *cc,
enum _DisCat nset) {
3220 cc->SetENCDisplayCategory(nset);
3222 UpdateGlobalMenuItems();
3233 cc->SetShowENCDepth(!cc->GetShowENCDepth());
3235 SetMenubarItemState(ID_MENU_ENC_SOUNDINGS, cc->GetShowENCDepth());
3244 cc->SetShowENCLights(!cc->GetShowENCLights());
3246 SetMenubarItemState(ID_MENU_ENC_LIGHTS, cc->GetShowENCLights());
3248 if (g_pi_manager) g_pi_manager->SendS52ConfigToAllPlugIns(
true);
3256void MyFrame::ToggleRocks(
void )
3262 for(
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount(); iPtr++ ) {
3263 OBJLElement *pOLE = (OBJLElement *) ( ps52plib->pOBJLArray->Item( iPtr ) );
3264 if( !strncmp( pOLE->OBJLName,
"UWTROC", 6 ) ) {
3265 pOLE->nViz = !pOLE->nViz;
3269 for(
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount(); iPtr++ ) {
3270 OBJLElement *pOLE = (OBJLElement *) ( ps52plib->pOBJLArray->Item( iPtr ) );
3271 if( !strncmp( pOLE->OBJLName,
"OBSTRN", 6 ) ) {
3274 if( !strncmp( pOLE->OBJLName,
"WRECKS", 6 ) ) {
3278 ps52plib->GenerateStateHash();
3285 cc->SetShowENCAnchor(!cc->GetShowENCAnchor());
3287 SetMenubarItemState(ID_MENU_ENC_ANCHOR, cc->GetShowENCAnchor());
3289 if (g_pi_manager) g_pi_manager->SendS52ConfigToAllPlugIns();
3295 cc->SetShowENCDataQual(!cc->GetShowENCDataQual());
3297 SetMenubarItemState(ID_MENU_ENC_DATA_QUALITY, cc->GetShowENCDataQual());
3299 if (g_pi_manager) g_pi_manager->SendS52ConfigToAllPlugIns();
3312 cc->m_bShowNavobjects = !cc->m_bShowNavobjects;
3313 SetMenubarItemState(ID_MENU_SHOW_NAVOBJECTS, cc->m_bShowNavobjects);
3318 cc->SetShowAIS(!cc->GetShowAIS());
3319 SetMenubarItemState(ID_MENU_AIS_TARGETS, cc->GetShowAIS());
3323void MyFrame::ToggleAISMinimizeTargets(
ChartCanvas *cc) {
3324 cc->SetAttenAIS(!cc->GetAttenAIS());
3325 SetMenubarItemState(ID_MENU_AIS_SCALED_TARGETS, cc->GetAttenAIS());
3330 JumpToPosition(cc, gLat, gLon, cc->GetVPScale());
3331 cc->m_bFollow =
true;
3333 cc->SetCanvasToolbarItemState(ID_FOLLOW,
true);
3334 SetMenubarItemState(ID_MENU_NAV_FOLLOW,
true);
3338 SetChartUpdatePeriod();
3346 cc->m_bFollow =
false;
3347 cc->SetCanvasToolbarItemState(ID_FOLLOW,
false);
3348 SetMenubarItemState(ID_MENU_NAV_FOLLOW,
false);
3352 SetChartUpdatePeriod();
3355void MyFrame::ToggleChartOutlines(
ChartCanvas *cc) {
3356 cc->SetShowOutlines(!cc->GetShowOutlines());
3358 RefreshAllCanvas(
false);
3362 if (g_bopengl) InvalidateAllGL();
3365 SetMenubarItemState(ID_MENU_CHART_OUTLINES, cc->GetShowOutlines());
3368void MyFrame::ToggleTestPause(
void) { g_bPauseTest = !g_bPauseTest; }
3370void MyFrame::SetMenubarItemState(
int item_id,
bool state) {
3372 bool enabled = m_pMenuBar->IsEnabled(item_id);
3373 m_pMenuBar->Enable(item_id,
false);
3374 m_pMenuBar->Check(item_id, state);
3375 m_pMenuBar->Enable(item_id, enabled);
3379void MyFrame::SetMasterToolbarItemState(
int tool_id,
bool state) {
3380 if (g_MainToolbar && g_MainToolbar->GetToolbar())
3381 g_MainToolbar->GetToolbar()->ToggleTool(tool_id, state);
3384void MyFrame::SetToolbarItemBitmaps(
int tool_id, wxBitmap *bmp,
3385 wxBitmap *bmpRollover) {
3386 if (g_MainToolbar && g_MainToolbar->GetToolbar()) {
3387 g_MainToolbar->GetToolbar()->SetToolBitmaps(tool_id, bmp, bmpRollover);
3388 wxRect rect = g_MainToolbar->GetToolbar()->GetToolRect(tool_id);
3389 g_MainToolbar->GetToolbar()->RefreshRect(rect);
3393void MyFrame::SetToolbarItemSVG(
int tool_id, wxString normalSVGfile,
3394 wxString rolloverSVGfile,
3395 wxString toggledSVGfile) {
3396 if (g_MainToolbar && g_MainToolbar->GetToolbar()) {
3397 g_MainToolbar->GetToolbar()->SetToolBitmapsSVG(
3398 tool_id, normalSVGfile, rolloverSVGfile, toggledSVGfile);
3399 wxRect rect = g_MainToolbar->GetToolbar()->GetToolRect(tool_id);
3400 g_MainToolbar->GetToolbar()->RefreshRect(rect);
3404void MyFrame::ApplyGlobalSettings(
bool bnewtoolbar) {
3406 m_StatusBarFieldCount = g_Platform->GetStatusBarFieldCount();
3409 UseNativeStatusBar(
false);
3412 if (g_bShowStatusBar) {
3413 if (!m_pStatusBar) {
3415 CreateStatusBar(m_StatusBarFieldCount, 0);
3416 ApplyGlobalColorSchemetoStatusBar();
3421 m_pStatusBar->Destroy();
3422 m_pStatusBar = NULL;
3427 wxSize lastOptSize = options_lastWindowSize;
3433 options_lastWindowSize = lastOptSize;
3435 if (bnewtoolbar) UpdateAllToolbars(global_color_scheme);
3438wxString _menuText(wxString name, wxString shortcut) {
3441#ifndef __OCPN__ANDROID__
3442 menutext << _T(
"\t") << shortcut;
3447void MyFrame::BuildMenuBar(
void) {
3453 bool showMenuBar =
true;
3455 bool showMenuBar = g_bShowMenuBar;
3467 m_pMenuBar =
new wxMenuBar();
3468 RegisterGlobalMenuItems();
3469 SetMenuBar(m_pMenuBar);
3473 UpdateGlobalMenuItems();
3478 m_pMenuBar->Destroy();
3484void MyFrame::RegisterGlobalMenuItems() {
3485 if (!m_pMenuBar)
return;
3487 wxMenu *nav_menu =
new wxMenu();
3488 nav_menu->AppendCheckItem(ID_MENU_NAV_FOLLOW,
3489 _menuText(_(
"Auto Follow"), _T(
"Ctrl-A")));
3490 nav_menu->AppendCheckItem(ID_MENU_NAV_TRACK, _(
"Enable Tracking"));
3491 nav_menu->AppendSeparator();
3492 nav_menu->AppendRadioItem(ID_MENU_CHART_NORTHUP, _(
"North Up Mode"));
3493 nav_menu->AppendRadioItem(ID_MENU_CHART_COGUP, _(
"Course Up Mode"));
3494 nav_menu->AppendRadioItem(ID_MENU_CHART_HEADUP, _(
"Head Up Mode"));
3495 nav_menu->AppendSeparator();
3497 nav_menu->Append(ID_MENU_ZOOM_IN, _menuText(_(
"Zoom In"), _T(
"+")));
3498 nav_menu->Append(ID_MENU_ZOOM_OUT, _menuText(_(
"Zoom Out"), _T(
"-")));
3500 nav_menu->Append(ID_MENU_ZOOM_IN, _menuText(_(
"Zoom In"), _T(
"Alt-+")));
3501 nav_menu->Append(ID_MENU_ZOOM_OUT, _menuText(_(
"Zoom Out"), _T(
"Alt--")));
3503 nav_menu->AppendSeparator();
3504 nav_menu->Append(ID_MENU_SCALE_IN,
3505 _menuText(_(
"Larger Scale Chart"), _T(
"Ctrl-Left")));
3506 nav_menu->Append(ID_MENU_SCALE_OUT,
3507 _menuText(_(
"Smaller Scale Chart"), _T(
"Ctrl-Right")));
3509 nav_menu->AppendSeparator();
3510 nav_menu->Append(ID_MENU_OQUIT, _menuText(_(
"Exit OpenCPN"), _T(
"Ctrl-Q")));
3512 m_pMenuBar->Append(nav_menu, _(
"&Navigate"));
3514 wxMenu *view_menu =
new wxMenu();
3516 view_menu->AppendCheckItem(ID_MENU_CHART_QUILTING,
3517 _menuText(_(
"Enable Chart Quilting"), _T(
"Q")));
3518 view_menu->AppendCheckItem(ID_MENU_CHART_OUTLINES,
3519 _menuText(_(
"Show Chart Outlines"), _T(
"O")));
3521 view_menu->AppendCheckItem(
3522 ID_MENU_CHART_QUILTING,
3523 _menuText(_(
"Enable Chart Quilting"), _T(
"Alt-Q")));
3524 view_menu->AppendCheckItem(ID_MENU_CHART_OUTLINES,
3525 _menuText(_(
"Show Chart Outlines"), _T(
"Alt-O")));
3527 view_menu->AppendCheckItem(ID_MENU_UI_CHARTBAR,
3528 _menuText(_(
"Show Chart Bar"), _T(
"Ctrl-B")));
3530 view_menu->AppendSeparator();
3532 view_menu->AppendCheckItem(ID_MENU_ENC_TEXT,
3533 _menuText(_(
"Show ENC text"), _T(
"T")));
3534 view_menu->AppendCheckItem(ID_MENU_ENC_LIGHTS,
3535 _menuText(_(
"Show ENC Lights"), _T(
"L")));
3536 view_menu->AppendCheckItem(ID_MENU_ENC_SOUNDINGS,
3537 _menuText(_(
"Show ENC Soundings"), _T(
"S")));
3538 view_menu->AppendCheckItem(ID_MENU_ENC_ANCHOR,
3539 _menuText(_(
"Show ENC Anchoring Info"), _T(
"A")));
3540 view_menu->AppendCheckItem(ID_MENU_ENC_DATA_QUALITY,
3541 _menuText(_(
"Show ENC Data Quality"), _T(
"U")));
3542 view_menu->AppendCheckItem(ID_MENU_SHOW_NAVOBJECTS,
3543 _menuText(_(
"Show Navobjects"), _T(
"V")));
3545 view_menu->AppendCheckItem(ID_MENU_ENC_TEXT,
3546 _menuText(_(
"Show ENC text"), _T(
"Alt-T")));
3547 view_menu->AppendCheckItem(ID_MENU_ENC_LIGHTS,
3548 _menuText(_(
"Show ENC Lights"), _T(
"Alt-L")));
3549 view_menu->AppendCheckItem(ID_MENU_ENC_SOUNDINGS,
3550 _menuText(_(
"Show ENC Soundings"), _T(
"Alt-S")));
3551 view_menu->AppendCheckItem(
3552 ID_MENU_ENC_ANCHOR, _menuText(_(
"Show ENC Anchoring Info"), _T(
"Alt-A")));
3553 view_menu->AppendCheckItem(
3554 ID_MENU_ENC_DATA_QUALITY,
3555 _menuText(_(
"Show ENC Data Quality"), _T(
"Alt-U")));
3556 view_menu->AppendCheckItem(ID_MENU_SHOW_NAVOBJECTS,
3557 _menuText(_(
"Show Navobjects"), _T(
"Alt-V")));
3559 view_menu->AppendSeparator();
3560 view_menu->AppendCheckItem(ID_MENU_SHOW_TIDES, _(
"Show Tides"));
3561 view_menu->AppendCheckItem(ID_MENU_SHOW_CURRENTS, _(
"Show Currents"));
3562 view_menu->AppendSeparator();
3564 view_menu->Append(ID_MENU_UI_COLSCHEME,
3565 _menuText(_(
"Change Color Scheme"), _T(
"C")));
3567 view_menu->Append(ID_MENU_UI_COLSCHEME,
3568 _menuText(_(
"Change Color Scheme"), _T(
"Alt-C")));
3571 view_menu->AppendSeparator();
3573 view_menu->Append(ID_MENU_UI_FULLSCREEN,
3574 _menuText(_(
"Toggle Full Screen"), _T(
"F11")));
3576 m_pMenuBar->Append(view_menu, _(
"&View"));
3578 wxMenu *ais_menu =
new wxMenu();
3579 ais_menu->AppendCheckItem(ID_MENU_AIS_TARGETS, _(
"Show AIS Targets"));
3580 ais_menu->AppendCheckItem(ID_MENU_AIS_SCALED_TARGETS,
3581 _(
"Attenuate less critical AIS targets"));
3582 ais_menu->AppendSeparator();
3583 ais_menu->AppendCheckItem(ID_MENU_AIS_MOORED_TARGETS,
3584 _(
"Hide Moored AIS Targets"));
3585 ais_menu->AppendCheckItem(ID_MENU_AIS_TRACKS, _(
"Show AIS Target Tracks"));
3586 ais_menu->AppendCheckItem(ID_MENU_AIS_CPADIALOG, _(
"Show CPA Alert Dialogs"));
3587 ais_menu->AppendCheckItem(ID_MENU_AIS_CPASOUND, _(
"Sound CPA Alarms"));
3588 ais_menu->AppendCheckItem(ID_MENU_AIS_CPAWARNING, _menuText(_(
"Show CPA Warnings"), _T(
"W")));
3589 ais_menu->AppendSeparator();
3590 ais_menu->Append(ID_MENU_AIS_TARGETLIST, _(
"AIS target list") + _T(
"..."));
3591 m_pMenuBar->Append(ais_menu, _(
"&AIS"));
3593 wxMenu *tools_menu =
new wxMenu();
3595 tools_menu->Append(ID_MENU_TOOL_MEASURE,
3596 _menuText(_(
"Measure Distance"), _T(
"M")));
3598 tools_menu->Append(ID_MENU_TOOL_MEASURE,
3599 _menuText(_(
"Measure Distance"), _T(
"Alt-M")));
3602 tools_menu->AppendSeparator();
3603 tools_menu->Append(ID_MENU_ROUTE_MANAGER, _(
"Route && Mark Manager..."));
3604 tools_menu->Append(ID_MENU_ROUTE_NEW,
3605 _menuText(_(
"Create Route"), _T(
"Ctrl-R")));
3606 tools_menu->AppendSeparator();
3607 tools_menu->Append(ID_MENU_MARK_BOAT,
3608 _menuText(_(
"Drop Mark at Boat"), _T(
"Ctrl-O")));
3609 tools_menu->Append(ID_MENU_MARK_CURSOR,
3610 _menuText(_(
"Drop Mark at Cursor"), _T(
"Ctrl-M")));
3611 tools_menu->AppendSeparator();
3616 _(
"Drop MOB Marker"),
3617 _T(
"RawCtrl-Space")));
3618 tools_menu->AppendSeparator();
3619 tools_menu->Append(wxID_PREFERENCES,
3620 _menuText(_(
"Preferences") + _T(
"..."), _T(
"Ctrl-,")));
3622 tools_menu->Append(ID_MENU_MARK_MOB,
3623 _menuText(_(
"Drop MOB Marker"), _T(
"Ctrl-Space")));
3624 tools_menu->AppendSeparator();
3625 tools_menu->Append(wxID_PREFERENCES,
3626 _menuText(_(
"Options") + _T(
"..."), _T(
"Ctrl-,")));
3628 m_pMenuBar->Append(tools_menu, _(
"&Tools"));
3631 wxMenu *window_menu =
new wxMenu();
3632 m_pMenuBar->Append(window_menu, _(
"&Window"));
3635 wxMenu *help_menu =
new wxMenu();
3636 help_menu->Append(wxID_ABOUT, _(
"About OpenCPN"));
3637 help_menu->Append(wxID_HELP, _(
"OpenCPN Help"));
3638 m_pMenuBar->Append(help_menu, _(
"&Help"));
3641 UpdateGlobalMenuItems();
3644void MyFrame::UpdateGlobalMenuItems() {
3645 if (!m_pMenuBar)
return;
3647 m_pMenuBar->FindItem(ID_MENU_NAV_FOLLOW)
3648 ->Check(GetPrimaryCanvas()->m_bFollow);
3649 m_pMenuBar->FindItem(ID_MENU_CHART_NORTHUP)
3650 ->Check(GetPrimaryCanvas()->GetUpMode() == NORTH_UP_MODE);
3651 m_pMenuBar->FindItem(ID_MENU_CHART_COGUP)
3652 ->Check(GetPrimaryCanvas()->GetUpMode() == COURSE_UP_MODE);
3653 m_pMenuBar->FindItem(ID_MENU_CHART_HEADUP)
3654 ->Check(GetPrimaryCanvas()->GetUpMode() == HEAD_UP_MODE);
3655 m_pMenuBar->FindItem(ID_MENU_NAV_TRACK)->Check(g_bTrackActive);
3656 m_pMenuBar->FindItem(ID_MENU_CHART_OUTLINES)->Check(g_bShowOutlines);
3657 m_pMenuBar->FindItem(ID_MENU_CHART_QUILTING)->Check(g_bQuiltEnable);
3658 m_pMenuBar->FindItem(ID_MENU_UI_CHARTBAR)->Check(g_bShowChartBar);
3659 m_pMenuBar->FindItem(ID_MENU_AIS_TARGETS)->Check(g_bShowAIS);
3660 m_pMenuBar->FindItem(ID_MENU_AIS_MOORED_TARGETS)->Check(g_bHideMoored);
3661 m_pMenuBar->FindItem(ID_MENU_AIS_SCALED_TARGETS)->Check(g_bShowScaled);
3662 m_pMenuBar->FindItem(ID_MENU_AIS_SCALED_TARGETS)->Enable(g_bAllowShowScaled);
3663 m_pMenuBar->FindItem(ID_MENU_AIS_TRACKS)->Check(g_bAISShowTracks);
3664 m_pMenuBar->FindItem(ID_MENU_AIS_CPADIALOG)->Check(g_bAIS_CPA_Alert);
3665 m_pMenuBar->FindItem(ID_MENU_AIS_CPASOUND)->Check(g_bAIS_CPA_Alert_Audio);
3666 m_pMenuBar->FindItem(ID_MENU_AIS_CPAWARNING)->Check(g_bCPAWarn);
3667 m_pMenuBar->FindItem(ID_MENU_SHOW_NAVOBJECTS)
3668 ->Check(GetPrimaryCanvas()->m_bShowNavobjects);
3671 m_pMenuBar->FindItem(ID_MENU_ENC_TEXT)->Check(ps52plib->GetShowS57Text());
3672 m_pMenuBar->FindItem(ID_MENU_ENC_SOUNDINGS)
3673 ->Check(ps52plib->GetShowSoundings());
3675 bool light_state =
false;
3677 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
3679 OBJLElement *pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
3680 if (!strncmp(pOLE->OBJLName,
"LIGHTS", 6)) {
3681 light_state = (pOLE->nViz == 1);
3686 m_pMenuBar->FindItem(ID_MENU_ENC_LIGHTS)
3687 ->Check((!ps52plib->IsObjNoshow(
"LIGHTS")) && light_state);
3691 DisCat nset = ps52plib->GetDisplayCategory();
3692 if ((nset == MARINERS_STANDARD) || (nset == OTHER)) {
3693 m_pMenuBar->FindItem(ID_MENU_ENC_ANCHOR)
3694 ->Check(!ps52plib->IsObjNoshow(
"SBDARE"));
3695 m_pMenuBar->Enable(ID_MENU_ENC_ANCHOR,
true);
3696 m_pMenuBar->FindItem(ID_MENU_ENC_DATA_QUALITY)
3697 ->Check(!ps52plib->IsObjNoshow(
"M_QUAL"));
3698 m_pMenuBar->Enable(ID_MENU_ENC_DATA_QUALITY,
true);
3700 m_pMenuBar->FindItem(ID_MENU_ENC_ANCHOR)->Check(
false);
3701 m_pMenuBar->Enable(ID_MENU_ENC_ANCHOR,
false);
3702 m_pMenuBar->Enable(ID_MENU_ENC_DATA_QUALITY,
false);
3707void MyFrame::UpdateGlobalMenuItems(
ChartCanvas *cc) {
3708 if (!m_pMenuBar)
return;
3710 m_pMenuBar->FindItem(ID_MENU_NAV_FOLLOW)->Check(cc->m_bFollow);
3712 if (cc->GetUpMode() == NORTH_UP_MODE)
3713 m_pMenuBar->FindItem(ID_MENU_CHART_NORTHUP)->Check(
true);
3714 else if (cc->GetUpMode() == COURSE_UP_MODE)
3715 m_pMenuBar->FindItem(ID_MENU_CHART_COGUP)->Check(
true);
3717 m_pMenuBar->FindItem(ID_MENU_CHART_HEADUP)->Check(
true);
3719 m_pMenuBar->FindItem(ID_MENU_NAV_TRACK)->Check(g_bTrackActive);
3720 m_pMenuBar->FindItem(ID_MENU_CHART_OUTLINES)->Check(cc->GetShowOutlines());
3721 m_pMenuBar->FindItem(ID_MENU_CHART_QUILTING)->Check(cc->GetQuiltMode());
3722 m_pMenuBar->FindItem(ID_MENU_UI_CHARTBAR)->Check(cc->GetShowChartbar());
3723 m_pMenuBar->FindItem(ID_MENU_AIS_TARGETS)->Check(cc->GetShowAIS());
3724 m_pMenuBar->FindItem(ID_MENU_AIS_MOORED_TARGETS)->Check(g_bHideMoored);
3725 m_pMenuBar->FindItem(ID_MENU_AIS_SCALED_TARGETS)->Check(cc->GetAttenAIS());
3726 m_pMenuBar->FindItem(ID_MENU_AIS_SCALED_TARGETS)->Enable(g_bAllowShowScaled);
3727 m_pMenuBar->FindItem(ID_MENU_AIS_TRACKS)->Check(g_bAISShowTracks);
3728 m_pMenuBar->FindItem(ID_MENU_AIS_CPADIALOG)->Check(g_bAIS_CPA_Alert);
3729 m_pMenuBar->FindItem(ID_MENU_AIS_CPASOUND)->Check(g_bAIS_CPA_Alert_Audio);
3730 m_pMenuBar->FindItem(ID_MENU_AIS_CPAWARNING)->Check(g_bCPAWarn);
3731 m_pMenuBar->FindItem(ID_MENU_SHOW_NAVOBJECTS)->Check(cc->m_bShowNavobjects);
3732 m_pMenuBar->FindItem(ID_MENU_SHOW_TIDES)->Check(cc->GetbShowTide());
3733 m_pMenuBar->FindItem(ID_MENU_SHOW_CURRENTS)->Check(cc->GetbShowCurrent());
3736 m_pMenuBar->FindItem(ID_MENU_ENC_TEXT)->Check(cc->GetShowENCText());
3737 m_pMenuBar->FindItem(ID_MENU_ENC_SOUNDINGS)->Check(cc->GetShowENCDepth());
3740 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
3742 OBJLElement *pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
3743 if (!strncmp(pOLE->OBJLName,
"LIGHTS", 6)) {
3748 m_pMenuBar->FindItem(ID_MENU_ENC_LIGHTS)->Check(cc->GetShowENCLights());
3752 DisCat nset = (DisCat)cc->GetENCDisplayCategory();
3753 if ((nset == MARINERS_STANDARD) || (nset == OTHER)) {
3754 m_pMenuBar->FindItem(ID_MENU_ENC_ANCHOR)->Check(cc->GetShowENCAnchor());
3755 m_pMenuBar->Enable(ID_MENU_ENC_ANCHOR,
true);
3756 m_pMenuBar->FindItem(ID_MENU_ENC_DATA_QUALITY)
3757 ->Check(cc->GetShowENCDataQual());
3758 m_pMenuBar->Enable(ID_MENU_ENC_DATA_QUALITY,
true);
3760 m_pMenuBar->FindItem(ID_MENU_ENC_ANCHOR)->Check(
false);
3761 m_pMenuBar->Enable(ID_MENU_ENC_ANCHOR,
false);
3762 m_pMenuBar->Enable(ID_MENU_ENC_DATA_QUALITY,
false);
3767void MyFrame::InvalidateAllCanvasUndo() {
3769 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
3771 if (cc) cc->undo->InvalidateUndo();
3775void MyFrame::SubmergeAllCanvasToolbars(
void) {
3777 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
3779 if (cc) cc->SubmergeToolbar();
3784 if (g_bshowToolbar) {
3786 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
3788 if (cc && cc->GetToolbarEnable()) cc->SurfaceToolbar();
3798void MyFrame::ToggleAllToolbars(
bool b_smooth) {
3800 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
3802 if (cc) cc->ToggleToolbar(b_smooth);
3806void MyFrame::JumpToPosition(
ChartCanvas *cc,
double lat,
double lon,
3808 if (lon > 180.0) lon -= 360.0;
3813 cc->JumpToPosition(lat, lon,
scale);
3816 g_pi_manager->SendViewPortToRequestingPlugIns(cc->GetVP());
3820void MyFrame::UpdateCanvasConfigDescriptors() {
3822 for (
unsigned int i = 0; i < g_canvasConfigArray.GetCount(); i++) {
3827 cc->iLat = chart->GetVP().clat;
3828 cc->iLon = chart->GetVP().clon;
3829 cc->iRotation = chart->GetVP().rotation;
3830 cc->iScale = chart->GetVP().view_scale_ppm;
3831 cc->DBindex = chart->GetQuiltReferenceChartIndex();
3832 cc->GroupID = chart->m_groupIndex;
3833 cc->canvasSize = chart->GetSize();
3839void MyFrame::CenterView(
ChartCanvas *cc,
const LLBBox &RBBox) {
3840 if (!RBBox.GetValid())
return;
3842 double clat = (RBBox.GetMinLat() + RBBox.GetMaxLat()) / 2;
3843 double clon = (RBBox.GetMinLon() + RBBox.GetMaxLon()) / 2;
3846 if (RBBox.GetMinLat() == RBBox.GetMaxLat() &&
3847 RBBox.GetMinLon() == RBBox.GetMaxLon()) {
3849 ppm = cc->GetVPScale();
3855 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
3856 RBBox.GetMinLat(), RBBox.GetMaxLon(), NULL, &rw);
3858 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
3859 RBBox.GetMaxLat(), RBBox.GetMinLon(), NULL, &rh);
3861 cc->GetSize(&ww, &wh);
3863 ppm = wxMin(ww / (rw * 1852), wh / (rh * 1852)) * (100 - fabs(clat)) / 90;
3865 ppm = wxMin(ppm, 1.0);
3868 JumpToPosition(cc, clat, clon, ppm);
3871int MyFrame::DoOptionsDialog() {
3872 if (g_boptionsactive)
return 0;
3874 g_boptionsactive =
true;
3875 g_last_ChartScaleFactor = g_ChartScaleFactor;
3877 if (NULL == g_options) {
3878 g_Platform->ShowBusySpinner();
3881 pConfig->SetPath(
"/Settings");
3882 pConfig->Read(
"OptionsSizeX", &sx, -1);
3883 pConfig->Read(
"OptionsSizeY", &sy, -1);
3886 new options(
this, -1, _(
"Options"), wxPoint(-1, -1), wxSize(sx, sy));
3888 g_Platform->HideBusySpinner();
3892 g_options->SetInitChartDir(*pInit_Chart_Dir);
3895 g_options->SetCurrentDirList(ChartData->GetChartDirArray());
3896 ArrayOfCDI *pWorkDirArray =
new ArrayOfCDI;
3897 g_options->SetWorkDirListPtr(pWorkDirArray);
3900 g_options->SetConfigPtr(pConfig);
3902 g_options->SetInitialSettings();
3904 bPrevQuilt = g_bQuiltEnable;
3905 bPrevFullScreenQuilt = g_bFullScreenQuilt;
3906 bPrevOGL = g_bopengl;
3908 prev_locale = g_locale;
3911 if (g_MainToolbar && g_MainToolbar->IsShown()) {
3912 wxRect bx_rect = g_options->GetScreenRect();
3913 wxRect tb_rect = g_MainToolbar->GetScreenRect();
3914 if (tb_rect.Intersects(bx_rect)) b_sub =
true;
3916 if (b_sub) g_MainToolbar->Submerge();
3919#if defined(__WXOSX__) || defined(__WXQT__)
3920 bool b_restoreAIS =
false;
3921 if (g_pAISTargetList && g_pAISTargetList->IsShown()) {
3922 b_restoreAIS =
true;
3923 g_pAISTargetList->Shutdown();
3924 g_pAISTargetList = NULL;
3930 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
3932 if (cc && cc->GetMUIBar()) cc->GetMUIBar()->Hide();
3935 SubmergeAllCanvasToolbars();
3936 g_MainToolbar->Submerge();
3939 g_options->SetInitialPage(options_lastPage, options_subpage);
3941#ifndef __OCPN__ANDROID__
3942 g_options->lastWindowPos = options_lastWindowPos;
3943 if (options_lastWindowPos != wxPoint(0, 0)) {
3944 g_options->Move(options_lastWindowPos);
3945 g_options->SetSize(options_lastWindowSize);
3947 g_options->Center();
3949 if (options_lastWindowSize != wxSize(0, 0)) {
3950 g_options->SetSize(options_lastWindowSize);
3956 if (options_lastWindowSize != wxSize(0, 0))
3957 g_options->SetSize(options_lastWindowSize.x - 1, options_lastWindowSize.y);
3962 if (g_MainToolbar) g_MainToolbar->DisableTooltips();
3964#ifdef __OCPN__ANDROID__
3965 androidEnableBackButton(
false);
3966 androidEnableOptionsMenu(
false);
3967 androidDisableFullScreen();
3971 unsigned int last_canvasConfig = g_canvasConfig;
3972 wxSize cc1SizeBefore;
3973 if (g_canvasConfig > 0) {
3975 if (cc) cc1SizeBefore = g_canvasArray.Item(0)->GetSize();
3980 wxArrayString pathArray;
3981 double restoreScale[4];
3984 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
3987 wxString chart_file_name;
3988 if (cc->GetQuiltMode()) {
3989 int dbi = cc->GetQuiltRefChartdbIndex();
3990 chart_file_name = ChartData->GetDBChartFileName(dbi);
3992 if (cc->m_singleChart)
3993 chart_file_name = cc->m_singleChart->GetFullPath();
3996 pathArray.Add(chart_file_name);
3997 restoreScale[i] = cc->GetVPScale();
4001 int rr = g_options->ShowModal();
4003#ifdef __OCPN__ANDROID__
4004 androidEnableBackButton(
true);
4005 androidEnableOptionsMenu(
true);
4006 androidRestoreFullScreen();
4007 androidEnableRotation();
4010 if (g_MainToolbar) g_MainToolbar->EnableTooltips();
4012 options_lastPage = g_options->lastPage;
4013#ifdef __OCPN__ANDROID__
4017 if (options_lastPage == 1) options_lastPage = 0;
4020 options_subpage = g_options->lastSubPage;
4022 options_lastWindowPos = g_options->lastWindowPos;
4023 options_lastWindowSize = g_options->lastWindowSize;
4026#ifdef __OCPN__ANDROID__
4027 g_MainToolbar->SetDockX(-1);
4028 g_MainToolbar->SetDockY(-1);
4030 g_MainToolbar->Surface();
4032 GetPrimaryCanvas()->SetFocus();
4039 bool ret_val =
false;
4040 rr = g_options->GetReturnCode();
4042 if (g_last_ChartScaleFactor != g_ChartScaleFactor) rr |= S52_CHANGED;
4044 bool b_refresh =
true;
4047 bool ccRightSizeChanged =
false;
4048 if( g_canvasConfig > 0 ){
4051 wxSize cc1Size = cc->canvasSize;
4052 if(cc1Size.x != cc1SizeBefore.x)
4053 ccRightSizeChanged =
true;
4058 if ((g_canvasConfig != last_canvasConfig) || (rr & GL_CHANGED)) {
4059 UpdateCanvasConfigDescriptors();
4061 if ((g_canvasConfig > 0) && (last_canvasConfig == 0))
4062 CreateCanvasLayout(
true);
4064 CreateCanvasLayout();
4068 g_pauimgr->Update();
4075 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4077 if (cc) cc->CreateMUIBar();
4080 rr |= GENERIC_CHANGED;
4102 if (rr & CONFIG_CHANGED) {
4105 for (
unsigned int i = 0; i < g_canvasConfigArray.GetCount(); i++) {
4110 chartCanvas->ApplyCanvasConfig(cc);
4117 bDBUpdateInProgress =
true;
4118 b_refresh |= ProcessOptionsDialog(rr, g_options->GetWorkDirListPtr());
4119 ChartData->GetChartDirArray() =
4120 *(g_options->GetWorkDirListPtr());
4122 bDBUpdateInProgress =
false;
4126 delete pWorkDirArray;
4132 SetGPSCompassScale();
4134 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4137 cc->GetCompass()->SetScaleFactor(g_compass_scalefactor);
4138 cc->UpdateCanvasControlBar();
4141 UpdateGPSCompassStatusBoxes();
4143 SetAllToolbarScale();
4144 RequestNewToolbars();
4148 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4151 cc->RebuildCursors();
4156 bool b_masterScaleChange =
false;
4157 if (fabs(g_MainToolbar->GetScaleFactor() - g_toolbar_scalefactor) > 0.01f)
4158 b_masterScaleChange =
true;
4160 if ((rr & TOOLBAR_CHANGED) || b_masterScaleChange)
4161 RequestNewMasterToolbar(
true);
4163 bool bMuiChange =
false;
4164#ifdef __OCPN__ANDROID__
4169 if (b_masterScaleChange || bMuiChange) {
4171 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4174 cc->ProcessNewGUIScale();
4179 if (g_MainToolbar) {
4180 if (IsFullScreen() && !g_bFullscreenToolbar) g_MainToolbar->Submerge();
4183#if defined(__WXOSX__) || defined(__WXQT__)
4186 g_pAISTargetList->UpdateAISTargetList();
4190 if (console && console->IsShown()) console->Raise();
4192 if (g_pais_alert_dialog_active) g_pais_alert_dialog_active->Raise();
4194 if (NMEALogWindow::Get().Active())
4195 NMEALogWindow::Get().GetTTYWindow()->Raise();
4197#ifdef __OCPN__ANDROID__
4198 if (g_pi_manager) g_pi_manager->NotifyAuiPlugIns();
4203 if ((rr & FONT_CHANGED) || (rr & NEED_NEW_OPTIONS)) {
4210 if (g_pMarkInfoDialog) {
4211 g_pMarkInfoDialog->Hide();
4212 g_pMarkInfoDialog->Destroy();
4213 g_pMarkInfoDialog = NULL;
4217 if (rr & LOCALE_CHANGED) {
4218 g_Platform->ChangeLocale(g_locale, plocale_def_lang, &plocale_def_lang);
4228 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4231 int index_hint = -1;
4232 if (i < pathArray.GetCount())
4233 index_hint = ChartData->FinddbIndex(pathArray.Item(i));
4234 cc->canvasChartsRefresh(index_hint);
4235 if (index_hint != -1) cc->SetVPScale(restoreScale[i]);
4240 g_boptionsactive =
false;
4243 if (rr & CONFIG_CHANGED) {
4244 options_subpage = 3;
4245 ScheduleSettingsDialog();
4247 options_subpage = 0;
4252bool MyFrame::ProcessOptionsDialog(
int rr, ArrayOfCDI *pNewDirArray) {
4253 bool b_need_refresh =
false;
4255 if ((rr & VISIT_CHARTS) &&
4256 ((rr & CHANGE_CHARTS) || (rr & FORCE_UPDATE) || (rr & SCAN_UPDATE))) {
4258 UpdateChartDatabaseInplace(*pNewDirArray,
4259 ((rr & FORCE_UPDATE) == FORCE_UPDATE),
true,
4262 b_need_refresh =
true;
4266 if (rr & STYLE_CHANGED) {
4269 _(
"Please restart OpenCPN to activate language or style changes."),
4270 _(
"OpenCPN Info"), wxOK | wxICON_INFORMATION);
4273 bool b_groupchange =
false;
4274 if (((rr & VISIT_CHARTS) &&
4275 ((rr & CHANGE_CHARTS) || (rr & FORCE_UPDATE) || (rr & SCAN_UPDATE))) ||
4276 (rr & GROUPS_CHANGED)) {
4277 b_groupchange = ScrubGroupArray();
4278 ChartData->ApplyGroupArray(g_pGroupArray);
4279 RefreshGroupIndices();
4282 if (rr & GROUPS_CHANGED || b_groupchange) {
4283 pConfig->DestroyConfigGroups();
4284 pConfig->CreateConfigGroups(g_pGroupArray);
4287 if (rr & TIDES_CHANGED) {
4293 if (rr & S52_CHANGED) {
4294 WayPointmanGui(*pWayPointMan).ReloadAllIcons(g_Platform->GetDisplayDPmm());
4297 pConfig->UpdateSettings();
4299 if (g_pActiveTrack) {
4300 g_pActiveTrack->SetPrecision(g_nTrackPrecision);
4314 if( !std::isnan(gCog) ) stuff = gCog;
4315 if( g_COGAvgSec > 0 ) {
4316 for(
int i = 0; i < g_COGAvgSec; i++ )
4317 COGTable[i] = stuff;
4327 g_pRouteMan->SetColorScheme(global_color_scheme,
4328 g_Platform->GetDisplayDPmm());
4331 double stuffcog = NAN;
4332 double stuffsog = NAN;
4333 if (!std::isnan(gCog)) stuffcog = gCog;
4334 if (!std::isnan(gSog)) stuffsog = gSog;
4336 for (
int i = 0; i < MAX_COGSOG_FILTER_SECONDS; i++) {
4337 COGFilterTable[i] = stuffcog;
4338 SOGFilterTable[i] = stuffsog;
4341 SetChartUpdatePeriod();
4343 if (rr & GL_CHANGED) {
4347 b_need_refresh =
true;
4350 if (rr & S52_CHANGED) {
4351 b_need_refresh =
true;
4355 if (rr & REBUILD_RASTER_CACHE) {
4356 if (g_glTextureManager) {
4357 GetPrimaryCanvas()->Disable();
4358 g_glTextureManager->BuildCompressedCache();
4359 GetPrimaryCanvas()->Enable();
4364 if (g_config_display_size_mm > 0) {
4365 g_display_size_mm = g_config_display_size_mm;
4367 g_display_size_mm = wxMax(100, g_Platform->GetDisplaySizeMM());
4370 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4372 if (cc) cc->SetDisplaySizeMM(g_display_size_mm);
4376 g_pi_manager->SendBaseConfigToAllPlugIns();
4377 int rrt = rr & S52_CHANGED;
4378 g_pi_manager->SendS52ConfigToAllPlugIns(
4379 (rrt == S52_CHANGED) ||
4380 (g_last_ChartScaleFactor != g_ChartScaleFactor));
4383 if (g_MainToolbar) {
4384 g_MainToolbar->SetAutoHide(g_bAutoHideToolbar);
4385 g_MainToolbar->SetAutoHideTimer(g_nAutoHideToolbar);
4390 ps52plib->SetScaleFactorExp(g_Platform->GetChartScaleFactorExp(g_ChartScaleFactor));
4391 ps52plib-> SetScaleFactorZoomMod(g_chart_zoom_modifier_vector);
4395 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4397 if (cc) cc->ApplyGlobalSettings();
4404 int index_hint = ChartData->FinddbIndex( chart_file_name );
4405 if( -1 == index_hint )
4414 bool ztc = g_bEnableZoomToCursor;
4415 g_bEnableZoomToCursor =
4419 GetPrimaryCanvas()->DoZoomCanvas(1.0001);
4421 g_bEnableZoomToCursor = ztc;
4423 g_last_ChartScaleFactor = g_ChartScaleFactor;
4425 return b_need_refresh;
4428wxString MyFrame::GetGroupName(
int igroup) {
4429 ChartGroup *pGroup = g_pGroupArray->Item(igroup - 1);
4430 return pGroup->m_group_name;
4433bool MyFrame::CheckGroup(
int igroup) {
4434 if (igroup == 0)
return true;
4436 ChartGroup *pGroup = g_pGroupArray->Item(igroup - 1);
4438 if (!pGroup->m_element_array.size())
4441 for (
const auto &elem : pGroup->m_element_array) {
4442 for (
unsigned int ic = 0;
4443 ic < (
unsigned int)ChartData->GetChartTableEntries(); ic++) {
4445 wxString chart_full_path(pcte->GetpFullPath(), wxConvUTF8);
4447 if (chart_full_path.StartsWith(elem.m_element_name))
return true;
4454bool MyFrame::ScrubGroupArray() {
4459 bool b_change =
false;
4460 unsigned int igroup = 0;
4461 while (igroup < g_pGroupArray->GetCount()) {
4462 bool b_chart_in_element =
false;
4463 ChartGroup *pGroup = g_pGroupArray->Item(igroup);
4465 for (
unsigned int j = 0; j < pGroup->m_element_array.size(); j++) {
4466 const wxString &element_root = pGroup->m_element_array[j].m_element_name;
4468 for (
unsigned int ic = 0;
4469 ic < (
unsigned int)ChartData->GetChartTableEntries(); ic++) {
4471 wxString chart_full_path = pcte->GetFullSystemPath();
4473 if (chart_full_path.StartsWith(element_root)) {
4474 b_chart_in_element =
true;
4480 if (!b_chart_in_element) {
4481 wxString test_string = _T(
"GSHH");
4482 if (element_root.Upper().Contains(test_string))
4483 b_chart_in_element =
true;
4486 if (!b_chart_in_element)
4488 pGroup->m_element_array.erase(pGroup->m_element_array.begin() + j);
4500void MyFrame::RefreshCanvasOther(
ChartCanvas *ccThis) {
4502 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4504 if (cc && (cc != ccThis)) cc->Refresh();
4509void MyFrame::ChartsRefresh() {
4510 if (!ChartData)
return;
4512 OCPNPlatform::ShowBusySpinner();
4514 bool b_run = FrameTimer1.IsRunning();
4519 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4522 int currentIndex = cc->GetpCurrentStack()->GetCurrentEntrydbIndex();
4523 if (cc->GetQuiltMode()) {
4524 currentIndex = cc->GetQuiltReferenceChartIndex();
4526 cc->canvasChartsRefresh(currentIndex);
4530 if (b_run) FrameTimer1.Start(TIMER_GFRAME_1, wxTIMER_CONTINUOUS);
4532 OCPNPlatform::HideBusySpinner();
4535void MyFrame::InvalidateAllQuilts() {
4536 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4539 cc->InvalidateQuilt();
4540 cc->SetQuiltRefChart(-1);
4541 cc->m_singleChart = NULL;
4546bool MyFrame::UpdateChartDatabaseInplace(ArrayOfCDI &DirArray,
bool b_force,
4548 const wxString &ChartListFileName) {
4549 bool b_run = FrameTimer1.IsRunning();
4551 bool b_runCOGTimer = FrameCOGTimer.IsRunning();
4552 FrameCOGTimer.Stop();
4555 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4558 cc->InvalidateQuilt();
4559 cc->SetQuiltRefChart(-1);
4560 cc->m_singleChart = NULL;
4564 ChartData->PurgeCache();
4570 OCPNPlatform::ShowBusySpinner();
4572 wxGenericProgressDialog *pprog =
nullptr;
4574 wxString longmsg = _(
"OpenCPN Chart Update");
4576 _T(
"..................................................................")
4579 pprog = new wxGenericProgressDialog();
4581 wxFont *qFont = GetOCPNScaledFont(_("Dialog"));
4582 pprog->SetFont(*qFont);
4584 pprog->Create(_("OpenCPN Chart Update"), longmsg, 100, gFrame,
4585 wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
4586 wxPD_REMAINING_TIME);
4592 wxLogMessage(_T(" "));
4593 wxLogMessage(_T("Starting chart database Update..."));
4594 wxString gshhg_chart_loc = gWorldMapLocation;
4595 gWorldMapLocation = wxEmptyString;
4596 ChartData->Update(DirArray, b_force, pprog);
4597 ChartData->SaveBinary(ChartListFileName);
4598 wxLogMessage(_T("Finished chart database Update"));
4599 wxLogMessage(_T(" "));
4600 if (gWorldMapLocation.empty()) {
4604 gWorldMapLocation = gDefaultWorldMapLocation;
4605 gshhg_chart_loc = wxEmptyString;
4608 if (gWorldMapLocation != gshhg_chart_loc) {
4610 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4612 if (cc) cc->ResetWorldBackgroundChart();
4618 OCPNPlatform::HideBusySpinner();
4620 pConfig->UpdateChartDirs(DirArray);
4623 if (b_run) FrameTimer1.Start(TIMER_GFRAME_1, wxTIMER_CONTINUOUS);
4624 if (b_runCOGTimer) {
4626 int period_ms = 100;
4627 if (g_COGAvgSec > 0) period_ms = g_COGAvgSec * 1000;
4628 FrameCOGTimer.Start(period_ms, wxTIMER_CONTINUOUS);
4635 cc->ToggleCanvasQuiltMode();
4637 bool cur_mode = cc->GetQuiltMode();
4639 if( !cc->GetQuiltMode() )
4640 cc->SetQuiltMode(
true );
4642 if( cc->GetQuiltMode() ) {
4643 cc->SetQuiltMode(
false );
4644 g_sticky_chart = cc->GetQuiltReferenceChartIndex();
4648 if( cur_mode != cc->GetQuiltMode() ){
4654 g_bQuiltEnable = cc->GetQuiltMode();
4658 ps52plib->GenerateStateHash();
4663void MyFrame::ClearRouteTool() {
4664 if (g_MainToolbar->GetToolbar())
4665 g_MainToolbar->GetToolbar()->ToggleTool(ID_ROUTE,
false);
4667#ifdef __OCPN__ANDROID__
4668 androidSetRouteAnnunciator(
false);
4672void MyFrame::DoStackDown(
ChartCanvas *cc) { DoStackDelta(cc, -1); }
4674void MyFrame::DoStackUp(
ChartCanvas *cc) { DoStackDelta(cc, 1); }
4676void MyFrame::DoStackDelta(
ChartCanvas *cc,
int direction) {
4678 cc->DoCanvasStackDelta(direction);
4682void MyFrame::PositionIENCToolbar() {
4683 if (g_iENCToolbar) {
4685 posn.x = (GetPrimaryCanvas()->GetSize().x - g_iENCToolbar->GetSize().x) / 2;
4687 g_iENCToolbar->Move(GetPrimaryCanvas()->ClientToScreen(posn));
4694void MyFrame::OnInitTimer(wxTimerEvent &event) {
4697 msg.Printf(_T(
"OnInitTimer...%d"), m_iInitCount);
4700 wxLog::FlushActive();
4702 switch (m_iInitCount++) {
4704 if (g_MainToolbar) g_MainToolbar->EnableTool(ID_SETTINGS,
false);
4706 if (g_bInlandEcdis) {
4707 double range = GetPrimaryCanvas()->GetCanvasRangeMeters();
4708 double range_set = 500.;
4710 range = wxRound(range * 10) / 10.;
4714 else if (range > 2000.)
4716 else if (range > 1600.)
4718 else if (range > 1200.)
4720 else if (range > 800.)
4725 GetPrimaryCanvas()->SetCanvasRangeMeters(range_set);
4729 g_Platform->SetFullscreen(g_bFullscreen);
4732 if (g_bNeedDBUpdate) {
4733 RebuildChartDatabase();
4734 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4737 cc->SetGroupIndex(0,
false);
4745 if (ChartData->GetCentroidOfLargestScaleChart(&clat, &clon,
4746 CHART_FAMILY_RASTER)) {
4749 gFrame->ClearbFollow(gFrame->GetPrimaryCanvas());
4751 if (ChartData->GetCentroidOfLargestScaleChart(&clat, &clon,
4752 CHART_FAMILY_VECTOR)) {
4755 gFrame->ClearbFollow(gFrame->GetPrimaryCanvas());
4759 g_bNeedDBUpdate =
false;
4765 WayPointmanGui(*pWayPointMan).SetColorScheme(global_color_scheme,
4766 g_Platform->GetDisplayDPmm());
4768 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4771 if (cc->SetUserOwnship()) cc->SetColorScheme(global_color_scheme);
4775 pConfig->LoadNavObjects();
4777 if (!g_AW1GUID.IsEmpty()) {
4778 pAnchorWatchPoint1 = pWayPointMan->FindRoutePointByGUID(g_AW1GUID);
4780 if (!g_AW2GUID.IsEmpty()) {
4781 pAnchorWatchPoint2 = pWayPointMan->FindRoutePointByGUID(g_AW2GUID);
4785 wxString layerdir = g_Platform->GetPrivateDataDir();
4786 appendOSDirSlash(&layerdir);
4787 layerdir.Append(_T(
"layers"));
4789 if (wxDir::Exists(layerdir)) {
4791 laymsg.Printf(wxT(
"Getting .gpx layer files from: %s"),
4793 wxLogMessage(laymsg);
4794 pConfig->LoadLayers(layerdir);
4802 for (
size_t i = 0; i < TheConnectionParams()->Count(); i++) {
4805 auto driver = MakeCommDriver(cp);
4806 cp->b_IsSetup = TRUE;
4811 console->SetColorScheme(global_color_scheme);
4815 if (m_initializing)
break;
4816 m_initializing =
true;
4817 g_Platform->ShowBusySpinner();
4818 PluginLoader::getInstance()->LoadAllPlugIns(
true);
4819 g_Platform->HideBusySpinner();
4821 RequestNewMasterToolbar();
4824 if (pWayPointMan)
WayPointmanGui(*pWayPointMan).ReloadRoutepointIcons();
4826 if (g_MainToolbar) g_MainToolbar->EnableTool(ID_SETTINGS,
false);
4828 wxString perspective;
4829 pConfig->SetPath(_T (
"/AUI" ));
4830 pConfig->Read(_T (
"AUIPerspective" ), &perspective);
4837 bool bno_load =
false;
4839 wxArrayString name_array;
4840 wxStringTokenizer st(perspective, _T(
"|;"));
4841 while (st.HasMoreTokens()) {
4842 wxString s1 = st.GetNextToken();
4843 if (s1.StartsWith(_T(
"name="))) {
4844 wxString sc = s1.AfterFirst(
'=');
4849 wxAuiPaneInfoArray pane_array_val = g_pauimgr->GetAllPanes();
4850 for (
unsigned int i = 0; i < pane_array_val.GetCount(); i++) {
4851 wxAuiPaneInfo pane = pane_array_val.Item(i);
4855 if (name_array.Index(pane.name) == wxNOT_FOUND) {
4861 if (!bno_load) g_pauimgr->LoadPerspective(perspective,
false);
4865 for(
unsigned int i=0 ; i < g_canvasArray.GetCount() ; i++){
4868 g_pauimgr->GetPane(cc).MinSize(10,10);
4875 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4878 wxSize frameSize = GetClientSize();
4879 wxSize minSize = g_pauimgr->GetPane(cc).min_size;
4880 int width = wxMax(minSize.x, frameSize.x / 10);
4881 g_pauimgr->GetPane(cc).MinSize(frameSize.x * 1 / 5, frameSize.y);
4884 g_pauimgr->Update();
4888 g_pi_manager->NotifyAuiPlugIns();
4891 g_pi_manager ->ShowDeferredBlacklistMessages();
4893 g_pi_manager->CallLateInit();
4898 if (g_pi_manager->IsAnyPlugInChartEnabled()) {
4899 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
4901 if (cc) cc->SetFirstAuto(
true);
4904 b_reloadForPlugins =
true;
4911 if (g_MainToolbar) {
4912 g_MainToolbar->SetAutoHide(g_bAutoHideToolbar);
4913 g_MainToolbar->SetAutoHideTimer(g_nAutoHideToolbar);
4919 for(
unsigned int i=0 ; i < g_canvasArray.GetCount() ; i++){
4921 cc->RequestNewCanvasToolbar(
true );
4923 if(cc && cc->GetToolbarEnable()){
4924 cc->GetToolbar()->SetAutoHide(g_bAutoHideToolbar);
4925 cc->GetToolbar()->SetAutoHideTimer(g_nAutoHideToolbar);
4935 pConfig->SetPath(
"/Settings");
4936 pConfig->Read(
"OptionsSizeX", &sx, -1);
4937 pConfig->Read(
"OptionsSizeY", &sy, -1);
4940 new options(
this, -1, _(
"Options"), wxPoint(-1, -1), wxSize(sx, sy));
4945 BuildiENCToolbar(
true);
4951 if (!g_params.empty()) {
4952 for (
size_t n = 0; n < g_params.size(); n++) {
4953 wxString path = g_params[n];
4954 if (::wxFileExists(path)) {
4956 pSet->load_file(path.fn_str());
4959 pSet->LoadAllGPXObjects(
4960 !pSet->IsOpenCPN(), wpt_dups,
4962 LLBBox box = pSet->GetBBox();
4963 if (box.GetValid()) {
4964 CenterView(GetPrimaryCanvas(), box);
4973 InitAppMsgBusListener();
4980 wxLogMessage(_T(
"OnInitTimer...Last Call"));
4982 PositionIENCToolbar();
4984 g_bDeferredInitDone =
true;
4986 GetPrimaryCanvas()->SetFocus();
4987 g_focusCanvas = GetPrimaryCanvas();
4989#ifndef __OCPN__ANDROID__
4993 if (b_reloadForPlugins) {
4998 wxLogMessage(_T(
"OnInitTimer...Finalize Canvases"));
5000 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5004 cc->CheckGroupValid();
5008#ifdef __OCPN__ANDROID__
5009 androidEnableBackButton(
true);
5010 androidEnableRotation();
5011 androidEnableOptionItems(
true);
5015 if (g_MainToolbar) g_MainToolbar->EnableTool(ID_SETTINGS,
true);
5025 if (!g_bDeferredInitDone) InitTimer.Start(100, wxTIMER_ONE_SHOT);
5027 wxLog::FlushActive();
5029 RefreshAllCanvas(
true);
5035void MyFrame::InitAppMsgBusListener() {
5036 auto &msgbus = AppMsgBus::GetInstance();
5039 AppMsg msg_basic(AppMsg::Type::BasicNavData);
5040 listener_basic_navdata.
Listen(msg_basic,
this, EVT_BASIC_NAV_DATA);
5043 auto ptr = ev.GetSharedPtr();
5044 auto basicnav_msg = std::static_pointer_cast<const BasicNavDataMsg>(ptr);
5045 HandleBasicNavMsg( basicnav_msg );
5049 AppMsg msg_watchdog(AppMsg::Type::GPSWatchdog);
5050 listener_gps_watchdog.
Listen(msg_watchdog,
this, EVT_GPS_WATCHDOG);
5053 auto ptr = ev.GetSharedPtr();
5054 auto msg = std::static_pointer_cast<const GPSWatchdogMsg>(ptr);
5055 HandleGPSWatchdogMsg(msg);
5060void MyFrame::HandleGPSWatchdogMsg(std::shared_ptr<const GPSWatchdogMsg> msg) {
5062 if (msg->gps_watchdog <= 0){
5063 if (msg->wd_source == GPSWatchdogMsg::WDSource::position){
5064 bool last_bGPSValid = bGPSValid;
5067 if (last_bGPSValid != bGPSValid) UpdateGPSCompassStatusBoxes(
true);
5069 else if (msg->wd_source == GPSWatchdogMsg::WDSource::velocity){
5070 bool last_bVelocityValid = bVelocityValid;
5071 bVelocityValid =
false;
5078void MyFrame::HandleBasicNavMsg(std::shared_ptr<const BasicNavDataMsg> msg) {
5079 m_fixtime = msg->time;
5082 if (!std::isnan(gCog)) {
5083 if (g_COGAvgSec > 0) {
5085 for (
int i = g_COGAvgSec - 1; i > 0; i--) COGTable[i] = COGTable[i - 1];
5088 double sum = 0., count = 0;
5089 for (
int i = 0; i < g_COGAvgSec; i++) {
5090 double adder = COGTable[i];
5091 if (std::isnan(adder))
continue;
5093 if (fabs(adder - g_COGAvg) > 180.) {
5094 if ((adder - g_COGAvg) > 0.)
5107 else if (sum >= 360.)
5119 if (gSog > 3.0) g_bCruising =
true;
5123 m_b_new_data =
true;
5124 bool last_bGPSValid = bGPSValid;
5126 if (last_bGPSValid != bGPSValid) UpdateGPSCompassStatusBoxes(
true);
5128 bVelocityValid =
true;
5132#ifdef ocpnUPDATE_SYSTEM_TIME
5136 if (!m_bTimeIsSet) {
5137 if (!s_bSetSystemTime) {
5138 m_bTimeIsSet =
true;
5141 wxDateTime Fix_Time(wxDateTime::Now());
5143 if (6 == sfixtime.Len() ||
5144 6 == sfixtime.find(
'.')) {
5147 a = sfixtime.Mid(0, 2);
5148 if (a.ToLong(&b)) Fix_Time.SetHour((wxDateTime::wxDateTime_t)b);
5149 a = sfixtime.Mid(2, 2);
5150 if (a.ToLong(&b)) Fix_Time.SetMinute((wxDateTime::wxDateTime_t)b);
5151 a = sfixtime.Mid(4, 2);
5152 if (a.ToLong(&b)) Fix_Time.SetSecond((wxDateTime::wxDateTime_t)b);
5156 time_t TimeOff = Fix_Time.GetTicks() - wxDateTime::Now().GetTicks();
5158 if (g_bHasHwClock) {
5161 if ((abs(TimeOff) > 20) && (abs(TimeOff) < 7200)) {
5163 msg.Printf(_T(
"Setting system time, delta t is %d seconds"), TimeOff);
5167 Fix_Time = Fix_Time.ToGMT();
5170 const wxDateTime::Tm tm(Fix_Time.GetTm());
5172 stm.wYear = (WXWORD)tm.year;
5173 stm.wMonth = (WXWORD)(tm.mon - wxDateTime::Jan + 1);
5176 stm.wHour = Fix_Time.GetHour();
5177 stm.wMinute = tm.min;
5178 stm.wSecond = tm.sec;
5179 stm.wMilliseconds = 0;
5181 ::SetSystemTime(&stm);
5187 wxString CommandStr(
"sudo /bin/date +%T --utc --set=\"");
5188 CommandStr.Append(Fix_Time.Format(
"%T"));
5189 CommandStr.Append(
"\"");
5190 msg.Printf(_T(
"Linux command is:"));
5193 wxExecute(CommandStr, wxEXEC_ASYNC);
5196 m_bTimeIsSet =
true;
5198 if (gRmcDate.Len() == 6) {
5199#if !defined(__WXMSW__)
5202 Fix_Time.SetMonth((wxDateTime::Month)2);
5203 a = gRmcDate.Mid(0, 2);
5204 if (a.ToLong(&b)) Fix_Time.SetDay(b);
5205 a = gRmcDate.Mid(2, 2);
5206 if (a.ToLong(&b)) Fix_Time.SetMonth((wxDateTime::Month)(b - 1));
5207 a = gRmcDate.Mid(4, 2);
5209 Fix_Time.SetYear(b + 2000);
5211 wxString CommandStr(
"sudo /bin/date --utc --set=\"");
5212 CommandStr.Append(Fix_Time.Format(
"%D %T\""));
5213 msg.Printf(_T(
"Set Date/Time, Linux command is: %s"), CommandStr);
5215 wxExecute(CommandStr, wxEXEC_ASYNC);
5217 m_bTimeIsSet =
true;
5226void MyFrame::UpdateStatusBar() {
5229 unsigned long uiCurrentTickCount;
5230 m_MMEAeventTime.SetToCurrent();
5231 uiCurrentTickCount =
5232 m_MMEAeventTime.GetMillisecond() / 100;
5233 uiCurrentTickCount += m_MMEAeventTime.GetTicks() * 10;
5234 if (uiCurrentTickCount > m_ulLastNMEATicktime + 1) {
5235 m_ulLastNMEATicktime = uiCurrentTickCount;
5237 if (m_tick_idx++ > 6) m_tick_idx = 0;
5242 if (NULL != GetStatusBar()) {
5245 tick_buf[0] = nmea_tick_chars[m_tick_idx];
5248 wxString s1(tick_buf, wxConvUTF8);
5250 s1 += toSDMM(1, gLat);
5252 s1 += toSDMM(2, gLon);
5254 if (STAT_FIELD_TICK >= 0) SetStatusText(s1, STAT_FIELD_TICK);
5258 if (!std::isnan(gSog))
5259 sogcog.Printf(_T(
"SOG %2.2f ") + getUsrSpeedUnit() + _T(
" "),
5262 sogcog.Printf(_T(
"SOG --- "));
5266 if (!std::isnan(gCog) && !std::isnan(gSog) && (gSog > 0)) {
5268 cogs << wxString::Format(wxString(
"COG %03d%c "), (
int)gCog, 0x00B0);
5270 cogs << wxString::Format(wxString(
"COG %03d%c(M) "), (
int)GetMag(gCog),
5273 cogs.Printf((
"COG ---%c"), 0x00B0);
5275 sogcog.Append(cogs);
5276 SetStatusText(sogcog, STAT_FIELD_SOGCOG);
5283void MyFrame::OnMemFootTimer(wxTimerEvent &event) {
5284 MemFootTimer.Stop();
5286 int memsize = GetApplicationMemoryUse();
5289 printf(
"Memsize: %d \n", memsize);
5292 if (memsize > (g_MemFootMB * 1000)) {
5294 if (ChartData && cc) {
5296 wxArrayPtrVoid *pCache = ChartData->GetChartCache();
5297 unsigned int nCache = pCache->GetCount();
5300 for (
unsigned int i = 0; i < nCache; i++) {
5310 for (
unsigned int i = 0; i < nCache - 1; i++) {
5311 if (pcea[i].RecentTime > pcea[i + 1].RecentTime) {
5313 pcea[i] = pcea[i + 1];
5324 unsigned int idelete = 0;
5325 unsigned int idelete_max = pCache->GetCount();
5328 unsigned int minimum_cache = 1;
5329 if (cc->GetQuiltMode()) minimum_cache = cc->GetQuiltChartCount();
5331 while ((memsize > (g_MemFootMB * 1000)) &&
5332 (pCache->GetCount() > minimum_cache) &&
5333 (idelete < idelete_max)) {
5334 int memsizeb = memsize;
5336 ChartData->DeleteCacheChart((
ChartBase *)pcea[idelete].pChart);
5338 memsize = GetApplicationMemoryUse();
5339 printf(
"delete, before: %d after: %d\n", memsizeb, memsize);
5347 MemFootTimer.Start(9000, wxTIMER_CONTINUOUS);
5352void MyFrame::CheckToolbarPosition() {
5355 static bool bMaximized;
5357 if (IsMaximized() && !bMaximized) {
5359 if (g_MainToolbar) {
5360 g_MainToolbar->SetYAuxOffset(g_MainToolbar->GetToolSize().y * 15 / 10);
5361 g_MainToolbar->SetDefaultPosition();
5362 g_MainToolbar->Realize();
5364 PositionIENCToolbar();
5365 }
else if (!IsMaximized() && bMaximized) {
5367 if (g_MainToolbar) {
5368 g_MainToolbar->SetYAuxOffset(0);
5369 g_MainToolbar->SetDockY(-1);
5370 g_MainToolbar->SetDefaultPosition();
5371 g_MainToolbar->Realize();
5373 PositionIENCToolbar();
5379 CheckToolbarPosition();
5381 if (!g_bPauseTest && (g_unit_test_1 || g_unit_test_2)) {
5388 cc->m_bFollow =
false;
5389 if (g_MainToolbar && g_MainToolbar->GetToolbar())
5390 g_MainToolbar->GetToolbar()->ToggleTool(ID_FOLLOW, cc->m_bFollow);
5391 int ut_index_max = ((g_unit_test_1 > 0) ? (g_unit_test_1 - 1) : INT_MAX);
5394 if (cc->m_groupIndex > 0) {
5395 while (ut_index < ChartData->GetChartTableEntries() &&
5396 !ChartData->IsChartInGroup(ut_index, cc->m_groupIndex)) {
5400 if (ut_index < ChartData->GetChartTableEntries()) {
5402 const ChartTableEntry *cte = &ChartData->GetChartTableEntry(ut_index);
5404 double clat = (cte->GetLatMax() + cte->GetLatMin()) / 2;
5405 double clon = (cte->GetLonMax() + cte->GetLonMin()) / 2;
5410 cc->SetViewPoint(clat, clon);
5412 if (cc->GetQuiltMode()) {
5413 if (cc->IsChartQuiltableRef(ut_index))
5414 cc->SelectQuiltRefdbChart(ut_index);
5416 cc->SelectdbChart(ut_index);
5419 if (g_unit_test_1) {
5420 ppm = cc->GetCanvasScaleFactor() / cte->GetScale();
5427 DistanceBearingMercator(cte->GetLatMin(), cte->GetLonMin(),
5428 cte->GetLatMin(), cte->GetLonMax(), NULL,
5432 DistanceBearingMercator(cte->GetLatMin(), cte->GetLonMin(),
5433 cte->GetLatMax(), cte->GetLonMin(), NULL,
5436 cc->GetSize(&ww, &wh);
5437 ppm = wxMin(ww / (rw * 1852), wh / (rh * 1852)) * (100 - fabs(clat)) /
5439 ppm = wxMin(ppm, 1.0);
5441 cc->SetVPScale(ppm);
5446 if (ut_index > ut_index_max) exit(0);
5456 wxLogMessage(_T(
"Got quitflag from SIGNAL"));
5462 if (bDBUpdateInProgress)
return;
5468 if (g_bDeferredStartTrack) {
5469 if (!g_bTrackActive) {
5472 g_bDeferredStartTrack =
false;
5475 g_bDeferredStartTrack =
false;
5483 GPSData.kLat = gLat;
5484 GPSData.kLon = gLon;
5485 GPSData.kCog = gCog;
5486 GPSData.kSog = gSog;
5487 GPSData.kVar = gVar;
5488 GPSData.kHdm = gHdm;
5489 GPSData.kHdt = gHdt;
5490 GPSData.nSats = g_SatsInView;
5492 wxDateTime tCheck((time_t)m_fixtime);
5494 if (tCheck.IsValid())
5495 GPSData.FixTime = m_fixtime;
5497 GPSData.FixTime = wxDateTime::Now().GetTicks();
5499 g_pi_manager->SendPositionFixToAllPlugIns(&GPSData);
5504 if (pAnchorWatchPoint1) {
5507 DistanceBearingMercator(pAnchorWatchPoint1->m_lat,
5508 pAnchorWatchPoint1->m_lon, gLat, gLon, &brg, &dist);
5509 double d = g_nAWMax;
5510 (pAnchorWatchPoint1->GetName()).ToDouble(&d);
5511 d = AnchorDistFix(d, AnchorPointMinDist, g_nAWMax);
5512 bool toofar =
false;
5513 bool tooclose =
false;
5514 if (d >= 0.0) toofar = (dist * 1852. > d);
5515 if (d < 0.0) tooclose = (dist * 1852 < -d);
5517 if (tooclose || toofar)
5518 AnchorAlertOn1 =
true;
5520 AnchorAlertOn1 =
false;
5522 AnchorAlertOn1 =
false;
5524 if (pAnchorWatchPoint2) {
5527 DistanceBearingMercator(pAnchorWatchPoint2->m_lat,
5528 pAnchorWatchPoint2->m_lon, gLat, gLon, &brg, &dist);
5530 double d = g_nAWMax;
5531 (pAnchorWatchPoint2->GetName()).ToDouble(&d);
5532 d = AnchorDistFix(d, AnchorPointMinDist, g_nAWMax);
5533 bool toofar =
false;
5534 bool tooclose =
false;
5535 if (d >= 0) toofar = (dist * 1852. > d);
5536 if (d < 0) tooclose = (dist * 1852 < -d);
5538 if (tooclose || toofar)
5539 AnchorAlertOn2 =
true;
5541 AnchorAlertOn2 =
false;
5543 AnchorAlertOn2 =
false;
5545 if ((pAnchorWatchPoint1 || pAnchorWatchPoint2) && !bGPSValid)
5546 AnchorAlertOn1 =
true;
5551 wxDateTime lognow = wxDateTime::Now();
5552 int hourLOC = lognow.GetHour();
5553 int minuteLOC = lognow.GetMinute();
5555 int minuteUTC = lognow.GetMinute();
5556 int second = lognow.GetSecond();
5558 wxTimeSpan logspan = lognow.Subtract(g_loglast_time);
5559 if ((logspan.IsLongerThan(wxTimeSpan(0, 30, 0, 0))) || (minuteUTC == 0) ||
5560 (minuteUTC == 30)) {
5561 if (logspan.IsLongerThan(wxTimeSpan(0, 1, 0, 0))) {
5562 wxString day = lognow.FormatISODate();
5563 wxString utc = lognow.FormatISOTime();
5564 wxString navmsg = _T(
"LOGBOOK: ");
5568 navmsg += _T(
" UTC ");
5572 data.Printf(_T(
" GPS Lat %10.5f Lon %10.5f "), gLat, gLon);
5576 if (std::isnan(gCog))
5577 cog.Printf(_T(
"COG ----- "));
5579 cog.Printf(_T(
"COG %10.5f "), gCog);
5582 if (std::isnan(gSog))
5583 sog.Printf(_T(
"SOG ----- "));
5585 sog.Printf(_T(
"SOG %6.2f ") + getUsrSpeedUnit(), toUsrSpeed(gSog));
5591 data.Printf(_T(
" DR Lat %10.5f Lon %10.5f"), gLat, gLon);
5594 wxLogMessage(navmsg);
5595 g_loglast_time = lognow;
5597 int bells = (hourLOC % 4) * 2;
5598 if (minuteLOC != 0) bells++;
5599 if (!bells) bells = 8;
5601 if (g_bPlayShipsBells && ((minuteLOC == 0) || (minuteLOC == 30))) {
5602 m_BellsToPlay = bells;
5603 wxCommandEvent ev(BELLS_PLAYED_EVTYPE);
5604 wxPostEvent(
this, ev);
5609 if (ShouldRestartTrack()) TrackDailyRestart();
5612 if (g_bSleep && !AnchorAlertOn1 && !AnchorAlertOn2) {
5613 FrameTimer1.Start(TIMER_GFRAME_1, wxTIMER_CONTINUOUS);
5621 wxString sogcog(_T(
"SOG --- ") + getUsrSpeedUnit() + +_T(
" ") +
5622 _T(
" COG ---\u00B0"));
5623 if (GetStatusBar()) SetStatusText(sogcog, STAT_FIELD_SOGCOG);
5631#if !defined(__WXGTK__) && !defined(__WXQT__)
5633 double cursor_lat, cursor_lon;
5634 GetPrimaryCanvas()->GetCursorLatLon( &cursor_lat, &cursor_lon );
5635 GetPrimaryCanvas()->SetCursorStatus(cursor_lat, cursor_lon);
5641 bool bnew_view =
false;
5645 if ( (0 != g_ChartUpdatePeriod)) {
5646 if (0 == m_ChartUpdatePeriod--) {
5647 bnew_view = DoChartUpdate();
5648 m_ChartUpdatePeriod = g_ChartUpdatePeriod;
5656 bool bactiveRouteUpdate =
RoutemanGui(*g_pRouteMan).UpdateProgress();
5659 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5662 cc->DrawBlinkObjects();
5665 if (bactiveRouteUpdate) {
5667 if (g_pRouteMan->GetpActiveRoute())
5668 cc->RefreshRect(g_blink_rect,
false);
5672 cc->SetOwnShipState(SHIP_NORMAL);
5674 if (cc->GetQuiltMode()) {
5675 double erf = cc->GetQuiltMaxErrorFactor();
5676 if (erf > 0.02) cc->SetOwnShipState(SHIP_LOWACCURACY);
5678 if (cc->m_singleChart) {
5679 if (cc->m_singleChart->GetChart_Error_Factor() > 0.02)
5680 cc->SetOwnShipState(SHIP_LOWACCURACY);
5684 if (!bGPSValid) cc->SetOwnShipState(SHIP_INVALID);
5686 if ((bGPSValid != m_last_bGPSValid) ||
5687 (bVelocityValid != m_last_bVelocityValid)) {
5688 if (!g_bopengl) cc->UpdateShips();
5695 m_last_bGPSValid = bGPSValid;
5696 m_last_bVelocityValid = bVelocityValid;
5700 bool brq_dynamic =
false;
5702 auto *pplugin_array = PluginLoader::getInstance()->GetPlugInArray();
5703 for (
unsigned int i = 0; i < pplugin_array->GetCount(); i++) {
5705 if (pic->m_bEnabled && pic->m_bInitState) {
5706 if (pic->m_cap_flag & WANTS_DYNAMIC_OPENGL_OVERLAY_CALLBACK) {
5713 if (brq_dynamic) bnew_view =
true;
5717 if (AnchorAlertOn1 || AnchorAlertOn2) bnew_view =
true;
5720 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5725 if (cc->GetglCanvas()) {
5726 if (m_fixtime - cc->GetglCanvas()->m_last_render_time > 0)
5730 if (AnyAISTargetsOnscreen(cc, cc->GetVP())) bnew_view =
true;
5743 if ((!cc->m_bFollow) || (cc->GetUpMode() != NORTH_UP_MODE)) {
5757 if (g_pais_query_dialog_active && g_pais_query_dialog_active->IsShown())
5758 g_pais_query_dialog_active->UpdateText();
5761 if (g_pAISTargetList && (0 == (g_tick % (5))))
5762 g_pAISTargetList->UpdateAISTargetList();
5765 UpdateGPSCompassStatusBoxes();
5768 if (console && console->IsShown()) {
5770 console->RefreshConsoleData();
5777 if (m_bdefer_resize) {
5778 if (0 == (g_tick % (5))) {
5779 printf(
"___RESIZE\n");
5780 SetSize(m_defer_size);
5781 g_pauimgr->Update();
5782 m_bdefer_resize =
false;
5786#ifdef __OCPN__ANDROID__
5790 if (((g_tick % g_FlushNavobjChangesTimeout) == 0) || g_FlushNavobjChanges) {
5791 if (pConfig && pConfig->IsChangesFileDirty()) {
5792 androidShowBusyIcon();
5793 wxStopWatch update_sw;
5794 pConfig->UpdateNavObj(
true);
5795 wxString msg = wxString::Format(
5796 _T(
"OpenCPN periodic navobj update took %ld ms."), update_sw.Time());
5798 qDebug() << msg.mb_str();
5799 g_FlushNavobjChanges =
false;
5800 androidHideBusyIcon();
5807 m_b_new_data =
false;
5810 FrameTimer1.Start(TIMER_GFRAME_1 * 3, wxTIMER_CONTINUOUS);
5812 FrameTimer1.Start(TIMER_GFRAME_1, wxTIMER_CONTINUOUS);
5815double MyFrame::GetMag(
double a) {
5816 if (!std::isnan(gVar)) {
5817 if ((a - gVar) > 360.)
5818 return (a - gVar - 360.);
5820 return ((a - gVar) >= 0.) ? (a - gVar) : (a - gVar + 360.);
5822 if ((a - g_UserVar) > 360.)
5823 return (a - g_UserVar - 360.);
5825 return ((a - g_UserVar) >= 0.) ? (a - g_UserVar) : (a - g_UserVar + 360.);
5829double MyFrame::GetMag(
double a,
double lat,
double lon) {
5830 double Variance = std::isnan(gVar) ? g_UserVar : gVar;
5831 auto loader = PluginLoader::getInstance();
5832 if (loader && loader->IsPlugInAvailable(_T(
"WMM"))) {
5839 wxDateTime now = wxDateTime::Now();
5840 SendJSON_WMM_Var_Request(lat, lon, now);
5841 if (fabs(gQueryVar) < 360.0)
5842 Variance = gQueryVar;
5844 if ((a - Variance) > 360.)
5845 return (a - Variance - 360.);
5847 return ((a - Variance) >= 0.) ? (a - Variance) : (a - Variance + 360.);
5850bool MyFrame::SendJSON_WMM_Var_Request(
double lat,
double lon,
5856 v[_T(
"Year")] = date.GetYear();
5857 v[_T(
"Month")] = date.GetMonth();
5858 v[_T(
"Day")] = date.GetDay();
5860 g_pi_manager->SendJSONMessageToAllPlugins(_T(
"WMM_VARIATION_REQUEST"), v);
5866void MyFrame::TouchAISActive(
void) {
5868 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5870 if (cc) cc->TouchAISToolActive();
5874void MyFrame::UpdateAISTool(
void) {
5875 if (!g_pAIS)
return;
5878 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5880 if (cc) cc->UpdateAISTBTool();
5885void MyFrame::OnFrameTCTimer(wxTimerEvent &event) {
5887 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5889 if (cc) cc->SetbTCUpdate(
true);
5892 RefreshAllCanvas(
false);
5897void MyFrame::OnFrameCOGTimer(wxTimerEvent &event) {
5899 bool b_rotate =
false;
5900 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5902 if (cc) b_rotate |= (cc->GetUpMode() != NORTH_UP_MODE);
5906 FrameCOGTimer.Stop();
5913 int period_ms = 100;
5915 FrameCOGTimer.Start(period_ms, wxTIMER_CONTINUOUS);
5918void MyFrame::DoCOGSet(
void) {
5920 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5922 if (cc) cc->DoCanvasCOGSet();
5926void RenderShadowText(wxDC *pdc, wxFont *pFont, wxString &str,
int x,
int y) {
5932 wxFont oldfont = pdc->GetFont();
5934 pdc->SetFont(*pFont);
5935 pdc->SetTextForeground(GetGlobalColor(_T(
"CHGRF")));
5936 pdc->SetBackgroundMode(wxTRANSPARENT);
5938 pdc->DrawText(str, x, y + 1);
5939 pdc->DrawText(str, x, y - 1);
5940 pdc->DrawText(str, x + 1, y);
5941 pdc->DrawText(str, x - 1, y);
5943 pdc->SetTextForeground(GetGlobalColor(_T(
"CHBLK")));
5945 pdc->DrawText(str, x, y);
5947 pdc->SetFont(oldfont);
5951void MyFrame::UpdateRotationState(
double rotation) {
5953 g_bCourseUp =
false;
5955 if (fabs(rotation) > .001) {
5956 SetMenubarItemState(ID_MENU_CHART_COGUP,
false);
5957 SetMenubarItemState(ID_MENU_CHART_NORTHUP,
true);
5959 m_pMenuBar->SetLabel(ID_MENU_CHART_NORTHUP, _(
"Rotated Mode"));
5962 SetMenubarItemState(ID_MENU_CHART_COGUP, g_bCourseUp);
5963 SetMenubarItemState(ID_MENU_CHART_NORTHUP, !g_bCourseUp);
5965 m_pMenuBar->SetLabel(ID_MENU_CHART_NORTHUP, _(
"North Up Mode"));
5969 UpdateGPSCompassStatusBoxes(
true);
5973void MyFrame::UpdateGPSCompassStatusBoxes(
bool b_force_new) {
5975 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
5977 if (cc) cc->UpdateGPSCompassStatusBox(b_force_new);
5983int MyFrame::GetApplicationMemoryUse(
void) {
5989 wxWindow *fWin = wxWindow::FindFocus();
5991 wxArrayString outputArray;
5992 wxString cmd(_T(
"ps --no-headers -o vsize "));
5993 unsigned long pid = wxGetProcessId();
5995 cmd1.Printf(_T(
"%ld"), pid);
5997 wxExecute(cmd, outputArray);
5999 if (outputArray.GetCount()) {
6000 wxString s = outputArray.Item(0);
6002 if (s.ToLong(&vtmp)) memsize = vtmp;
6005 if (fWin) fWin->SetFocus();
6011 PROCESS_MEMORY_COUNTERS pmc;
6013 unsigned long processID = wxGetProcessId();
6015 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,
6017 if (NULL == hProcess)
return 0;
6019 if (GetProcessMemoryInfo(hProcess, &pmc,
sizeof(pmc))) {
6037 memsize = pmc.WorkingSetSize / 1024;
6040 CloseHandle(hProcess);
6047double MyFrame::GetBestVPScale(
ChartBase *pchart) {
6048 return GetPrimaryCanvas()->GetBestVPScale(pchart);
6051void MyFrame::SetChartUpdatePeriod() {
6054 g_ChartUpdatePeriod = 0;
6059 bool bskewdc =
false;
6060 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6063 if (!g_bopengl && !cc->GetVP().b_quilt) {
6064 if (fabs(cc->GetVP().skew) > 0.0001) bskewdc =
true;
6066 if (cc->m_bFollow) g_ChartUpdatePeriod = 1;
6070 if (bskewdc) g_ChartUpdatePeriod = g_SkewCompUpdatePeriod;
6072 m_ChartUpdatePeriod = g_ChartUpdatePeriod;
6077 cc->UpdateCanvasControlBar();
6080void MyFrame::selectChartDisplay(
int type,
int family) {
6082 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6084 if (cc) cc->selectCanvasChartDisplay(type, family);
6087 UpdateGlobalMenuItems();
6096bool MyFrame::DoChartUpdate(
void) {
6097 bool return_val =
false;
6100 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6102 if (cc) return_val |= cc->DoCanvasUpdate();
6108void MyFrame::MouseEvent(wxMouseEvent &event) {
6110 event.GetPosition(&x, &y);
6115#include <mach/mach.h>
6116#include <mach/message.h>
6117#include <mach/kern_return.h>
6118#include <mach/task_info.h>
6120#include <malloc/malloc.h>
6127#if defined(__linux__)
6128#include "sys/types.h"
6129#include "sys/sysinfo.h"
6132int g_lastMemTick = -1;
6136bool GetMemoryStatus(
int *mem_total,
int *mem_used) {
6137#ifdef __OCPN__ANDROID__
6138 return androidGetMemoryStatus(mem_total, mem_used);
6141#if defined(__linux__)
6145 struct sysinfo sys_info;
6146 if (sysinfo(&sys_info) != -1)
6147 *mem_total = ((uint64_t)sys_info.totalram * sys_info.mem_unit) / 1024;
6161 FILE *file = fopen(
"/proc/self/statm",
"r");
6163 if (fscanf(file,
"%d", mem_used) != 1) {
6164 wxLogWarning(
"Cannot parse /proc/self/statm (!)");
6177 PROCESS_MEMORY_COUNTERS pmc;
6179 unsigned long processID = wxGetProcessId();
6182 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,
6185 if (hProcess && GetProcessMemoryInfo(hProcess, &pmc,
sizeof(pmc))) {
6203 *mem_used = pmc.WorkingSetSize / 1024;
6206 CloseHandle(hProcess);
6210 MEMORYSTATUSEX statex;
6212 statex.dwLength =
sizeof(statex);
6214 GlobalMemoryStatusEx(&statex);
6232 *mem_total = statex.ullTotalPhys / 1024;
6239 if (g_tick != g_lastMemTick) {
6240 malloc_zone_pressure_relief(NULL, 0);
6243 int blocksInUse = 0;
6244 int sizeAllocated = 0;
6246 malloc_statistics_t stats;
6247 stats.blocks_in_use = 0;
6248 stats.size_in_use = 0;
6249 stats.max_size_in_use = 0;
6250 stats.size_allocated = 0;
6251 malloc_zone_statistics(NULL, &stats);
6252 bytesInUse += stats.size_in_use;
6253 blocksInUse += stats.blocks_in_use;
6254 sizeAllocated += stats.size_allocated;
6256 g_memUsed = sizeAllocated >> 10;
6259 g_lastMemTick = g_tick;
6262 if (mem_used) *mem_used = g_memUsed;
6265 FILE *fpIn = popen(
"sysctl -n hw.memsize",
"r");
6267 double pagesUsed = 0.0, totalPages = 0.0;
6269 if (fgets(buf,
sizeof(buf), fpIn) != NULL) {
6270 *mem_total = atol(buf) >> 10;
6278 if (mem_used) *mem_used = 0;
6279 if (mem_total) *mem_total = 0;
6283void MyFrame::DoPrint(
void) {
6284 if (NULL == g_printData) {
6285 g_printData =
new wxPrintData;
6286 g_printData->SetOrientation(wxLANDSCAPE);
6287 g_pageSetupData =
new wxPageSetupDialogData;
6290 wxPrintDialogData printDialogData(*g_printData);
6291 printDialogData.EnablePageNumbers(
false);
6293 wxPrinter printer(&printDialogData);
6300 if (g_bopengl) printout.GenerateGLbmp();
6302 if (!printer.Print(
this, &printout,
true)) {
6303 if (wxPrinter::GetLastError() == wxPRINTER_ERROR)
6304 OCPNMessageBox(NULL,
6305 _(
"There was a problem printing.\nPerhaps your current "
6306 "printer is not set correctly?"),
6307 _T(
"OpenCPN"), wxOK);
6311 (*g_printData) = printer.GetPrintDialogData().GetPrintData();
6333 GetPrimaryCanvas()->SetFocus();
6338wxDateTime gTimeSource;
6341 wxString message_ID =
event.GetID();
6342 wxString message_JSONText =
event.GetJSONText();
6350 if (message_ID == _T(
"WMM_VARIATION_BOAT")) {
6354 wxJSONReader reader;
6358 int numErrors = reader.Parse(message_JSONText, &root);
6359 if (numErrors > 0) {
6365 wxString decl = root[_T(
"Decl")].AsString();
6367 decl.ToDouble(&decl_val);
6373 if (message_ID == _T(
"WMM_VARIATION")) {
6377 wxJSONReader reader;
6381 int numErrors = reader.Parse(message_JSONText, &root);
6382 if (numErrors > 0) {
6388 wxString decl = root[_T(
"Decl")].AsString();
6390 decl.ToDouble(&decl_val);
6392 gQueryVar = decl_val;
6395 if (message_ID == _T(
"GRIB_TIMELINE")) {
6398 r.Parse(message_JSONText, &v);
6399 if (v[_T(
"Day")].AsInt() == -1)
6400 gTimeSource = wxInvalidDateTime;
6402 gTimeSource.Set(v[_T(
"Day")].AsInt(),
6403 (wxDateTime::Month)v[_T(
"Month")].AsInt(),
6404 v[_T(
"Year")].AsInt(), v[_T(
"Hour")].AsInt(),
6405 v[_T(
"Minute")].AsInt(), v[_T(
"Second")].AsInt());
6407 if (message_ID == _T(
"OCPN_TRACK_REQUEST")) {
6409 wxJSONReader reader;
6410 wxString trk_id = wxEmptyString;
6412 int numErrors = reader.Parse(message_JSONText, &root);
6413 if (numErrors > 0)
return;
6415 if (root.HasMember(_T(
"Track_ID")))
6416 trk_id = root[_T(
"Track_ID")].AsString();
6419 v[_T(
"Track_ID")] = trk_id;
6420 for (
Track *ptrack : g_TrackList) {
6421 wxString name = wxEmptyString;
6422 if (ptrack->m_GUID == trk_id) {
6423 name = ptrack->GetName();
6424 if (name.IsEmpty()) {
6426 if (rp && rp->GetCreateTime().IsValid())
6427 name = rp->GetCreateTime().FormatISODate() + _T(
" ") +
6428 rp->GetCreateTime().FormatISOTime();
6430 name = _(
"(Unnamed Track)");
6436 v[_T(
"error")] =
false;
6437 v[_T(
"TotalNodes")] = ptrack->GetnPoints();
6438 for (
int j = 0; j < ptrack->GetnPoints(); j++) {
6440 v[_T(
"lat")] = tp->m_lat;
6441 v[_T(
"lon")] = tp->m_lon;
6442 v[_T(
"NodeNr")] = i;
6444 wxString msg_id(_T(
"OCPN_TRACKPOINTS_COORDS"));
6445 g_pi_manager->SendJSONMessageToAllPlugins(msg_id, v);
6449 v[_T(
"error")] =
true;
6451 wxString msg_id(_T(
"OCPN_TRACKPOINTS_COORDS"));
6452 g_pi_manager->SendJSONMessageToAllPlugins(msg_id, v);
6454 }
else if (message_ID == _T(
"OCPN_ROUTE_REQUEST")) {
6456 wxJSONReader reader;
6457 wxString guid = wxEmptyString;
6459 int numErrors = reader.Parse(message_JSONText, &root);
6460 if (numErrors > 0) {
6464 if (root.HasMember(_T(
"GUID"))) guid = root[_T(
"GUID")].AsString();
6467 v[_T(
"GUID")] = guid;
6468 for (RouteList::iterator it = pRouteList->begin(); it != pRouteList->end();
6470 wxString name = wxEmptyString;
6472 if ((*it)->m_GUID == guid) {
6473 name = (*it)->m_RouteNameString;
6474 if (name.IsEmpty()) name = _(
"(Unnamed Route)");
6476 v[_T(
"Name")] = name;
6477 v[_T(
"error")] =
false;
6480 for (RoutePointList::iterator itp = (*it)->pRoutePointList->begin();
6481 itp != (*it)->pRoutePointList->end(); itp++) {
6482 w[i][_T(
"lat")] = (*itp)->m_lat;
6483 w[i][_T(
"lon")] = (*itp)->m_lon;
6484 w[i][_T(
"Name")] = (*itp)->GetName();
6485 w[i][_T(
"Description")] = (*itp)->GetDescription();
6486 w[i][_T(
"GUID")] = (*itp)->m_GUID;
6487 w[i][_T(
"ArrivalRadius")] = (*itp)->GetWaypointArrivalRadius();
6488 wxHyperlinkListNode *node = (*itp)->m_HyperlinkList->GetFirst();
6493 v[i][_T(
"WPLink") + wxString::Format(_T(
"%d"), n)] =
6495 v[i][_T(
"WPLinkDesciption") + wxString::Format(_T(
"%d"), n++)] =
6496 httpLink->DescrText;
6497 node = node->GetNext();
6502 v[_T(
"waypoints")] = w;
6503 wxString msg_id(_T(
"OCPN_ROUTE_RESPONSE"));
6504 g_pi_manager->SendJSONMessageToAllPlugins(msg_id, v);
6509 v[_T(
"error")] =
true;
6511 wxString msg_id(_T(
"OCPN_ROUTE_RESPONSE"));
6512 g_pi_manager->SendJSONMessageToAllPlugins(msg_id, v);
6513 }
else if (message_ID == _T(
"OCPN_ROUTELIST_REQUEST")) {
6515 wxJSONReader reader;
6518 int numErrors = reader.Parse(message_JSONText, &root);
6519 if (numErrors > 0)
return;
6521 if (root.HasMember(_T(
"mode"))) {
6522 wxString str = root[_T(
"mode")].AsString();
6523 if (str == _T(
"Track")) route =
false;
6528 for (RouteList::iterator it = pRouteList->begin();
6529 it != pRouteList->end(); it++) {
6530 wxString name = (*it)->m_RouteNameString;
6531 if (name.IsEmpty()) name = _(
"(Unnamed Route)");
6533 v[i][_T(
"error")] =
false;
6534 v[i][_T(
"name")] = name;
6535 v[i][_T(
"GUID")] = (*it)->m_GUID;
6536 v[i][_T(
"active")] = (*it)->IsActive();
6540 for (
Track *ptrack : g_TrackList) {
6541 wxString name = ptrack->GetName();
6542 if (name.IsEmpty()) {
6544 if (tp && tp->GetCreateTime().IsValid())
6545 name = tp->GetCreateTime().FormatISODate() + _T(
" ") +
6546 tp->GetCreateTime().FormatISOTime();
6548 name = _(
"(Unnamed Track)");
6550 v[i][_T(
"error")] =
false;
6551 v[i][_T(
"name")] = name;
6552 v[i][_T(
"GUID")] = ptrack->m_GUID;
6553 v[i][_T(
"active")] = g_pActiveTrack == ptrack;
6557 wxString msg_id(_T(
"OCPN_ROUTELIST_RESPONSE"));
6558 g_pi_manager->SendJSONMessageToAllPlugins(msg_id, v);
6561 v[0][_T(
"error")] =
true;
6562 wxString msg_id(_T(
"OCPN_ROUTELIST_RESPONSE"));
6563 g_pi_manager->SendJSONMessageToAllPlugins(msg_id, v);
6565 }
else if (message_ID == _T(
"OCPN_ACTIVE_ROUTELEG_REQUEST")) {
6567 v[0][_T(
"error")] =
true;
6568 if (g_pRouteMan->GetpActiveRoute()) {
6569 if (g_pRouteMan->m_bDataValid) {
6570 v[0][_T(
"error")] =
false;
6571 v[0][_T(
"range")] = g_pRouteMan->GetCurrentRngToActivePoint();
6572 v[0][_T(
"bearing")] = g_pRouteMan->GetCurrentBrgToActivePoint();
6573 v[0][_T(
"XTE")] = g_pRouteMan->GetCurrentXTEToActivePoint();
6574 v[0][_T(
"active_route_GUID")] =
6575 g_pRouteMan->GetpActiveRoute()->GetGUID();
6576 v[0][_T(
"active_waypoint_lat")] =
6577 g_pRouteMan->GetpActiveRoute()->m_pRouteActivePoint->GetLatitude();
6578 v[0][_T(
"active_waypoint_lon")] =
6579 g_pRouteMan->GetpActiveRoute()->m_pRouteActivePoint->GetLongitude();
6582 wxString msg_id(_T(
"OCPN_ACTIVE_ROUTELEG_RESPONSE"));
6583 g_pi_manager->SendJSONMessageToAllPlugins(msg_id, v);
6588 wxLogMessage(wxString(event.GetSString().c_str(), wxConvUTF8));
6592static void UpdatePositionCalculatedSogCog() {
6593 wxDateTime now = wxDateTime::Now();
6594 if (last_own_ship_sog_cog_calc_ts.IsValid()) {
6595 wxLongLong time_diff =
6596 now.Subtract(last_own_ship_sog_cog_calc_ts).GetMilliseconds();
6597 if (time_diff / 1000 >= g_own_ship_sog_cog_calc_damp_sec) {
6599 DistanceBearingMercator(gLat, gLon, last_own_ship_sog_cog_calc_lat,
6600 last_own_ship_sog_cog_calc_lon, &brg, &dist);
6601 double tSog = dist / (time_diff.ToDouble() / 3600000.);
6610 last_own_ship_sog_cog_calc_lat = gLat;
6611 last_own_ship_sog_cog_calc_lon = gLon;
6612 last_own_ship_sog_cog_calc_ts = now;
6615 last_own_ship_sog_cog_calc_lat = gLat;
6616 last_own_ship_sog_cog_calc_lon = gLon;
6617 last_own_ship_sog_cog_calc_ts = now;
6621void MyFrame::FilterCogSog(
void) {
6622 if (g_bfilter_cogsog && !g_own_ship_sog_cog_calc) {
6624 double cog_last = gCog;
6627 for (
int i = g_COGFilterSec - 1; i > 0; i--)
6628 COGFilterTable[i] = COGFilterTable[i - 1];
6629 COGFilterTable[0] = cog_last;
6632 if (!std::isnan(cog_last)) {
6634 double sum = 0., count = 0;
6635 for (
int i = 0; i < g_COGFilterSec; i++) {
6636 double adder = COGFilterTable[i];
6637 if (std::isnan(adder))
continue;
6639 if (fabs(adder - cog_last) > 180.) {
6640 if ((adder - cog_last) > 0.)
6653 else if (sum >= 360.)
6660 double sog_last = gSog;
6663 for (
int i = g_SOGFilterSec - 1; i > 0; i--)
6664 SOGFilterTable[i] = SOGFilterTable[i - 1];
6665 SOGFilterTable[0] = sog_last;
6668 if (!std::isnan(gSog)) {
6669 double sum = 0., count = 0;
6670 for (
int i = 0; i < g_SOGFilterSec; i++) {
6671 if (std::isnan(SOGFilterTable[i]))
continue;
6673 sum += SOGFilterTable[i];
6683void MyFrame::StopSockets(
void) {
6687void MyFrame::ResumeSockets(
void) {
6691void MyFrame::LoadHarmonics() {
6694 ptcmgr->LoadDataSources(TideCurrentDataSet);
6696 bool b_newdataset =
false;
6699 wxArrayString test = ptcmgr->GetDataSet();
6700 for (
unsigned int i = 0; i < test.GetCount(); i++) {
6701 bool b_foundi =
false;
6702 for (
unsigned int j = 0; j < TideCurrentDataSet.GetCount(); j++) {
6703 if (TideCurrentDataSet[j] == test[i]) {
6709 b_newdataset =
true;
6714 test = TideCurrentDataSet;
6715 for (
unsigned int i = 0; i < test.GetCount(); i++) {
6716 bool b_foundi =
false;
6717 for (
unsigned int j = 0; j < ptcmgr->GetDataSet().GetCount(); j++) {
6718 if (ptcmgr->GetDataSet()[j] == test[i]) {
6724 b_newdataset =
true;
6729 if (b_newdataset) ptcmgr->LoadDataSources(TideCurrentDataSet);
6735void MyFrame::ActivateAISMOBRoute(
const AisTargetData *ptarget) {
6736 if (!ptarget)
return;
6739 wxDateTime mob_time = wxDateTime::Now();
6740 wxString mob_label(_(
"AIS MAN OVERBOARD"));
6741 mob_label += _(
" at ");
6742 mob_label += mob_time.FormatTime();
6743 mob_label += _(
" on ");
6744 mob_label += mob_time.FormatISODate();
6747 mob_label, wxEmptyString);
6748 pWP_MOB->SetShared(
true);
6749 pWP_MOB->m_bIsolatedMark =
true;
6750 pSelect->AddSelectableRoutePoint(ptarget->Lat, ptarget->Lon, pWP_MOB);
6751 pConfig->AddNewWayPoint(pWP_MOB, -1);
6752 pWP_MOB->SetUseSca(
false);
6760 wxString(_(
"Own ship")), wxEmptyString);
6761 pSelect->AddSelectableRoutePoint(gLat, gLon, pWP_src);
6762 pWP_MOB->SetUseSca(
false);
6763 pAISMOBRoute =
new Route();
6764 pRouteList->Append(pAISMOBRoute);
6766 pAISMOBRoute->AddPoint(pWP_src);
6767 pAISMOBRoute->AddPoint(pWP_MOB);
6769 pSelect->AddSelectableRouteSegment(ptarget->Lat, ptarget->Lon, gLat, gLon,
6770 pWP_src, pWP_MOB, pAISMOBRoute);
6772 pAISMOBRoute->m_RouteNameString = _(
"Temporary AISMOB Route");
6773 pAISMOBRoute->m_RouteStartString = _(
"Present own ship");
6774 pAISMOBRoute->m_RouteEndString = mob_label;
6776 pAISMOBRoute->m_bDeleteOnArrival =
false;
6778 pAISMOBRoute->SetRouteArrivalRadius(-1.0);
6780 if (g_pRouteMan->GetpActiveRoute()) g_pRouteMan->DeactivateRoute();
6784 v[_T(
"GUID")] = pAISMOBRoute->m_GUID;
6785 wxString msg_id(_T(
"OCPN_MAN_OVERBOARD"));
6786 g_pi_manager->SendJSONMessageToAllPlugins(msg_id, v);
6789 if (RouteManagerDialog::getInstanceFlag()) {
6790 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
6791 pRouteManagerDialog->UpdateRouteListCtrl();
6792 pRouteManagerDialog->UpdateWptListCtrl();
6796 RefreshAllCanvas(
false);
6798 wxString mob_message(_(
"AIS MAN OVERBOARD"));
6799 mob_message += _(
" Time: ");
6800 mob_message += mob_time.Format();
6801 mob_message += _(
" Ownship Position: ");
6802 mob_message += toSDMM(1, gLat);
6803 mob_message += _T(
" ");
6804 mob_message += toSDMM(2, gLon);
6805 mob_message += _(
" MOB Position: ");
6806 mob_message += toSDMM(1, ptarget->Lat);
6807 mob_message += _T(
" ");
6808 mob_message += toSDMM(2, ptarget->Lon);
6809 wxLogMessage(mob_message);
6812void MyFrame::UpdateAISMOBRoute(
const AisTargetData *ptarget) {
6813 if (pAISMOBRoute && ptarget) {
6815 RoutePoint *OwnPoint = pAISMOBRoute->GetPoint(1);
6816 OwnPoint->m_lat = gLat;
6817 OwnPoint->m_lon = gLon;
6819 pSelect->DeleteSelectableRoutePoint(OwnPoint);
6820 pSelect->AddSelectableRoutePoint(gLat, gLon, OwnPoint);
6823 RoutePoint *MOB_Point = pAISMOBRoute->GetPoint(2);
6824 MOB_Point->m_lat = ptarget->Lat;
6825 MOB_Point->m_lon = ptarget->Lon;
6827 pSelect->DeleteSelectableRoutePoint(MOB_Point);
6828 pSelect->AddSelectableRoutePoint(ptarget->Lat, ptarget->Lon, MOB_Point);
6830 pSelect->UpdateSelectableRouteSegments(OwnPoint);
6831 pSelect->UpdateSelectableRouteSegments(MOB_Point);
6834 RefreshAllCanvas(
false);
6837 wxDateTime mob_time = wxDateTime::Now();
6839 wxString mob_message(_(
"AIS MAN OVERBOARD UPDATE"));
6840 mob_message += _(
" Time: ");
6841 mob_message += mob_time.Format();
6842 mob_message += _(
" Ownship Position: ");
6843 mob_message += toSDMM(1, gLat);
6844 mob_message += _T(
" ");
6845 mob_message += toSDMM(2, gLon);
6846 mob_message += _(
" MOB Position: ");
6847 mob_message += toSDMM(1, ptarget->Lat);
6848 mob_message += _T(
" ");
6849 mob_message += toSDMM(2, ptarget->Lon);
6851 wxLogMessage(mob_message);
6855void MyFrame::applySettingsString(wxString settings) {
6857 int last_UIScaleFactor = g_GUIScaleFactor;
6858 bool previous_expert = g_bUIexpert;
6859 g_last_ChartScaleFactor = g_ChartScaleFactor;
6860 ArrayOfCDI *pNewDirArray =
new ArrayOfCDI;
6863 g_Platform->platformApplyPrivateSettingsString(settings, pNewDirArray);
6866 pConfig->UpdateSettings();
6869 if (g_last_ChartScaleFactor != g_ChartScaleFactor) rr |= S52_CHANGED;
6871 if (rr & S52_CHANGED) {
6873 ps52plib->FlushSymbolCaches();
6875 ->ClearCNSYLUPArray();
6876 ps52plib->GenerateStateHash();
6880 ProcessOptionsDialog(rr, pNewDirArray);
6885 bool b_newToolbar =
false;
6887 if (g_GUIScaleFactor != last_UIScaleFactor) b_newToolbar =
true;
6889 if (previous_expert != g_bUIexpert) b_newToolbar =
true;
6891 if (rr & TOOLBAR_CHANGED) b_newToolbar =
true;
6895 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6897 if (cc) cc->DestroyToolbar();
6902#ifdef __OCPN__ANDROID__
6903 if (previous_expert && !g_bUIexpert) {
6904 androidForceFullRepaint();
6908 if (previous_expert != g_bUIexpert) g_Platform->applyExpertMode(g_bUIexpert);
6912 SetGPSCompassScale();
6914 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6916 if (cc) cc->GetCompass()->SetScaleFactor(g_compass_scalefactor);
6918 UpdateGPSCompassStatusBoxes(
true);
6921 g_Platform->ShowBusySpinner();
6923 SetAllToolbarScale();
6927 g_Platform->HideBusySpinner();
6929 RequestNewMasterToolbar(
true);
6938 UpdateControlBar(GetPrimaryCanvas());
6941#if defined(__WXOSX__) || defined(__WXQT__)
6942 if (g_MainToolbar) g_MainToolbar->Raise();
6944 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
6946 if (cc && cc->GetMUIBar()) cc->GetMUIBar()->Raise();
6951 if (console) console->Raise();
6955 if (NMEALogWindow::Get().Active())
6956 NMEALogWindow::Get().GetTTYWindow()->Raise();
6959#ifdef wxHAS_POWER_EVENTS
6960void MyFrame::OnSuspending(wxPowerEvent &event) {
6964 wxLogMessage(_T(
"System suspend starting..."));
6967void MyFrame::OnSuspended(wxPowerEvent &WXUNUSED(event)) {
6970 wxLogMessage(_T(
"System is going to suspend."));
6973void MyFrame::OnSuspendCancel(wxPowerEvent &WXUNUSED(event)) {
6976 wxLogMessage(_T(
"System suspend was cancelled."));
6979int g_last_resume_ticks;
6980void MyFrame::OnResume(wxPowerEvent &WXUNUSED(event)) {
6981 wxDateTime now = wxDateTime::Now();
6983 wxLogMessage(_T(
"System resumed from suspend."));
6985 if ((now.GetTicks() - g_last_resume_ticks) > 5) {
6986 wxLogMessage(_T(
"Restarting streams."));
6988 g_last_resume_ticks = now.GetTicks();
6992 g_pMUX->ClearStreams();
6994 g_pMUX->StartAllStreams();
7003 if (IsMaximized()) {
7008 wxSize sz = GetSize();
7009 SetSize(wxSize(sz.x - 1, sz.y));
7021void MyFrame::RequestNewMasterToolbar(
bool bforcenew) {
7022 bool btbRebuild =
false;
7024 bool b_reshow =
true;
7025 if (g_MainToolbar) {
7026 b_reshow = g_MainToolbar->IsShown();
7027 float ff = fabs(g_MainToolbar->GetScaleFactor() - g_toolbar_scalefactor);
7028 if ((ff > 0.01f) || bforcenew) {
7029 g_MainToolbar->DestroyToolBar();
7030 delete g_MainToolbar;
7031 g_MainToolbar = NULL;
7037 if (!g_MainToolbar) {
7038 long orient = g_Platform->GetDefaultToolbarOrientation();
7040 g_toolbar_scalefactor);
7041 g_MainToolbar->SetCornerRadius(5);
7042 g_MainToolbar->SetBackGroundColorString(_T(
"GREY3"));
7043 g_MainToolbar->SetToolbarHideMethod(TOOLBAR_HIDE_TO_FIRST_TOOL);
7044 g_MainToolbar->SetToolConfigString(g_toolbarConfig);
7045 g_MainToolbar->EnableRolloverBitmaps(
false);
7046 g_MainToolbar->SetGrabberEnable(
false);
7048 g_MainToolbar->CreateConfigMenu();
7051 g_bmasterToolbarFull =
true;
7054 if (g_MainToolbar) {
7055 CreateMasterToolbar();
7056 if (g_MainToolbar->isSubmergedToGrabber()) {
7057 g_MainToolbar->SubmergeToGrabber();
7059 g_MainToolbar->RestoreRelativePosition(g_maintoolbar_x, g_maintoolbar_y);
7060 g_MainToolbar->SetColorScheme(global_color_scheme);
7061 g_MainToolbar->Show(b_reshow && g_bshowToolbar);
7066 g_MainToolbar->SetAutoHide(g_bAutoHideToolbar);
7067 g_MainToolbar->SetAutoHideTimer(g_nAutoHideToolbar);
7071bool MyFrame::CollapseGlobalToolbar() {
7072 if (g_MainToolbar) {
7073 m_nMasterToolCountShown = 1;
7074 g_MainToolbar->SetToolShowCount(m_nMasterToolCountShown);
7075 g_MainToolbar->GetToolbar()->InvalidateBitmaps();
7076 g_MainToolbar->Realize();
7077 g_bmasterToolbarFull =
false;
7083bool MyFrame::GetMasterToolItemShow(
int toolid) {
7084 if (g_bmasterToolbarFull)
7093 if (g_MainToolbar) tb = g_MainToolbar->GetToolbar();
7100 ID_MASTERTOGGLE, style->GetToolIcon(_T(
"MUI_menu"), TOOLICON_NORMAL),
7101 wxITEM_NORMAL, _(
"Hide Toolbar"), _T(
"MUI_menu"));
7102 tic->m_bRequired =
true;
7104 g_MainToolbar->AddToolItem(tic);
7107 ID_SETTINGS, style->GetToolIcon(_T(
"MUI_settings"), TOOLICON_NORMAL),
7108 wxITEM_NORMAL, _(
"Options"), _T(
"MUI_settings"));
7109 g_MainToolbar->AddToolItem(tic);
7112 ID_MENU_ROUTE_NEW, style->GetToolIcon(_T(
"MUI_route"), TOOLICON_NORMAL),
7113 style->GetToolIcon(_T(
"MUI_route"), TOOLICON_TOGGLED), wxITEM_CHECK,
7114 wxString(_(
"Create Route")) << _T(
" (Ctrl-R)"), _T(
"MUI_route"));
7116 g_MainToolbar->AddToolItem(tic);
7119 ID_ROUTEMANAGER, style->GetToolIcon(_T(
"MUI_RMD"), TOOLICON_NORMAL),
7120 wxITEM_NORMAL, _(
"Route & Mark Manager"), _T(
"MUI_RMD"));
7121 g_MainToolbar->AddToolItem(tic);
7124 ID_TRACK, style->GetToolIcon(_T(
"MUI_track"), TOOLICON_NORMAL),
7125 style->GetToolIcon(_T(
"MUI_track"), TOOLICON_TOGGLED), wxITEM_CHECK,
7126 _(
"Enable Tracking"), _T(
"MUI_track"));
7127 g_MainToolbar->AddToolItem(tic);
7130 ID_COLSCHEME, style->GetToolIcon(_T(
"MUI_colorscheme"), TOOLICON_NORMAL),
7131 wxITEM_NORMAL, _(
"Change Color Scheme"), _T(
"MUI_colorscheme"));
7132 g_MainToolbar->AddToolItem(tic);
7143 ID_PRINT, style->GetToolIcon(_T(
"MUI_print"), TOOLICON_NORMAL),
7144 wxITEM_NORMAL, _(
"Print Chart"), _T(
"MUI_print"));
7145 g_MainToolbar->AddToolItem(tic);
7148 ID_ABOUT, style->GetToolIcon(_T(
"MUI_help"), TOOLICON_NORMAL),
7149 wxITEM_NORMAL, _(
"About OpenCPN"), _T(
"MUI_help"));
7150 g_MainToolbar->AddToolItem(tic);
7153 AddDefaultPositionPlugInTools();
7157 ID_MOB, style->GetToolIcon(_T(
"mob_btn"), TOOLICON_NORMAL), wxITEM_NORMAL,
7158 wxString(_(
"Drop MOB Marker")) << _(
" (Ctrl-Space)"), _T(
"mob_btn"));
7159 g_MainToolbar->AddToolItem(tic);
7162 g_MainToolbar->RebuildToolbar();
7166 g_MainToolbar->Realize();
7169 ArrayOfPlugInToolbarTools tool_array =
7170 g_pi_manager->GetPluginToolbarToolArray();
7171 for (
unsigned int i = 0; i < tool_array.GetCount(); i++) {
7173 if (!pttc->b_viz)
continue;
7175 if (pttc->kind == wxITEM_CHECK) tb->ToggleTool(pttc->id, pttc->b_toggle);
7178 SetMasterToolbarItemState(ID_TRACK, g_bTrackActive);
7179 if (g_bTrackActive) {
7180 g_MainToolbar->SetToolShortHelp(ID_TRACK, _(
"Disable Tracking"));
7186bool MyFrame::CheckAndAddPlugInTool() {
7187 if (!g_pi_manager)
return false;
7192 if (g_MainToolbar) tb = g_MainToolbar->GetToolbar();
7194 if (!tb)
return false;
7196 int n_tools = tb->GetToolsCount();
7200 ArrayOfPlugInToolbarTools tool_array =
7201 g_pi_manager->GetPluginToolbarToolArray();
7203 for (
unsigned int i = 0; i < tool_array.GetCount(); i++) {
7205 if (pttc->position == n_tools) {
7206 wxBitmap *ptool_bmp;
7208 switch (global_color_scheme) {
7209 case GLOBAL_COLOR_SCHEME_DAY:
7210 ptool_bmp = pttc->bitmap_day;
7213 case GLOBAL_COLOR_SCHEME_DUSK:
7214 ptool_bmp = pttc->bitmap_dusk;
7216 case GLOBAL_COLOR_SCHEME_NIGHT:
7217 ptool_bmp = pttc->bitmap_night;
7220 ptool_bmp = pttc->bitmap_day;
7225 pttc->id, *(ptool_bmp), pttc->kind, pttc->shortHelp, _T(
""));
7227 tic->m_NormalIconSVG = pttc->pluginNormalIconSVG;
7228 tic->m_RolloverIconSVG = pttc->pluginRolloverIconSVG;
7229 tic->m_ToggledIconSVG = pttc->pluginToggledIconSVG;
7230 tic->m_bPlugin =
true;
7239 while (CheckAndAddPlugInTool()) {
7245bool MyFrame::AddDefaultPositionPlugInTools() {
7246 if (!g_pi_manager)
return false;
7252 ArrayOfPlugInToolbarTools tool_array =
7253 g_pi_manager->GetPluginToolbarToolArray();
7255 for (
unsigned int i = 0; i < tool_array.GetCount(); i++) {
7259 if (!pttc->b_viz)
continue;
7261 if (pttc->position == -1)
7263 wxBitmap *ptool_bmp;
7265 switch (global_color_scheme) {
7266 case GLOBAL_COLOR_SCHEME_DAY:
7267 ptool_bmp = pttc->bitmap_day;
7269 case GLOBAL_COLOR_SCHEME_DUSK:
7270 ptool_bmp = pttc->bitmap_dusk;
7272 case GLOBAL_COLOR_SCHEME_NIGHT:
7273 ptool_bmp = pttc->bitmap_night;
7276 ptool_bmp = pttc->bitmap_day;
7281 pttc->id, *(ptool_bmp), pttc->kind, pttc->shortHelp, _T(
""));
7283 tic->m_NormalIconSVG = pttc->pluginNormalIconSVG;
7284 tic->m_RolloverIconSVG = pttc->pluginRolloverIconSVG;
7285 tic->m_ToggledIconSVG = pttc->pluginToggledIconSVG;
7286 tic->m_bPlugin =
true;
7288 g_MainToolbar->AddToolItem(tic);
7301wxColour GetGlobalColor(wxString colorName);
7303static const char *usercolors[] = {
7305 "GREEN1;120;255;120;",
7306 "GREEN2; 45;150; 45;",
7307 "GREEN3;200;220;200;",
7308 "GREEN4; 0;255; 0;",
7309 "BLUE1; 170;170;255;",
7310 "BLUE2; 45; 45;170;",
7312 "GREY1; 200;200;200;",
7313 "GREY2; 230;230;230;",
7314 "RED1; 220;200;200;",
7316 "UWHIT; 255;255;255;",
7319 "YELO1; 243;229; 47;",
7320 "YELO2; 128; 80; 0;",
7321 "TEAL1; 0;128;128;",
7322 "GREEN5;170;254; 0;",
7323 "COMPT; 245;247;244",
7325 "DILG0; 255;255;255;",
7327 "DILG0; 238;239;242;",
7329 "DILG1; 212;208;200;",
7330 "DILG2; 255;255;255;",
7334 "CHGRF; 163; 180; 183;",
7335 "UINFM; 197; 69; 195;",
7336 "UINFG; 104; 228; 86;",
7337 "UINFF; 125; 137; 140;",
7338 "UINFR; 241; 84; 105;",
7340 "CHYLW; 244; 218; 72;",
7341 "CHWHT; 212; 234; 238;",
7343 "UDKRD; 124; 16; 0;",
7344 "UARTE; 200; 0; 0;",
7346 "NODTA; 163; 180; 183;",
7348 "SNDG1; 125; 137; 140;",
7350 "SCLBR; 235; 125; 54;",
7351 "UIBDR; 125; 137; 140;",
7352 "UINFB; 58; 120; 240;",
7354 "UINFO; 235; 125; 54;",
7355 "PLRTE; 220; 64; 37;",
7356 "CHMGD; 197; 69; 195;",
7357 "UIBCK; 212; 234; 238;",
7359 "DASHB; 255;255;255;",
7360 "DASHL; 175;175;175;",
7361 "DASHF; 50; 50; 50;",
7362 "DASHR; 200; 0; 0;",
7364 "DASHN; 200;120; 0;",
7365 "DASH1; 204;204;255;",
7366 "DASH2; 122;131;172;",
7367 "COMP1; 211;211;211;",
7369 "GREY3; 40; 40; 40;",
7370 "BLUE4; 100;100;200;",
7371 "VIO01; 171; 33;141;",
7372 "VIO02; 209;115;213;",
7375 "GREEN1; 60;128; 60;",
7376 "GREEN2; 22; 75; 22;",
7377 "GREEN3; 80;100; 80;",
7378 "GREEN4; 0;128; 0;",
7379 "BLUE1; 80; 80;160;",
7380 "BLUE2; 30; 30;120;",
7382 "GREY1; 100;100;100;",
7383 "GREY2; 128;128;128;",
7384 "RED1; 150;100;100;",
7386 "UWHIT; 255;255;255;",
7387 "URED; 120; 54; 11;",
7388 "UGREN; 35;110; 20;",
7389 "YELO1; 120;115; 24;",
7390 "YELO2; 64; 40; 0;",
7391 "TEAL1; 0; 64; 64;",
7392 "GREEN5; 85;128; 0;",
7393 "COMPT; 124;126;121",
7395 "CHGRF; 41; 46; 46;",
7396 "UINFM; 58; 20; 57;",
7397 "UINFG; 35; 76; 29;",
7398 "UINFF; 41; 46; 46;",
7399 "UINFR; 80; 28; 35;",
7400 "SHIPS; 71; 78; 79;",
7401 "CHYLW; 81; 73; 24;",
7402 "CHWHT; 71; 78; 79;",
7404 "DILG0; 110;110;110;",
7405 "DILG1; 110;110;110;",
7407 "DILG3; 130;130;130;",
7408 "UITX1; 41; 46; 46;",
7410 "UARTE; 64; 64; 64;",
7412 "NODTA; 41; 46; 46;",
7413 "CHBLK; 54; 60; 61;",
7414 "SNDG1; 41; 46; 46;",
7415 "SNDG2; 71; 78; 79;",
7416 "SCLBR; 75; 38; 19;",
7417 "UIBDR; 54; 60; 61;",
7418 "UINFB; 19; 40; 80;",
7419 "UINFD; 71; 78; 79;",
7420 "UINFO; 75; 38; 19;",
7421 "PLRTE; 73; 21; 12;",
7422 "CHMGD; 74; 58; 81;",
7425 "DASHB; 77; 77; 77;",
7426 "DASHL; 54; 54; 54;",
7428 "DASHR; 58; 21; 21;",
7429 "DASHG; 21; 58; 21;",
7430 "DASHN; 100; 50; 0;",
7431 "DASH1; 76; 76;113;",
7432 "DASH2; 48; 52; 72;",
7433 "COMP1; 107;107;107;",
7435 "GREY3; 20; 20; 20;",
7436 "BLUE4; 80; 80;160;",
7437 "VIO01; 128; 25;108;",
7438 "VIO02; 171; 33;141;",
7441 "GREEN1; 30; 80; 30;",
7442 "GREEN2; 15; 60; 15;",
7443 "GREEN3; 12; 23; 9;",
7444 "GREEN4; 0; 64; 0;",
7445 "BLUE1; 60; 60;100;",
7446 "BLUE2; 22; 22; 85;",
7448 "GREY1; 48; 48; 48;",
7449 "GREY2; 32; 32; 32;",
7450 "RED1; 100; 50; 50;",
7451 "UWHIT; 255;255;255;",
7454 "UGREN; 17; 55; 10;",
7455 "YELO1; 60; 65; 12;",
7456 "YELO2; 32; 20; 0;",
7457 "TEAL1; 0; 32; 32;",
7458 "GREEN5; 44; 64; 0;",
7459 "COMPT; 48; 49; 51",
7460 "DILG0; 80; 80; 80;",
7461 "DILG1; 80; 80; 80;",
7463 "DILG3; 65; 65; 65;",
7464 "UITX1; 31; 34; 35;",
7466 "UARTE; 64; 64; 64;",
7468 "CHGRF; 16; 18; 18;",
7469 "UINFM; 52; 18; 52;",
7470 "UINFG; 22; 24; 7;",
7471 "UINFF; 31; 34; 35;",
7472 "UINFR; 59; 17; 10;",
7473 "SHIPS; 37; 41; 41;",
7474 "CHYLW; 31; 33; 10;",
7475 "CHWHT; 37; 41; 41;",
7478 "CHBLK; 31; 34; 35;",
7479 "SNDG1; 31; 34; 35;",
7480 "SNDG2; 43; 48; 48;",
7481 "SCLBR; 52; 28; 12;",
7482 "UIBDR; 31; 34; 35;",
7483 "UINFB; 21; 29; 69;",
7484 "UINFD; 43; 48; 58;",
7485 "UINFO; 52; 28; 12;",
7486 "PLRTE; 66; 19; 11;",
7487 "CHMGD; 52; 18; 52;",
7491 "DASHL; 20; 20; 20;",
7492 "DASHF; 64; 64; 64;",
7493 "DASHR; 70; 15; 15;",
7494 "DASHG; 15; 70; 15;",
7495 "DASHN; 17; 80; 56;",
7496 "DASH1; 48; 52; 72;",
7497 "DASH2; 36; 36; 53;",
7498 "COMP1; 24; 24; 24;",
7500 "GREY3; 10; 10; 10;",
7501 "BLUE4; 70; 70;140;",
7502 "VIO01; 85; 16; 72;",
7503 "VIO02; 128; 25;108;",
7507int get_static_line(
char *d,
const char **p,
int index,
int n) {
7508 if (!strcmp(p[index],
"*****"))
return 0;
7510 strncpy(d, p[index], n);
7514void InitializeUserColors(
void) {
7515 const char **p = usercolors;
7523 UserColorTableArray =
new wxArrayPtrVoid;
7524 UserColourHashTableArray =
new wxArrayPtrVoid;
7528 ct->tableName =
new wxString(_T(
"DAY"));
7529 ct->color =
new wxArrayPtrVoid;
7530 UserColorTableArray->Add((
void *)ct);
7533 ct->tableName =
new wxString(_T(
"DUSK"));
7534 ct->color =
new wxArrayPtrVoid;
7535 UserColorTableArray->Add((
void *)ct);
7538 ct->tableName =
new wxString(_T(
"NIGHT"));
7539 ct->color =
new wxArrayPtrVoid;
7540 UserColorTableArray->Add((
void *)ct);
7542 while ((get_static_line(buf, p, index,
sizeof(buf) - 1))) {
7543 if (!strncmp(buf,
"Table", 5)) {
7544 sscanf(buf,
"Table:%s", TableName);
7546 for (
unsigned int it = 0; it < UserColorTableArray->GetCount(); it++) {
7547 ctp = (
colTable *)(UserColorTableArray->Item(it));
7548 if (!strcmp(TableName, ctp->tableName->mb_str())) {
7557 while (buf[j] !=
';' && j < 20) {
7564 strcpy(c->colName, name);
7566 sscanf(&buf[j],
";%i;%i;%i", &R, &G, &B);
7579 for (
unsigned int its = 0; its < UserColorTableArray->GetCount(); its++) {
7580 wxColorHashMap *phash =
new wxColorHashMap;
7581 UserColourHashTableArray->Add((
void *)phash);
7585 for (
unsigned int ic = 0; ic < ctp->color->GetCount(); ic++) {
7588 wxColour c(c2->R, c2->G, c2->B);
7589 wxString key(c2->colName, wxConvUTF8);
7596 pcurrent_user_color_hash =
7597 (wxColorHashMap *)UserColourHashTableArray->Item(0);
7600void DeInitializeUserColors(
void) {
7602 for (i = 0; i < UserColorTableArray->GetCount(); i++) {
7605 for (
unsigned int j = 0; j < ct->color->GetCount(); j++) {
7610 delete ct->tableName;
7616 delete UserColorTableArray;
7618 for (i = 0; i < UserColourHashTableArray->GetCount(); i++) {
7619 wxColorHashMap *phash = (wxColorHashMap *)UserColourHashTableArray->Item(i);
7623 delete UserColourHashTableArray;
7630typedef struct _MSW_COLOR_SPEC {
7632 wxString S52_RGB_COLOR;
7636MSW_COLOR_SPEC color_spec[] = {{COLOR_MENU, _T(
"UIBCK"), 0},
7637 {COLOR_MENUTEXT, _T(
"UITX1"), 0},
7638 {COLOR_BTNSHADOW, _T(
"UIBCK"), 0},
7641void SaveSystemColors() {
7655 MSW_COLOR_SPEC *pcspec = &color_spec[0];
7656 while (pcspec->COLOR_NAME != -1) {
7657 pcspec->SysRGB_COLOR = pGetSysColor(pcspec->COLOR_NAME);
7662void RestoreSystemColors() {
7663 int element[NCOLORS];
7664 int rgbcolor[NCOLORS];
7667 MSW_COLOR_SPEC *pcspec = &color_spec[0];
7668 while (pcspec->COLOR_NAME != -1) {
7669 element[i] = pcspec->COLOR_NAME;
7670 rgbcolor[i] = pcspec->SysRGB_COLOR;
7676 pSetSysColors(i, (
unsigned long *)&element[0], (
unsigned long *)&rgbcolor[0]);
7681void SetSystemColors(ColorScheme cs) {
7683 int element[NCOLORS];
7684 int rgbcolor[NCOLORS];
7686 if ((GLOBAL_COLOR_SCHEME_DUSK == cs) || (GLOBAL_COLOR_SCHEME_NIGHT == cs)) {
7687 MSW_COLOR_SPEC *pcspec = &color_spec[0];
7688 while (pcspec->COLOR_NAME != -1) {
7689 wxColour color = GetGlobalColor(pcspec->S52_RGB_COLOR);
7690 rgbcolor[i] = (color.Red() << 16) + (color.Green() << 8) + color.Blue();
7691 element[i] = pcspec->COLOR_NAME;
7697 pSetSysColors(i, (
unsigned long *)&element[0],
7698 (
unsigned long *)&rgbcolor[0]);
7702 RestoreSystemColors();
7707wxColor GetDimColor(wxColor c) {
7708 if ((global_color_scheme == GLOBAL_COLOR_SCHEME_DAY) ||
7709 (global_color_scheme == GLOBAL_COLOR_SCHEME_RGB))
7713 if (global_color_scheme == GLOBAL_COLOR_SCHEME_DUSK) factor = 0.5;
7714 if (global_color_scheme == GLOBAL_COLOR_SCHEME_NIGHT) factor = 0.25;
7716 wxImage::RGBValue rgb(c.Red(), c.Green(), c.Blue());
7717 wxImage::HSVValue hsv = wxImage::RGBtoHSV(rgb);
7718 hsv.value = hsv.value * factor;
7719 wxImage::RGBValue nrgb = wxImage::HSVtoRGB(hsv);
7721 return wxColor(nrgb.red, nrgb.green, nrgb.blue);
7728double AnchorDistFix(
double const d,
double const AnchorPointMinDist,
7729 double const AnchorPointMaxDist)
7732 if (d < AnchorPointMinDist)
7733 return AnchorPointMinDist;
7734 else if (d > AnchorPointMaxDist)
7735 return AnchorPointMaxDist;
7741 if (d > -AnchorPointMinDist)
7742 return -AnchorPointMinDist;
7743 else if (d < -AnchorPointMaxDist)
7744 return -AnchorPointMaxDist;
7751static const WORD MAX_CONSOLE_LINES =
7756void RedirectIOToConsole()
7761 wxIntPtr lStdHandle;
7763 CONSOLE_SCREEN_BUFFER_INFO coninfo;
7773 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
7774 coninfo.dwSize.Y = MAX_CONSOLE_LINES;
7775 SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
7779 lStdHandle = (wxIntPtr)GetStdHandle(STD_OUTPUT_HANDLE);
7780 hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
7781 fp = _fdopen(hConHandle,
"w");
7783 setvbuf(stdout, NULL, _IONBF, 0);
7787 lStdHandle = (wxIntPtr)GetStdHandle(STD_INPUT_HANDLE);
7788 hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
7789 fp = _fdopen(hConHandle,
"r");
7791 setvbuf(stdin, NULL, _IONBF, 0);
7795 lStdHandle = (wxIntPtr)GetStdHandle(STD_ERROR_HANDLE);
7796 hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
7797 fp = _fdopen(hConHandle,
"w");
7799 setvbuf(stderr, NULL, _IONBF, 0);
7811bool TestGLCanvas(wxString prog_dir) {
7813 wxString test_app = prog_dir;
7814 test_app += _T(
"ocpn_gltest1.exe");
7816 if (::wxFileExists(test_app)) {
7817 long proc_return = ::wxExecute(test_app, wxEXEC_SYNC);
7818 printf(
"OpenGL Test Process returned %0X\n", proc_return);
7819 if (proc_return == 0)
7820 printf(
"GLCanvas OK\n");
7822 printf(
"GLCanvas failed to start, disabling OpenGL.\n");
7824 return (proc_return == 0);
7834OCPN_ThreadMessageEvent::OCPN_ThreadMessageEvent(wxEventType commandType,
7836 : wxEvent(id, commandType) {}
7838OCPN_ThreadMessageEvent::~OCPN_ThreadMessageEvent() {}
7840wxEvent *OCPN_ThreadMessageEvent::Clone()
const {
7842 newevent->m_string = this->m_string;
7882#include <initguid.h>
7883#include <Setupapi.h>
7885#include "EnumSerial.h"
7889#ifndef GUID_CLASS_COMPORT
7890DEFINE_GUID(GUID_CLASS_COMPORT, 0x86e0d1e0L, 0x8089, 0x11d0, 0x9c, 0xe4, \
78910x08, 0x00, 0x3e, 0x30, 0x1f, 0x73);
7896 SSerInfo() : bUsbDevice(FALSE) {}
7898 CString strPortName;
7899 CString strFriendlyName;
7901 CString strPortDesc;
7909void EnumPortsWdm(CArray<SSerInfo,SSerInfo&> &asi);
7910void EnumPortsWNt4(CArray<SSerInfo,SSerInfo&> &asi);
7911void EnumPortsW9x(CArray<SSerInfo,SSerInfo&> &asi);
7912void SearchPnpKeyW9x(HKEY hkPnp, BOOL bUsbDevice,
7913 CArray<SSerInfo,SSerInfo&> &asi);
7922void EnumSerialPorts(CArray<SSerInfo,SSerInfo&> &asi, BOOL bIgnoreBusyPorts)
7930 vi.dwOSVersionInfoSize =
sizeof(vi);
7931 if (!::GetVersionEx(&vi)) {
7933 str.Format(
"Could not get OS version. (err=%lx)",
7938 if (vi.dwMajorVersion < 5) {
7939 if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT)
7950 for (
int ii=0; ii<asi.GetSize(); ii++)
7952 SSerInfo& rsi = asi[ii];
7953 if (bIgnoreBusyPorts) {
7955 HANDLE hCom = CreateFile(rsi.strDevPath,
7956 GENERIC_READ | GENERIC_WRITE,
7963 if (hCom == INVALID_HANDLE_VALUE) {
7971 ::CloseHandle(hCom);
7977 if (rsi.strFriendlyName.IsEmpty())
7978 rsi.strFriendlyName = rsi.strPortName;
7982 if (rsi.strPortDesc.IsEmpty()) {
7985 rsi.strPortDesc = rsi.strFriendlyName;
7986 int startdex = rsi.strPortDesc.Find(
" (");
7987 int enddex = rsi.strPortDesc.Find(
")");
7988 if (startdex > 0 && enddex ==
7989 (rsi.strPortDesc.GetLength()-1))
7990 rsi.strPortDesc = rsi.strPortDesc.Left(startdex);
7997void EnumPortsWdm(CArray<SSerInfo,SSerInfo&> &asi)
8002 GUID *guidDev = (GUID*) &GUID_CLASS_COMPORT;
8004 HDEVINFO hDevInfo = INVALID_HANDLE_VALUE;
8005 SP_DEVICE_INTERFACE_DETAIL_DATA *pDetData = NULL;
8008 hDevInfo = SetupDiGetClassDevs( guidDev,
8011 DIGCF_PRESENT | DIGCF_DEVICEINTERFACE
8014 if(hDevInfo == INVALID_HANDLE_VALUE)
8016 strErr.Format(
"SetupDiGetClassDevs failed. (err=%lx)",
8023 SP_DEVICE_INTERFACE_DATA ifcData;
8024 DWORD dwDetDataSize =
sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) + 256;
8025 pDetData = (SP_DEVICE_INTERFACE_DETAIL_DATA*)
new char[dwDetDataSize];
8028 ifcData.cbSize =
sizeof(SP_DEVICE_INTERFACE_DATA);
8029 pDetData->cbSize =
sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
8030 for (DWORD ii=0; bOk; ii++) {
8031 bOk = SetupDiEnumDeviceInterfaces(hDevInfo,
8032 NULL, guidDev, ii, &ifcData);
8035 SP_DEVINFO_DATA devdata = {
sizeof(SP_DEVINFO_DATA)};
8036 bOk = SetupDiGetDeviceInterfaceDetail(hDevInfo,
8037 &ifcData, pDetData, dwDetDataSize, NULL, &devdata);
8039 CString strDevPath(pDetData->DevicePath);
8043 BOOL bSuccess = SetupDiGetDeviceRegistryProperty(
8044 hDevInfo, &devdata, SPDRP_FRIENDLYNAME, NULL,
8045 (PBYTE)fname,
sizeof(fname), NULL);
8046 bSuccess = bSuccess && SetupDiGetDeviceRegistryProperty(
8047 hDevInfo, &devdata, SPDRP_DEVICEDESC, NULL,
8048 (PBYTE)desc,
sizeof(desc), NULL);
8049 BOOL bUsbDevice = FALSE;
8051 if (SetupDiGetDeviceRegistryProperty(
8052 hDevInfo, &devdata, SPDRP_LOCATION_INFORMATION, NULL,
8053 (PBYTE)locinfo,
sizeof(locinfo), NULL))
8061 bUsbDevice = (strncmp(locinfo,
"USB", 3)==0);
8066 si.strDevPath = strDevPath;
8067 si.strFriendlyName = fname;
8068 si.strPortDesc = desc;
8069 si.bUsbDevice = bUsbDevice;
8075 strErr.Format(
"SetupDiGetDeviceInterfaceDetail failed. (err=%lx)",
8081 DWORD err = GetLastError();
8082 if (err != ERROR_NO_MORE_ITEMS) {
8083 strErr.Format(
"SetupDiEnumDeviceInterfaces failed. (err=%lx)", err);
8089 catch (CString strCatchErr) {
8090 strErr = strCatchErr;
8093 if (pDetData != NULL)
8094 delete [] (
char*)pDetData;
8095 if (hDevInfo != INVALID_HANDLE_VALUE)
8096 SetupDiDestroyDeviceInfoList(hDevInfo);
8098 if (!strErr.IsEmpty())
8102void EnumPortsWNt4(CArray<SSerInfo,SSerInfo&> &asi)
8108 for (
int ii=1; ii<=16; ii++) {
8110 strPort.Format(
"COM%d",ii);
8111 si.strDevPath = CString(
"\\\\.\\") + strPort;
8112 si.strPortName = strPort;
8117void EnumPortsW9x(CArray<SSerInfo,SSerInfo&> &asi)
8126 HKEY hkSubEnum = NULL;
8127 HKEY hkSubSubEnum = NULL;
8130 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"Enum", 0, KEY_READ,
8131 &hkEnum) != ERROR_SUCCESS)
8132 throw CString(
"Could not read from HKLM\\Enum");
8135 char acSubEnum[128];
8136 DWORD dwSubEnumIndex = 0;
8137 DWORD dwSize =
sizeof(acSubEnum);
8138 while (RegEnumKeyEx(hkEnum, dwSubEnumIndex++, acSubEnum, &dwSize,
8139 NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
8141 HKEY hkSubEnum = NULL;
8142 if (RegOpenKeyEx(hkEnum, acSubEnum, 0, KEY_READ,
8143 &hkSubEnum) != ERROR_SUCCESS)
8144 throw CString(
"Could not read from HKLM\\Enum\\")+acSubEnum;
8148 BOOL bUsbDevice = (strcmp(acSubEnum,
"USBPORTS")==0);
8149 char acSubSubEnum[128];
8150 dwSize =
sizeof(acSubSubEnum);
8151 DWORD dwSubSubEnumIndex = 0;
8152 while (RegEnumKeyEx(hkSubEnum, dwSubSubEnumIndex++, acSubSubEnum,
8153 &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
8155 BOOL bMatch = (strcmp(acSubSubEnum,
"*PNP0500")==0 ||
8156 strcmp(acSubSubEnum,
"*PNP0501")==0 ||
8159 HKEY hkSubSubEnum = NULL;
8160 if (RegOpenKeyEx(hkSubEnum, acSubSubEnum, 0, KEY_READ,
8161 &hkSubSubEnum) != ERROR_SUCCESS)
8162 throw CString(
"Could not read from HKLM\\Enum\\") +
8163 acSubEnum +
"\\" + acSubSubEnum;
8164 SearchPnpKeyW9x(hkSubSubEnum, bUsbDevice, asi);
8165 RegCloseKey(hkSubSubEnum);
8166 hkSubSubEnum = NULL;
8169 dwSize =
sizeof(acSubSubEnum);
8172 RegCloseKey(hkSubEnum);
8174 dwSize =
sizeof(acSubEnum);
8177 catch (CString strError) {
8179 RegCloseKey(hkEnum);
8180 if (hkSubEnum != NULL)
8181 RegCloseKey(hkSubEnum);
8182 if (hkSubSubEnum != NULL)
8183 RegCloseKey(hkSubSubEnum);
8187 RegCloseKey(hkEnum);
8190void SearchPnpKeyW9x(HKEY hkPnp, BOOL bUsbDevice,
8191 CArray<SSerInfo,SSerInfo&> &asi)
8196 HKEY hkSubPnp = NULL;
8201 DWORD dwSubPnpIndex = 0;
8202 DWORD dwSize =
sizeof(acSubPnp);
8203 while (RegEnumKeyEx(hkPnp, dwSubPnpIndex++, acSubPnp, &dwSize,
8204 NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
8206 HKEY hkSubPnp = NULL;
8207 if (RegOpenKeyEx(hkPnp, acSubPnp, 0, KEY_READ,
8208 &hkSubPnp) != ERROR_SUCCESS)
8209 throw CString(
"Could not read from HKLM\\Enum\\...\\")
8214 dwSize =
sizeof(acValue);
8215 if (RegQueryValueEx(hkSubPnp,
"PORTNAME", NULL, NULL, (BYTE*)acValue,
8216 &dwSize) == ERROR_SUCCESS)
8218 CString strPortName(acValue);
8221 CString strFriendlyName;
8222 dwSize =
sizeof(acValue);
8223 if (RegQueryValueEx(hkSubPnp,
"FRIENDLYNAME", NULL, NULL, (BYTE*)acValue,
8224 &dwSize) == ERROR_SUCCESS)
8225 strFriendlyName = acValue;
8229 si.strDevPath = CString(
"\\\\.\\") + strPortName;
8230 si.strPortName = strPortName;
8231 si.strFriendlyName = strFriendlyName;
8232 si.bUsbDevice = bUsbDevice;
8236 for (
int ii=0; ii<asi.GetSize() && !bDup; ii++)
8238 if (asi[ii].strPortName == strPortName) {
8249 RegCloseKey(hkSubPnp);
8251 dwSize =
sizeof(acSubPnp);
8254 catch (CString strError) {
8255 if (hkSubPnp != NULL)
8256 RegCloseKey(hkSubPnp);
8263bool ReloadLocale() {
8268 (!g_Platform->ChangeLocale(g_locale, plocale_def_lang, &plocale_def_lang)
8275 FontMgr::Get().SetLocale(g_locale);
8276 FontMgr::Get().ScrubList();
8283 if (pRoutePropDialog) {
8284 pRoutePropDialog->Hide();
8285 pRoutePropDialog->Destroy();
8286 pRoutePropDialog = NULL;
8289 if (pRouteManagerDialog) {
8290 pRouteManagerDialog->Hide();
8291 pRouteManagerDialog->Destroy();
8292 pRouteManagerDialog = NULL;
8295 if (console) console->SetColorScheme(global_color_scheme);
8296 if (g_pais_query_dialog_active) {
8297 g_pais_query_dialog_active->Destroy();
8298 g_pais_query_dialog_active = NULL;
8301 if (g_pais_alert_dialog_active) {
8302 g_pais_alert_dialog_active->Destroy();
8303 g_pais_alert_dialog_active = NULL;
8306 if (g_pAISTargetList) {
8307 if (g_pauimgr) g_pauimgr->DetachPane(g_pAISTargetList);
8308 g_pAISTargetList->Disconnect_decoder();
8309 g_pAISTargetList->Destroy();
8310 g_pAISTargetList = NULL;
8314 if (gFrame->m_pMenuBar) {
8315 gFrame->SetMenuBar(NULL);
8316 gFrame->m_pMenuBar->Destroy();
8317 gFrame->m_pMenuBar = NULL;
8319 gFrame->BuildMenuBar();
8322 for (
unsigned int i = 0; i < g_canvasArray.GetCount(); i++) {
8324 if (cc) cc->CanvasApplyLocale();
8329 wxString perspective;
8330 pConfig->SetPath(_T (
"/AUI" ));
8331 pConfig->Read(_T (
"AUIPerspective" ), &perspective);
8336 PluginLoader::getInstance()->DeactivateAllPlugIns();
8337 PluginLoader::getInstance()->UpdatePlugIns();
8345 bool bno_load =
false;
8346 wxAuiPaneInfoArray pane_array_val = g_pauimgr->GetAllPanes();
8348 for (
unsigned int i = 0; i < pane_array_val.GetCount(); i++) {
8349 wxAuiPaneInfo pane = pane_array_val[i];
8350 if (perspective.Find(pane.name) == wxNOT_FOUND) {
8356 if (!bno_load) g_pauimgr->LoadPerspective(perspective,
false);
8358 g_pauimgr->Update();
8361 gFrame->RequestNewToolbars(
true);
8362 gFrame->RequestNewMasterToolbar(
true);
8367extern wxString g_UserPresLibData;
8368extern wxString g_SENCPrefix;
8369extern bool g_bportable;
8370extern wxString g_csv_locn;
8386 g_csv_locn = g_Platform->GetSharedDataDir();
8387 g_csv_locn.Append(_T(
"s57data"));
8390 g_csv_locn = _T(
".");
8391 appendOSDirSlash(&g_csv_locn);
8392 g_csv_locn.Append(_T(
"s57data"));
8397 if (g_SENCPrefix.IsEmpty()) {
8398 g_SENCPrefix = g_Platform->GetPrivateDataDir();
8399 appendOSDirSlash(&g_SENCPrefix);
8400 g_SENCPrefix.Append(_T(
"SENC"));
8404 wxFileName f(g_SENCPrefix);
8405 if (f.MakeRelativeTo(g_Platform->GetPrivateDataDir()))
8406 g_SENCPrefix = f.GetFullPath();
8408 g_SENCPrefix = _T(
"SENC");
8414 bool b_force_legacy =
false;
8416 if (g_UserPresLibData.IsEmpty()) {
8417 plib_data = g_csv_locn;
8418 appendOSDirSlash(&plib_data);
8419 plib_data.Append(_T(
"S52RAZDS.RLE"));
8421 plib_data = g_UserPresLibData;
8422 b_force_legacy =
true;
8425 ps52plib =
new s52plib(plib_data, b_force_legacy);
8440 if (!ps52plib->m_bOK) {
8443 wxStandardPaths &std_path = g_Platform->GetStdPaths();
8445 wxString look_data_dir;
8446 look_data_dir.Append(std_path.GetUserDataDir());
8447 appendOSDirSlash(&look_data_dir);
8448 wxString tentative_SData_Locn = look_data_dir;
8449 look_data_dir.Append(_T(
"s57data"));
8451 plib_data = look_data_dir;
8452 appendOSDirSlash(&plib_data);
8453 plib_data.Append(_T(
"S52RAZDS.RLE"));
8455 wxLogMessage(_T(
"Looking for s57data in ") + look_data_dir);
8456 ps52plib =
new s52plib(plib_data);
8458 if (ps52plib->m_bOK) {
8459 g_csv_locn = look_data_dir;
8468 if (!ps52plib->m_bOK) {
8471 wxString look_data_dir;
8472 look_data_dir = g_Platform->GetSharedDataDir();
8473 look_data_dir.Append(_T(
"s57data"));
8475 plib_data = look_data_dir;
8476 appendOSDirSlash(&plib_data);
8477 plib_data.Append(_T(
"S52RAZDS.RLE"));
8479 wxLogMessage(_T(
"Looking for s57data in ") + look_data_dir);
8480 ps52plib =
new s52plib(plib_data);
8482 if (ps52plib->m_bOK) g_csv_locn = look_data_dir;
8485 if (ps52plib->m_bOK) {
8486 wxLogMessage(_T(
"Using s57data in ") + g_csv_locn);
8493 for (
unsigned int iPtr = 0; iPtr < ps52plib->pOBJLArray->GetCount();
8495 OBJLElement *pOLE = (OBJLElement *)(ps52plib->pOBJLArray->Item(iPtr));
8496 if (!strncmp(pOLE->OBJLName,
"DEPARE", 6)) pOLE->nViz = 1;
8497 if (!strncmp(pOLE->OBJLName,
"LNDARE", 6)) pOLE->nViz = 1;
8498 if (!strncmp(pOLE->OBJLName,
"COALNE", 6)) pOLE->nViz = 1;
8501 pConfig->LoadS57Config();
8502 ps52plib->SetPLIBColorScheme(global_color_scheme);
8505 ps52plib->SetPPMM(g_BasePlatform->GetDisplayDPmm());
8506 double dip_factor = g_BasePlatform->GetDisplayDIPMult(gFrame);
8507 ps52plib->SetDIPFactor(dip_factor);
8508 ps52plib->SetContentScaleFactor(OCPN_GetDisplayContentScaleFactor());
8512 ps52plib->SetScaleFactorExp(g_Platform->GetChartScaleFactorExp(g_ChartScaleFactor));
8513 ps52plib-> SetScaleFactorZoomMod(g_chart_zoom_modifier_vector);
8518 extern bool g_b_EnableVBO;
8519 extern GLenum g_texture_rectangle_format;
8524 wxString renderer = wxString(GL_Caps->Renderer.c_str());
8525 ps52plib->SetGLRendererString(renderer);
8528 ps52plib->SetGLOptions(
8529 glChartCanvas::s_b_useStencil, glChartCanvas::s_b_useStencilAP,
8530 glChartCanvas::s_b_useScissorTest, glChartCanvas::s_b_useFBO,
8531 g_b_EnableVBO, g_texture_rectangle_format, 1, 1);
8538 _T(
" S52PLIB Initialization failed, disabling Vector charts."));
8547 : wxThread(wxTHREAD_JOINABLE) {
8548 m_filename = filename;
8559 newChart->SetNativeScale(m_scale);
8560 newChart->SetFullExtent(m_ext);
8562 newChart->FindOrCreateSenc(m_filename);
8567 wxString m_filename;
8573static double chart_dist(
int index) {
8579 if (cte.GetBBox().Contains(gLat, gLon))
8584 clon = (cte.GetLonMax() + cte.GetLonMin()) / 2;
8585 d = DistGreatCircle(cte.GetLatMax(), clon, gLat, gLon);
8586 t = DistGreatCircle(cte.GetLatMin(), clon, gLat, gLon);
8589 clat = (cte.GetLatMax() + cte.GetLatMin()) / 2;
8590 t = DistGreatCircle(clat, cte.GetLonMin(), gLat, gLon);
8592 t = DistGreatCircle(clat, cte.GetLonMax(), gLat, gLon);
8598WX_DEFINE_SORTED_ARRAY_INT(
int, MySortedArrayInt);
8599static int CompareInts(
int n1,
int n2) {
8600 double d1 = chart_dist(n1);
8601 double d2 = chart_dist(n2);
8602 return (
int)(d1 - d2);
8607 wxString chart_path;
8612WX_DEFINE_OBJARRAY(ArrayOfCompressTargets);
8614#include <wx/arrimpl.cpp>
8617void ParseAllENC(wxWindow *parent) {
8618 MySortedArrayInt idx_sorted_by_distance(CompareInts);
8626 for (
int i = 0; i < ChartData->GetChartTableEntries(); i++) {
8629 if (CHART_TYPE_S57 != cte.GetChartType())
continue;
8631 idx_sorted_by_distance.Add(i);
8635 if (count == 0)
return;
8637 wxLogMessage(wxString::Format(_T(
"ParseAllENC() count = %d"), count));
8643 ArrayOfCompressTargets ct_array;
8644 for (
unsigned int j = 0; j < idx_sorted_by_distance.GetCount(); j++) {
8645 int i = idx_sorted_by_distance[j];
8648 double distance = chart_dist(i);
8650 wxString filename(cte.GetpFullPath(), wxConvUTF8);
8653 pct->distance = distance;
8654 pct->chart_path = filename;
8656 ct_array.push_back(pct);
8659 int thread_count = 0;
8662 extern int g_nCPUCount;
8663 if (g_nCPUCount > 0)
8664 thread_count = g_nCPUCount;
8666 thread_count = wxThread::GetCPUCount();
8668 if (thread_count < 1) {
8677 for(
int t = 0; t < thread_count; t++)
8681 wxGenericProgressDialog *prog =
nullptr;
8682 wxSize csz = GetOCPNCanvasWindow()->GetClientSize();
8685 long style = wxPD_SMOOTH | wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
8686 wxPD_REMAINING_TIME | wxPD_CAN_SKIP;
8688 prog =
new wxGenericProgressDialog();
8689 wxFont *qFont = GetOCPNScaledFont(_(
"Dialog"));
8690 prog->SetFont(*qFont);
8692 prog->Create(_(
"OpenCPN ENC Prepare"),
8693 _T(
"Longgggggggggggggggggggggggggggg"), count + 1, parent,
8708 for (
unsigned int j = 0; j < ct_array.size(); j++) {
8709 wxString filename = ct_array[j].chart_path;
8710 double distance = ct_array[j].distance;
8711 int index = ChartData->FinddbIndex(filename);
8712 if (index < 0)
continue;
8715 ext.NLAT = cte.GetLatMax();
8716 ext.SLAT = cte.GetLatMin();
8717 ext.WLON = cte.GetLonMin();
8718 ext.ELON = cte.GetLonMax();
8720 int scale = cte.GetScale();
8723 msg.Printf(_(
"Distance from Ownship: %4.0f NMi"), distance);
8726 if (wxThread::IsMain()) {
8728 wxSize sz = prog->GetSize();
8730 msg += _T(
" Chart:");
8733 prog->Update(count, msg, &skip);
8745 newChart->SetNativeScale(
scale);
8746 newChart->SetFullExtent(ext);
8747 newChart->DisableBackgroundSENC();
8749 newChart->FindOrCreateSenc(filename,
8753 if (wxThread::IsMain()) {
8754 msg.Printf(_(
"ENC Completed."));
8756 prog->Update(count, msg, &skip);
8766 for (
int t = 0;; t = (t + 1) % thread_count) {
8773 if (!workers[t]->IsAlive()) {
8786#if defined(__WXMSW__) || defined(__WXOSX__)
8793 for(
int t = 0; t<thread_count; t++) {
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.
Message withg decoded values, available on AppMsgBus.
void OnFrameTimer1(wxTimerEvent &event)
void SurfaceAllCanvasToolbars(void)
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.
s57RegistrarMgr Definition This is a class holding the ctor and dtor for the global registrar