안녕하세요..
아래 편의 고도화 버전, 추억의 소55 감성을 이어가는 (부족한) 강좌 Part 2.5 들어가 봅니다^^
https://www.clien.net/service/board/lecture/19160087
지난 편에서 맥이 클리에를 서비스 미지원 기기로 보고 상시 연결을 끊어버리는 바람에 클리에를 콘솔로 쓰는 대신,
맥에 obj-c 로 아주 작은 클러이언트를 띄워 클리에의 블루투스 동작을 모니터링 하면서 통신에 성공했었죠~
그래서 이번엔 이걸 양쪽 다 고도화 해봤습니다.
즉, 아주 미니멀한 프로토콜을 심어 맥은 Console CLI로 동작하게 하고, 클리에는 맥의 요청에 응답하는 미니 서버로..
클리에는 화면도 고도화 해봅니다. 9줄짜리 자동 스크롤 업 되는 윈도우와, 클리에의 전매특허인 조그다이얼을 이용한 스크롤 업다운까지^^
이번에도 자세한 설명은 지루해 지니까 코드는 첨부하고 결과 위주로 보여드릴께요^^
1. 클리에 서버
지난 편에서 클리에가 맥과 연결 후 맥이 보낸 “Hello from Mac to TH55” 메시지 출력하고, “Hello form TH55 Server” 문자열 한 줄 보내는 것으로 통신 개통을 확인했습니다.
그럼 이제 소통을 해봐야죠^^
(맥에서)

맥의 프로그램은 클라이언트 포지션 입니다. 원래는 대기하면서 클리에가 확인되면 자동연결하도록 했었는데, 이렇게 하니 클리에가 런처 대기중일때에도 붙고(이러면 스택에서 블루투스 연결중이라는 창이 뜨는데 그럼 클리에와 맥이 적절한 연결이 되지 않음), 특히 프로그램 실행에 들어가 포트를 열기 전에도 스택에서 먼저 연결창이 작동해 좀 꼬이면서, 맥의 자동접속시도를 죽이고 연결은 별도 명령으로 수동처리해 클리에가 준비되면 붙이도록 바꿨습니다. 한 번 띄워놓으면 클리에를 여러번 재가동 해도 훨씬 안정적으로 테스트 가능하도록 말이죠^^
(클리에에서)

