세상을 이롭게

OpenCPN 개발하기 04. Plugin 준비 및 테스트 본문

OpenCPN

OpenCPN 개발하기 04. Plugin 준비 및 테스트

2022. 1. 26. 10:25

OpenCPN 홈페이지에선 기본적인 Plugin 들을 제공한다. 필요하다면 개발을 통해 Plugin을 넣을 수 있다.
그 첫단계를 해보려 한다. 참고해볼 코드들은 아래의 사이트에 가서 github의 소스를 확인해보면 된다.

https://opencpn.org/OpenCPN/info/downloadplugins.html

 

Plugins for OpenCPN

If you are a developer and would like information on creating plugins and how to get them listed here please see the Plugin Guidelines. OpenCPN Team

opencpn.org

https://opencpn.org/wiki/dokuwiki/doku.php?id=opencpn:developer_manual:plugins 

 

Developer Plugins [OpenCPN Manuals]

 

opencpn.org

Test용 Plugin 을 만들어 보겠습니다.

빈 프로젝트를 생성하겠습니다.

 

속성페이지 - 구성 속성 - 일반 - 구성 형식 을 dll 로 바꾸어 줍니다.

구성 속성 - C/C++ - 일반 - 추가 포함 디렉터리

C:\OpenCPN\include;
C:\OpenCPN_SDK\wxWidgets\include;
C:\OpenCPN_SDK\wxWidgets\lib\vc_dll\mswud;
%(AdditionalIncludeDirectories)

 

구성 속성 - C/C++ - 전처리기 - 전처리기 정의

WIN32;
_WINDOWS;
__MSVC__;
_CRT_NONSTDC_NO_DEPRECATE;
_CRT_SECURE_NO_DEPRECATE;
UNICODE;
_UNICODE;
WXUSINGDLL;
ocpnUSE_GL;
_DEBUG;
__WXMSW__;
__WXDEBUG__;
_WIN32;
%(PreprocessorDefinitions)

구성 속성 - 링커 - 일반 - 추가 라이브러리 디렉터리

C:\OpenCPN_SDK\wxWidgets\lib\vc_dll;
C:\OpenCPN\build\Debug

구성 속성 - 링커 - 입력 - 추가 종속성

opencpn.lib;
wxbase31ud.lib;
wxmsw31ud_core.lib;
wxbase31ud_net.lib;
wxbase31ud_xml.lib;
wxmsw31ud_html.lib;
wxmsw31ud_adv.lib;
wxmsw31ud_aui.lib;
wxmsw31ud_gl.lib;
wxpngd.lib;
wxtiffd.lib;
wxjpegd.lib;
wxzlibd.lib;
wxregexud.lib;
wxexpatd.lib;
opengl32.lib;
glu32.lib;
winmm.lib;
comctl32.lib;
oleacc.lib;
rpcrt4.lib;
shlwapi.lib;
version.lib;
wsock32.lib;
kernel32.lib;
user32.lib;
gdi32.lib;
winspool.lib;
shell32.lib;
ole32.lib;
oleaut32.lib;
uuid.lib;
comdlg32.lib;
advapi32.lib;
%(AdditionalDependencies)

Test_pi.h

#pragma once
#include "ocpn_plugin.h"
#include "wx/wxprec.h"

#define		PLUGIN_VERSION_MAJOR	1
#define		PLUGIN_VERSION_MINOR	15
#define		MY_API_VERSION_MAJOR	1
#define		MY_API_VERSION_MINOR	0

class Test_pi : public opencpn_plugin_115
{
public:
    Test_pi(void* ppimgr);
    ~Test_pi(void);

    int Init(void);
    bool DeInit(void);

    int GetAPIVersionMajor() { return PLUGIN_VERSION_MAJOR; }
    int GetAPIVersionMinor() { return PLUGIN_VERSION_MINOR; }
    int GetPlugInVersionMajor() { return MY_API_VERSION_MAJOR; }
    int GetPlugInVersionMinor() { return MY_API_VERSION_MINOR; }
    wxString GetCommonName() { return wxS("Test_pi"); }
    wxString GetShortDescription() { return wxS("Test_pi"); }
    wxString GetLongDescription() { return wxS("Test Plugin"); }
};

Test_pi.cpp

#include "Test_pi.h"
#include <wx/msgdlg.h>

extern "C" DECL_EXP opencpn_plugin * create_pi(void* ppimgr) {
    return (opencpn_plugin*) new Test_pi(ppimgr);
}

extern "C" DECL_EXP void destroy_pi(opencpn_plugin * p) {
    delete p;
}

Test_pi::Test_pi(void* ppimgr) : opencpn_plugin_115(ppimgr) {

}
Test_pi::~Test_pi(void) {

}
int Test_pi::Init(void) {

    wxMessageBox(wxT("Hello World!"));
    return(
        WANTS_TOOLBAR_CALLBACK |
        WANTS_OPENGL_OVERLAY_CALLBACK |
        WANTS_NMEA_EVENTS |
        WANTS_MOUSE_EVENTS |
        WANTS_KEYBOARD_EVENTS |
        WANTS_CURSOR_LATLON |
        WANTS_ONPAINT_VIEWPORT |
        WANTS_CONFIG |
        USES_AUI_MANAGER
        );
}
bool Test_pi::DeInit(void) {
    return true;
}

Test_pi.cpp
0.00MB
Test_pi.h
0.00MB
Test_pi.dll
0.10MB

build 후 생긴 Test_pi.dll 을 C:\OpenCPN\build\plugins 에 넣어준다.
이 작업을 매번 해줘야 하기 때문에 빌드 후 이벤트로 잡아준다.

구성 속성 - 디버깅 - 명령 에 빌드한 opencpn.exe 경로를 써준다. 이렇게 하면 dll 쪽에서 디버깅이 가능하다.

디버거를 실행하여 opencpn.exe 가 정상적으로 실행되는지 확인한다.
이후 좌측 상단의 설정(톱니모양) - Plugins 를 눌러 만들어진 플러그인이 제대로 들어와 있는지 확인한다.

잘 동작함을 확인 할 수 있었다.
필요로 하는 동작만을 넣을 수 있고 Dialog를 띄워 작업 할 수도 있을 것이다.
끝!.