윈도우 qt creater에서 테트리스 샘플 실행
우리의 목표는 우리가 구현한 key에 대한 디바이스 드라이버를 테트리스 샘플 코드에 연결해서 해보는 것이다.
리눅스에서 Qt 설치하기
우선 교수님이 배포하신 qt-opensource-linux-x64-5.14.2.run 파일을 리눅스 home 디렉토리로 가져온다.
해당 설치파일은 GUI기반이기 때문에 x window에서 열어야 한다.

설치 경로를 잡아주고 설치한다.
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 파일에 대해 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

잘 실행이 된다. 이제 여기다가 우리가 구현한 디바이스 드라이버를 적용해보겠다.
교수님이 주신 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 푸시버튼을 통해서 테트리스를 조작할 수 있도록 적용되어 있는 코드이다.
라즈베리파이의 /mnt/ubuntu_nfs/tetrixPi/경로에 있는 소스코드가 디바이스 드라이버 기능이 적용된 버전이고, /mnt/ubuntu_nfs/tetrix 경로에 있는 소스코드는 디바이스 드라이버 기능이 적용되지 않은 버전이다.
두 코드를 meld를 통해서 비교하면서 어떻게 디바이스 드라이버가 적용되었는지 분석해보겠다.
두개의 파일을 우분투 환경의 meld에서 비교해보겠다. 우분투 환경에서 위 경로를 접근하려면 srv/nfs/tetrixPi와 srv/nfs/tetrix가 될 것이다.
meld를 실행한 화면은 아래와 같다.

보면 keyled.h와 keyled.cpp파일이 추가되었고,
tetrixboard.h와 tetrixboard.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 폴더를 우분투의 ~/Qt/ 경로에 복사해온다.
그리고
~/.profile에export 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랑 느낌 거의 비슷해서 그냥 하면 됨.