클리에는 서버로 동작합니다. 맥에서 간단한 명령어를 보내면 그에 맞는 응답을 하도록 설계했고, 지금은 테스트 용도로 7개 명령만 처리 되죠^^ 중요한 건, 클리에의 작동을 지난번 처럼 메시지창으로 확인하는게 하닌, 윈도우 창을 만들어 로그해 나가도록 했고, 클리에 화면이 작은 관계로 로그는 화면이 다 차면 자동으로 스크롤 업되고, 스크롤 되서 넘어간 메시지는 조그다이얼로 찾아가 볼 수 있도록 해 봤습니다. 조그를 돌려 이전메시지 라인으로 창을 올린 상태에서 맥이 뭘 또 보내면 다시 맨 마지막줄로 복귀해 화면을 연결해 표시해 주도록 인터페이스도 신경을 좀 썼고요~
동영상 대신 사진과 말로만 설명드려서 감흥이 덜하지만.. 목표했던 블루투스 터미널은 서버-클라이언트 포지션이 바뀌긴 했지만 구현 됬고, 특히 클리에의 전매특허 조그다이얼 작동을 소환해 낸 것이 이번 업그레이드의 가장 큰 성과 같습니다^^
여기에 추가로 프로토콜을 확장하고 양방향으로 교신하는, 즉 클리에도 맥에게 뭘 요청해 받아오는 방향으로 업글해 마무리 할 예정인데.. 클리에 메시지 윈도우에 명령어 입력기능 정도 구현하는거 외엔 이 상태에서 크게 변화되진 않을 듯 합니다.
자랑은 이쯤 하고, 지난번 개발환경 셋업에서 자세히 설명 드리지 않았던 프로그램 빌드 과정의 꽃, makefile에 대해 잠간 짚고 넘어가 볼께요
2. prc 빌드 과정 - makefile
첫편에서, 빌드 과정을 아래 처럼 간단하게만 설명 드렸죠..
- m68k-palmos-gcc -c hello.c (컴파일)
- m68k-palmos-gcc hello.o -o hello (링크)
- build-prc -o HelloClie.prc -n "HelloClie" -t appl -c HCLW hello (패키징)
이 과정은 make 명령을 통해 자동화 할 수 있고, 이는 makefile이라는 배치 스크립트를 통해 완성됩니다. 메이크파일은 맥의 커맨드라인(유닉스 쉘) 구조를 알아야 해서, 저도 아직 이해도가 높진 않아 개념 정도만 요약해 볼께요^^
문득 예전에 임베디드리눅스 어플을 gcc로 개발할 때, 인터넷에서 주워온 메이크파일 고쳐가며 쓴 기억이 나네요 ㅎㅎ
이걸 20여년이 지난 지금에 와서야 구조를 이해하게 되다니 ㅋ~
암튼, 메이크파일 작성 전에 환경을 파악합니다.
팜코드의 기본 헤더인 PalmOS.h는 prc-tools가 설치한 Palm SDK 디렉토리(보통 ~/prc-tools-remix/dist 이고, 여기서는 이 경로를 시스템 환경변수인 $PRCTOOLS_HOME으로 등록해 둔 상태) 안에 “가짜 헤더”로 보통 아래 경로에 있습니다.
$PRCTOOLS_HOME/usr/share/prc-tools/include
1) 헤더가 실제로 있는지 확인
ls -la "$PRCTOOLS_HOME/usr/share/prc-tools/include/PalmOS.h"
파일이 보이면,
2) 컴파일 명령에 include 경로 직접 추가해서 컴파일 되나 확인
cd ~/clie-hello m68k-palmos-gcc \ -B"$PRCTOOLS_HOME/usr/lib/gcc-lib/m68k-palmos/2.95.3-kgpd/" \ -I"$PRCTOOLS_HOME/usr/share/prc-tools/include" \ -O2 -o hello.c ls -la
여기서 hello.o 생기면 성공.
3) 영구적으로 편하게: Makefile 만들기
기초적인 구성으로 메이크 테스트 해 봅니다..
~/clie-hello/Makefile: PRCTOOLS_HOME := $(HOME)/prc-tools-remix/dist CC := $(PRCTOOLS_HOME)/usr/bin/m68k-palmos-gcc CFLAGS := -O2 \ -B$(PRCTOOLS_HOME)/usr/lib/gcc-lib/m68k-palmos/2.95.3-kgpd/ \ -I$(PRCTOOLS_HOME)/usr/share/prc-tools/include all: hello.o hello.o: hello.c $(CC) $(CFLAGS) -S $< -o $@ clean: rm -f hello.o
makefile로 저장하고 나와서, 같은 경로에서 make 명령을 치면 오브젝트 파일인 hello.o가 생깁니다.
이게 작동하는지 확인 되면, 클리에 리소스를 더해 실행형 파일을 만드는 makefile로 확장하는데, 참고로, 팜은 리소스 기반이라 이 확장 배치에는 리소스빌더인 pilrc를 써서 .rcp(폼, 버튼, 창 등을 지정해 둔 리소스파일)를 바이너리로 만드는 중간과정이 포함됩니다. 최종 빌드는 리소스 바이너리와 .c 메인코드의 오브젝트 파일을 결합해 .prc 실행파일로 완성됩니다.
자세한 설명은 역시나 생략하고, 최종 메이크파일은 보면 아래와 같아요^^
APP=HelloClie CREATOR=Helo PRCTOOLS_HOME=/home/kkamzie/prc-tools-remix/dist SPECS=$(PRCTOOLS_HOME)/usr/lib/gcc-lib/m68k-palmos/2.95.3-kgpd/specs LIBGCCDIR=$(PRCTOOLS_HOME)/usr/lib/gcc-lib/m68k-palmos/2.95.3-kgpd CC=$(PRCTOOLS_HOME)/usr/bin/m68k-palmos-gcc CFLAGS=-O2 -Wall -specs=$(SPECS) -L$(LIBGCCDIR) PILRC=$(PRCTOOLS_HOME)/usr/bin/pilrc OBJRES=$(PRCTOOLS_HOME)/usr/bin/m68k-palmos-obj-res BUILDPRC=$(PRCTOOLS_HOME)/usr/bin/build-prc all: $(APP).prc $(APP): $(APP).c $(CC) $(CFLAGS) -o $@ $< objres: $(APP) $(OBJRES) $(APP) pilrc: $(APP).rcp $(PILRC) -q $(APP).rcp $(APP).prc: $(APP) objres pilrc $(BUILDPRC) $(APP).prc "$(APP)" $(CREATOR) *.grc t*.bin T*.bin clean: rm -f $(APP) *.o *.bin *.grc *.prc *.ro core
저 clean은 make clean과 같은 방식으로 옵션을 줄 때, 기존 메이크 과정에서 생긴 중간 결과물들을 싹 지워주는 역할을 해 줍니다.
그래서 빌드는 항상 다음과 같은 순서로 하죠~
make clean make
에러 없이 빌드가 되면 실행파일인 .prc 가 생성 됩니다. 그 다음은 이걸 메모리스틱에 옮겨서 작동여부 확인^^
첨부에는 확장을 좀 더(소니 sdk 경로 등을 포함)해서 지금 제가 쓰고 있는 메이크파일도 넣어 두었습니다~
(보충설명)
위의 경우는 prc-tools가 기본 SDK를 쓰고 있다는 가정 하에 작동합니다. 이게 뭔소리냐..
prc-tools를 설치하면 기본 sdk가 설치될 디렉토리인 /opt/palmdev 가 생성되고, 여기에 sdk 들이 있어야 합니다. 제 경우를 예를들면, 5r4와 4.0을 넣어 두었죠.. 이렇게요
kkamzie@ubuntu-vn:~/PalmDev/btdebug$ ls /opt/palmdev
sdk-4 sdk-5r4
그러면, palmdeve-prep 으로 컴파일러가 기본으로 뭘 쓸지 선택해 줄 수 있습니다. 일단 확인해 보면
kkamzie@ubuntu-vn:~/PalmDev/btdebug$ palmdev-prep Checking SDKs in /opt/palmdev sdk-5r4 headers in 'include', libraries in 'lib' sdk-4 headers in 'include', libraries in 'lib' When GCC is given no -palmos options, SDK '5r4' will be used by default Writing SDK details to configuration files... ...done
디렉토리 안의 두개 sdk가 보이고 알아서 가장 최신 버전을 디폴트로 지정합니다. 그런데, 전에 코드워리어 특화인 5r4는 prc-tools와 궁합이 잘 맞지 않는다 했죠^^ 그래서 이걸 조정해 줄 때엔 makefile에서 다른 include 경로를 잡아 컴파일러에 직접 써줍니다. 그건 제가 이 게시물에 올라온 프로그램을 빌드한 실제 makefile에 아래와 같이 반영되 있어요..
즉 prc-tools는 5r4를 기본으로 잡고 있지만, 나는 5r3을 쓰겠다.. 여기에 더해서 sony 라이브러리도 쓸거다.. 뭐 이런식이죠^^
# PalmOS SDK selection
# default toolchain uses SDK 5r4
# but this project forces SDK 4 through custom specs
PRCTOOLS_HOME=$(HOME)/PalmDev/prc-tools-remix/dist
SPECS=$(PRCTOOLS_HOME)/usr/lib/gcc-lib/m68k-palmos/2.95.3-kgpd/specs
LIBGCCDIR=$(PRCTOOLS_HOME)/usr/lib/gcc-lib/m68k-palmos/2.95.3-kgpd
# Sony CLIE SDK
SONYSDK=$(HOME)/PalmDev/sony-sdk-5.0
SONYINC=-I$(SONYSDK)/Incs -I$(SONYSDK)/Incs/System -I$(SONYSDK)/Incs/Libraries
# BT Lib reference
BTSDK=$(HOME)/PalmDev/palm-os-sdk/sdk-5r3 <-- 기본 디렉토리 /opt/palmdev/...5r4 가 아닌 5r3 디렉토리를 참조해라
BTINC=-I$(BTSDK)/include/Extensions/Bluetooth <-- 블루투스 헤더는 위의 하위에 있는 이 디렉토리를 참조하겠다
CC=$(PRCTOOLS_HOME)/usr/bin/m68k-palmos-gcc
PILRC=$(PRCTOOLS_HOME)/usr/bin/pilrc
OBJRES=$(PRCTOOLS_HOME)/usr/bin/m68k-palmos-obj-res
BUILDPRC=$(PRCTOOLS_HOME)/usr/bin/build-prc
CFLAGS=-O2 -Wall -specs=$(SPECS) -L$(LIBGCCDIR) $(SONYINC) $(BTINC) <-- 최종 컴파일 옵션
...
$(APP): $(APP).c
$(CC) $(CFLAGS) -o $@ $<
이건 제가 나중에 다른 컴에 다시 prc-tools를 설치하게되면 또 해멜 수 있는 부분이라, 예외적으로 설명을 추가해 두었습니다 ^^;; 왜냐면, 이게 지피티랑 씨름할 때 가장 병목인 부분이었거든요 ㅎㅎ
3. 여담
이 작업을 시작해 보니, 옛 것에 대한 향수가 몰려와 이것저것 뒤져보다가 필름을 찾았습니다. 무려 20년 가까이 서랍속에서 잠자던 Kodak Supra..참 따뜻한 색상의 마젠타 톤이 은은하게 올라오는 좋은 필름인데… 지피티한테 나 이런것두 있다고 얘기하니, 아주 신나서 삼천포로 빠지더군요..
그날은 프로젝트 접고 하루종일 필름과 필카 얘기로 지피티의 학습활동(?)에 일조해 줬습니다. ㅎㅎ
(보너스) 2008년 꼬꼬마 시절 딸넴을 찍어줬던 Supra 800, 찾은건 이 때 찍다 남은 2롤인데.. 이제 다 커서 운전하고 다니는데 옆에 타서 찍어줘야 겠습니다. ㅎㅎ
(Nikon F3 / Zeiss Plannar 50mm / KODAK SUPRA 800 / Coolscan 5ED)
한줄요약 : 조그다이얼도 살림~
관심 있으실 분들을 위해 관련 소스코드는 아래 링크로 첨부했습니다.
맥클라이언트 obj-c 코드 수정을 지피티가 코칭해주는 대화도 재미로 올려놨습니다~
감사합니다. 또 뵙죠~
그나저나, 요샌 ChatGPT 말투 물씬 풍기는 글이 태반인데, 이런 정성글이라니 덕분에 감성도 채우고 갑니다.
조그다이얼....다음편도 기대하겠습니다.
클리에 추억을 저만 누리기는 아깝고, 기록의 의미도 있어 조금씩 풀어보는 중입니다~
지피티가 아니면 중간에 그만두고 클리에는 다시 서랍속으로 기나긴 동면하러 갔을 거에요 ㅎㅎ
조그도 그렇지만.. 카메라, 고해상도그래픽(지금의 고해상도는 아니지만), 와이파이,, 아직 뭐 더 해볼 건 많아보여요^^