SW Developer/DLT-Viewer

아주 쉽게 설명하는 DLT-Viewer를 위한 Plugin 만들기

워크디포 2025. 4. 25. 11:35

 DLT-Viewer의 샘플 플러그인으로 DltWorkdepotPlugin을 만들고, 등록하는 방법을 자세하게 설명하며, 각 화면을 캡쳐하여 설명하므로, 쉽게 따라해 보실 수 있습니다.

 

 

DLT-Viewer의 소스를 받아서 컴파일하고 실행을 시켜 보았다. (DLT-Viewer 받아서 컴파일하고 실행하자)

 

DLT-Viewer에서 제공하는 기능 이외에 추가적으로 필요한 기능을 Plugin을 통해서 만들어서 사용할 수 있다.

DLT 로그들 중에서 필터링을 할 수는 있지만, 예를 들어서 각 로그에 있는 값들의 변화량을 계산하거나, DLT의 Payload에 있는 내용을 분석할 수 있는 기능은 DLT-Viewer에서는 제공을 하고 있지 않다.

그래서 플러그인을 통해서 별도의 UI를 만들고, DLT-Viewer에서 선택한 메시지 하나를 세부적으로 분석하거나, 로딩된 전체 메시지에서 필요한 내용을 뽑아서 CSV 파일 등으로 저장하는 기능을 추가할 수 있다.

 

만드는 설명은..

DLT-Viewer 프로젝트의 doc에 있는 dlt_viewer_plugins_programming_guide.pdf 파일을 기준으로 설명한다.

 

예제는 

DLT-Viewer 프로젝트의 plugin 아래에 dummyviewerplugin 프로젝트를 참고해 보면 동작을 알 수 있다.

 

 

이걸 예제로 자세하게 설명을 해보자.

 

기존의 샘플 프로젝트에서 내용을 변경해서 새로운 프로젝트로 생성할 수도 있고, 신규 서브 프로젝트를 만들 수도 있다.

기존 샘플 프로젝트는 DLT-Viewer의 소스에서 하위 plugin 폴더에 있는 dltviewerplugin과 dummy로 시작하는 플러그인을 참고하면 신규로 만들 수 있다.

 

새로운 Plugin 만드는 방법

여기에서 처음부터 서브 프로젝트로 만드는 법을 정리해 본다.

먼저 플러그인을 만들기 위해서는 DLT-Viewer의 Plugin 프로젝트 내에 Subproject로 추가해야 된다.
Qt Widget Application으로 서브 프로젝트를 plugin project 아래에 추가하고, 상위 프로젝트인 plugin.pro 프로젝트와 연결 시키고, 플러그 인으로 동작할 클래스를 추가하고 거기에 필요한 기능을 추가해 주어서 DLT-Viewer가 실행 될 때, 신규 플러그인이 추가/로딩 될 수 있도록 해야 한다.

 

[참조 플러그인 정리]

소스에 추가되어 있는 플러그인 정리한다.
이미 여러 개의 플러그인이 등록되어 있으므로, 일단 정리 좀 하고 시작한다. plugin.pro 프로젝트 파일에서, 필요한 것만 두고 정리한다.

Qt프로젝트 파일 pro 파일 설정 내용을 표시하는 이미지
그림 1. Plugin.pro 프로젝트 파일 정리.

위에서 주석처리한 부분이 원래 있던 부분으로, 주석 처리하고, dltviewerplugin만 남겨둔다.

 

이미 컴파일된 플러그인 결과물 정리
DLT-Viewer를 한번 컴파일해서 실행했었다면 이미 결과물들이 build 폴더 하위에 있을 것이므로, 정리하고 시작한다.
[개발디렉토리]\dlt-viewer-2.27.0\build\Qt_5_12_2_msvc2017_64-Release\release\plugins 에 있는 이미 있는 dll 파일 들을 삭제해 준다.

플러그인 프로젝트에서 필요없는 DLL 삭제한 화면 캡처 이미지
그림 2. 기존 빌드 결과물을 삭제한 상태

위와 같이 결과물이 없도록 삭제해 둔다. 컴파일하면 dltviewerplugin만 생기게 될 것이다.

 

[서브 프로젝트 추가하기]

서브 프로젝트를 생성하는 과정을 설명한다.

Qt Creator에서 새로운 Subproject를 생성하기 위해 Context Menu가 표시된 화면을 캡쳐한 이미지
그림 3. 서브 프로젝트 추가를 위한 메뉴 표시 화면

DLT-Viewer 프로젝트에서, plugin에서 우클릭 메뉴 > New subproject 를 통해서 서브 프로젝트를 추가한다.

 

Qt Creator의 New Subproject를 실행한 다이얼로그 창을 캡쳐한 이미지
그림 4. New Subproject

프로젝트 만들 때, Qt Widget Application 선택하고 (> Choose...)

 

Qt Creator에서 Project location을 설정하는 화면 캡처 이미지
그림 5. Project Location

