Qt 테트리스 샘플에 디바이스 드라이버 연계하기

kenGwon·2024년 2월 29일

[Embedded Linux] Qt

목록 보기
1/3

윈도우에서 Qt + Qt creater 설치

윈도우 qt creater에서 테트리스 샘플 실행

우리의 목표는 우리가 구현한 key에 대한 디바이스 드라이버를 테트리스 샘플 코드에 연결해서 해보는 것이다.


리눅스에서 Qt + Qt creater 설치

리눅스에서 Qt 설치하기

우선 교수님이 배포하신 qt-opensource-linux-x64-5.14.2.run 파일을 리눅스 home 디렉토리로 가져온다.
해당 설치파일은 GUI기반이기 때문에 x window에서 열어야 한다.

설치 경로를 잡아주고 설치한다.


라즈베리파이에서 Qt 설치

pi@pi14:~ $ sudo apt install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools

라즈베리파이에서 Qt creater를 돌리기에는 너무 무거워서 힘들다. 그래서 라즈베리파이에서 Qt는 vi로 편집하여 만들겠다.

우분투에서 라즈베리파이로 테트리스 소스 옮기기

// 우분투 
ubuntu@ubuntu14:~/Qt/Qt5.14.2/Examples/Qt-5.14.2/widgets/widgets/tetrix$ pwd
/home/ubuntu/Qt/Qt5.14.2/Examples/Qt-5.14.2/widgets/widgets/tetrix

// 라즈베리파이로 복사
ubuntu@ubuntu14:~/Qt/Qt5.14.2/Examples/Qt-5.14.2/widgets/widgets$ cp -r tetrix/ /srv/nfs/


// 라즈베리파이에서 확인하고 가져오기
pi@pi14:/mnt/ubuntu_nfs/tetrix $ ls
main.cpp    tetrix.pro.user  tetrixboard.h    tetrixpiece.h     tetrixwindow.h
tetrix.pro  tetrixboard.cpp  tetrixpiece.cpp  tetrixwindow.cpp

테트리스 폴더의 .pro 파일 수정하기

.pro 파일에 대해 qmake를 실행하면 자동으로 Makefile이 만들어진다.

pi@pi14:/mnt/ubuntu_nfs/tetrix $ rm *.pro *.user
pi@pi14:/mnt/ubuntu_nfs/tetrix $ ls
main.cpp  tetrixboard.cpp  tetrixboard.h  tetrixpiece.cpp  tetrixpiece.h  tetrixwindow.cpp  tetrixwindow.h

우리는 우선 기존의 .pro 파일을 지우겠다.
그리고 프로젝트 생성시 만들어진 .user 파일도 지우겠다.

그리고 새로운 .pro 파일을 만들겠다. qmake -project 명령을 입력하면 자동으로 .pro파일이 만들어진다.

pi@pi14:/mnt/ubuntu_nfs/tetrix $ qmake -project
pi@pi14:/mnt/ubuntu_nfs/tetrix $ ls
main.cpp    tetrixboard.cpp  tetrixpiece.cpp  tetrixwindow.cpp
tetrix.pro  tetrixboard.h    tetrixpiece.h    tetrixwindow.h

생성된 파일을 아래의 사진과 같이 수정하겠다.

pi@pi14:/mnt/ubuntu_nfs/tetrix $ vi tetrix.pro


9번 라인을 추가해줬다. 위젯(= 윈도우의 컨트롤)을 쓰겠다는 뜻이다.

// qmake로 Makefile 생성
pi@pi14:/mnt/ubuntu_nfs/tetrix $ qmake
Info: creating stash file /mnt/ubuntu_nfs/tetrix/.qmake.stash
pi@pi14:/mnt/ubuntu_nfs/tetrix $ ls
Makefile  tetrix.pro       tetrixboard.h    tetrixpiece.h     tetrixwindow.h
main.cpp  tetrixboard.cpp  tetrixpiece.cpp  tetrixwindow.cpp

// make로 빌드
pi@pi14:/mnt/ubuntu_nfs/tetrix $ make

이렇게 빌드가 완료되면 real vnc로 x윈도우 환경에서 터미널을 띄워서 실행파일을 실행해보자.

// x윈도우에서 실행파일 실행
pi@pi14:/mnt/ubuntu_nfs/tetrix $ ./tetrix

잘 실행이 된다. 이제 여기다가 우리가 구현한 디바이스 드라이버를 적용해보겠다.





key푸시버튼 디바이스 드라이버와 결합된 라즈베리파이 테트리스

교수님이 주신 tetrixPi.rat를 NFS로 라즈베리파이로 옮긴다.
그리고 빌드해서 실행해보자.