Name 에 dltworkdepotplugin 을 넣고, 아레에 보면, plugin 디렉토리가 선택되어 있다. (> Next)

(dltworkdepotplugin은 만들고 싶은 프로젝트 이름으로 변경하면 된다.)

 

Qt Creator에서 Define Build System 화면을 캡처한 이미지
그림 6. Define Build System

Build system에 qmake를 선택 (> Next)

 

Qt Creator에서 Class Information 추가 화면을 캡처한 이미지
그림 7. Class Information 추가

Class name을 Form 으로 설정하고, Base Class를 QWidget을 선택하고 Next...
Form으로 설정하는 이유는, 샘플로 등록되어 있는 다른 프로젝트들에서 모두 Form으로 생성하고 있어서, 

여기서도 기존 것과 동일하게 하기 위해서 Form으로 설정한다.

 

Qt Creator에서 Translation File설정 화면을 캡처한 이미지
그림 8. Translation File 설정

별도의 Language를 설정할 것이 아니므로, <none>상태로 Next

 

Qt Creator에서 Kit Selection 화면을 캡처한 이미지
그림 9. Kit Selection 화면

Kit는 기본 설정되어 있는 상태에서 Next

 

Qt Creator에서 Project Management 화면을 캡처한 이미지
그림 10. Project Management 화면

지금까지 설정한 내용을 다시 한번 확인한다.
plugin.pro의 서브 프로젝트로 추가하고, 화면 구성하는 클래스는 Form으로 설정한다.

 

Qt Creator에서 Subproject가 생성된 화면을 캡처한 이미지
그림 11. 프로젝트 추가한 화면

Finish를 선택하면, 서브 프로젝트가 생성되고, plugin 아래에 프로젝트가 생성된다.

 

 

[Main.cpp 삭제]

Qt Creator에서 Maincpp를 삭제할 때 표시되는 화면을 캡처한 이미지
그림 12. main.cpp 삭제

main.cpp는 필요 없음. 삭제한다.

 

[프로젝트 연결하기]

Qt Creator에서 기존에 있던 프로젝트와 새로 생성한 프로젝트를 비교하는 화면을 캡처한 이미지
그림 13. 프로젝트 파일 비교

기존에 있던 dltviewerplugin.pro 파일과 생성한 dltworkdepotplugin.pro 파일을 비교해 보자.
예제에 있는 내용을 dltworkdepotplugin.pro에도 그대로 적용한다.

 

Qt Creator에서 새로 생성한 프로젝트를 어떻게 설정하는지 추가한 내용을 캡처한 이미지
그림 14. 프로젝트 파일 수정

pro 프로젝트 파일에 global settings 추가 시키고,
build directory에 중간단계 파일 위치 지정하고
target name 설정한다. 예제에는 dltviewerplugin으로 되어 있으므로, 여기는 dltworkdepotplugin으로 수정한다.
프로젝트를 저장한다.

 

Qt Creator에서 추가된 Subproject가 프로젝트 메뉴에 어떻게 표시되는지 화면을 캡처한 이미지
그림 15. 프로젝트 수정 된 화면

dltworkdepotplugin.pro 프로젝트 파일을 수정하고 저장하면 위와 같이 프로젝트가 기존 예제 프로젝트 동일하게 변경이 된다.

 

 

[DLT-VIewer와 연결하기 위한 DltWorkdepotPlugin 클래스 추가하기]

이제 서브 브로젝트를 생성하였고, 프로젝트 파일도 변경하여 연결시켰다. 

DLT-Viewer에 연결하는 클래스를 만들어야 한다. 클래스를 추가하고, 관련 인터페이스를 구현한다.

 

Qt Creator에서 새로 생성한 프로젝트에 신규 클래스를 추가하는 화면을 캡처한 이미지
그림 16. Add New..

신규 클래스 추가를 위해서, dltworkdepotplugin에서 우클릭해서 Add New선택한다.

 

Qt Creator에서 신규 클래스 추가할 때, New File 다이얼로그 화면을 캡처한 이미지
그림 17. New File 화면

New Files에서 C++ Class 선택

 

Qt Creator에서 새로운 클래스 추가할 때 Defile Class설정 화면을 캡처한 이미지
그림 18. Defile Class 화면

Class Name은 DltWorkdepotPlugin 입력, Base Class는 QObject, 추가되는 Path 확인해 보고, Next

 

Qt Creator에서 새로운 클래스 추가할 때 Project Management를 설정하는 화면을 캡처한 이미지
그림 19. Project Management 화면

해당 클래스는 신규로 생성된 dltworkdepotplugin.pro 프로젝트에 추가 되는지 확인한 후 Finish 선택..

 

Qt Creator에서 새로운 클래스 와 프로젝트가 다 추가된 화면을 캡처한 이미지
그림 20. Add New 한 화면