pi@pi14:/mnt/ubuntu_nfs $ cd tetrixPi/
pi@pi14:/mnt/ubuntu_nfs/tetrixPi $ ls
Makefile    keyled.h  tetrix      tetrix.pro.user  tetrixboard.h    tetrixpiece.h     tetrixwindow.h
keyled.cpp  main.cpp  tetrix.pro  tetrixboard.cpp  tetrixpiece.cpp  tetrixwindow.cpp
pi@pi14:/mnt/ubuntu_nfs/tetrixPi $ make
...
(생략)

이 코드는 우리의 8개의 key 푸시버튼을 통해서 테트리스를 조작할 수 있도록 적용되어 있는 코드이다.


meld로 디바이스 드라이버가 적용된 방법 확인하기

라즈베리파이의 /mnt/ubuntu_nfs/tetrixPi/경로에 있는 소스코드가 디바이스 드라이버 기능이 적용된 버전이고, /mnt/ubuntu_nfs/tetrix 경로에 있는 소스코드는 디바이스 드라이버 기능이 적용되지 않은 버전이다.

두 코드를 meld를 통해서 비교하면서 어떻게 디바이스 드라이버가 적용되었는지 분석해보겠다.

두개의 파일을 우분투 환경의 meld에서 비교해보겠다. 우분투 환경에서 위 경로를 접근하려면 srv/nfs/tetrixPisrv/nfs/tetrix가 될 것이다.

meld를 실행한 화면은 아래와 같다.

보면 keyled.hkeyled.cpp파일이 추가되었고,
tetrixboard.htetrixboard.cpp파일이 수정된 것을 확인할 수 있다.

tetrixboard.h에서 수정된 부분


tetrixboard.cpp에서 수정된 부분

keyled.cpp

C++에는 저수준 입출력함수가 없어서 공통된 open함수로 디바이스 파일을 연다.

#include keyled.h


KeyLed::KeyLed(QWidget *parent) :
    QWidget(parent)
{
    pFile = new QFile(/dev/ledkey_dev);
    {
        QMessageBox::information(this,open,open fail : /dev/ledkey_dev);
    }
    keyledFd = pFile->handle();
    pKeyLedNotifier = new QSocketNotifier(keyledFd,QSocketNotifier::Read,this);
    connect(pKeyLedNotifier,SIGNAL(activated(int)),this,SLOT(readKeyData(int)));

}
void KeyLed::readKeyData(int)
{
    char no = 0;
    int ret = pFile->read(&no,sizeof(no));
    if(ret > 0)
        emit updateKeydataSig(int(no));
}

void KeyLed::writeLedData(int no)
{
    char led = (char)no;
    pFile->write(&led, sizeof(led));
}

KeyLed::~KeyLed()
{

}

그래서 위의 keyled.cpp파일에서 아래 코드 부분을 보면 파일을 열때 Unbuffered옵션을 준 것을 알 수 있다. 저수준 입출력 함수가 버퍼를 거치지 않고 여닫는 것을 생각해보면 쉽게 이해할 수 있는 부분이다.


tetrixPi에 좌우 이동 버튼 넣기

tetrixPi 폴더를 우분투의 ~/Qt/ 경로에 복사해온다.

그리고 ~/.profileexport PATH=/home/ubuntu/Qt/Qt5.14.2/5.14.2/gcc_64/bin:$PATH를 추가한다.

ubuntu@ubuntu14:~/Qt/tetrixPi$ qmake

명령어 'qmake' 을(를) 찾을 수 없습니다. 그러나 다음을 통해 설치할 수 있습니다:

sudo apt install qtchooser

ubuntu@ubuntu14:~/Qt/tetrixPi$
ubuntu@ubuntu14:~/Qt/tetrixPi$ vi ~/.profile
ubuntu@ubuntu14:~/Qt/tetrixPi$ source ~/.profile
ubuntu@ubuntu14:~/Qt/tetrixPi$ echo $PATH
/home/ubuntu/Qt/Qt5.14.2/5.14.2/gcc_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
ubuntu@ubuntu14:~/Qt/tetrixPi$ qmake
ubuntu@ubuntu14:~/Qt/tetrixPi$ make
ubuntu@ubuntu14:~/Qt/tetrixPi$ make clean

Qt creater가 꼭 필요한 것은 아니다. vi로도 얼마든지 코딩할 수 있다.
하지만 우리는 Qt creater로 버튼을 만들어볼거다. 그러니까 make clean 하고, Qt creater를 열어서 프로젝트 열기로 Qt/tetrixPi/tetrix.pro를 열고 아래의 이미지와 같이 설정하여 configure project해보면 IDE가 열린다.

이하 세부 코딩내용은 생략

그냥 예전에 프로젝트에서 했던 PyQt랑 느낌 거의 비슷해서 그냥 하면 됨.

profile
스펀지맨

0개의 댓글