프로젝트에 해당 클래스가 추가되었고, 프로젝트 파일에도 해당 클래스가 추가되었다.

 

 

[클래츠 추가 후 확인]

이제 Plugin의 하위 프로젝트에 대해서 QMake를 하고, 다시 Rebuild를 해보자.

Qt Creator에서 빌드를 위해서 Context Menu를 표시한 화면을 캡처한 이미지
그림 21. 메뉴 표시

plugin에서 우클릭해서 Run qmake, Build “plugin”을 차례로 실행하자.

 

Qt Creator에서 빌드된 결과물이 나온 화면을 캡처한 이미지
그림 22. 컴파일 후 결과 파일 표시

컴파일 완료 후, 결과 폴더에 보면 위와 같이 결과 파일이 생성이 된다.
실행을 해보자 

Qt Creator에서 동작시 dll파일이 없다고 에러나는 화면을 캡처한 이미지
그림 23. 실행 시 경고 팝업

Ctrl + R 로 실행을 하면, 위와 같은 에러가 발생하면서 dltworkdepotplugin.dll을 로딩되지 않는다고 팝업이 표시된다.

 

Qt Creator에서 에러 때문에 Plugin이 추가되지 않은 화면을 캡처한 이미지
그림 24. 경고 표시 후 DLT-Viewer실행 화면

OK 선택하면, DLT-Viewer가 실행은 되는데, Plugin에 Dlt Workdepot Plugin은 표시되지 않는다.
DLT-Viewer에 등록되는 클래스를 상속받고, 해당 함수들을 구현하지 않아서 발생한다.

 

 

[플러그인 클래스 구현]

이제 DLT-Viewer에 등록될 수 있도록 DltWorkdepotPlugin 클래스를 수정한다.

Qt Creator에서 DltWorkdepotPlugin 클래스에서 아직 구현하지 않은 내용을 DltViewerPlugin과 비교해서 보여주는 화면을 캡처한 이미지
그림 25. 예제 파일과 비교 화면

위와 같이 DltViewerPlugin 클래스와 DltWorkdepotPlugin 클래스를 비교해 보면, 하나도 구현해 주지 않았다.
위 부분을 차례로 구현해 준다.

Qt Creator에서 DltWorkdepotPlugin 클래스에서 구현하고, DltViewerPlugin과 비교해서 보여주는 화면을 캡처한 이미지
그림 26. DLTPluginInterface 인터페이스 상속 정의

위와 같이 QDLTPluginInterface 를 먼저 구현한다.
헤더 파일을 include하고, 구현이 필요한 함수들을 추가한다.

Qt Creator에서 DltWorkdepotPlugin 클래스를 구현한 CPP 파일을 DltViewerPlugin.cpp 파일과 비교해서 보여주는 화면을 캡쳐한 이미지
그림 27. DLTPluginInterface 인터페이스 구현 부분

위 처럼 CPP에 함수들을 구현해 준다.

각 함수에서 필요한 내용은 위 주석에 추가해 두었다.

  • name() 함수 : 등록될 플러그인의 이름을 넘겨주며, DLT-Viewer의 플러그인에 해당 이름이 표시된다.
  • pluginVersion() 함수 : 구현하고 있는 현재 플러그인의 버전을 리턴한다. 지금은 1.0.1 로 되어 있다.
  • pluginInterfaceVersion() 함수 : DLT-Viewer의 플러그인 버전을 리턴하는데, 만약 현재 구현하고 있는 DLT-Veiwer의 플러그인 버전과 다른 버전의 DLT-Viewer에 로딩하게 되면, 이 버전이 달라서 로딩이 안된다. 그래서 plugininterface.h에 있는 버전을 리턴하게 구현한다.

[실행해 보자]

구현이 1차적으로 끝났다. 실행해서 결과를 보자.

컴파일 하면 build 밑에 결과물이 생성되고, 실행하면 플러그인이 등록된다.

 

빌드 후 dltworkdepotplugin.dll 이 생성된 화면을 보여주는 이미지
그림 28. 실행 결과

위 처럼 dltworkdepotplugin에 대한 결과물이 생성이 된다.

 

DLT-Viewer가 실행 될 때, 생성한 Plugin이 등록된 화면
그림 29. DLT-Viewer에 등록된 플러그인 화면

DLT-Viewer를 실행하고, Plugin을 선택해 보면,
등록한 이름인 DLT Workdepot Plugin 이 표시되고 있다.
여기서 Enabled&Not visible 은, DLTPluginInterface만 구현하였으므로, 자동 Enable은 되는데, 
DLTPluginViewerInterface 를 구현하지 않았기에, 표시할 Form이 없으므로 Not Visible이 된다.

 

 

아주 긴 설명이 되었다.

 

다음 블로그에서는 DLTPluginViewerInterface와 QDltPluginControlInterface를 추가하고, DLT Log를 선택하면, Form에 표시하는 기능을 추가해 본다.