PalmTablet
Up$Date: 2000/04/28 12:16:59 $ $Revision: 1.2 $

PalmTabletはPalmPilotをシリアルケーブルでPCなどに接続して タブレットのかわりにするためのプログラムです。 Palm上のペンイベントをテキスト形式にして9600bpsでシリアル出力するだけです。
実行形式ファイルはこちら palmtablet.prc

本資料では Web上の文芸的プログラミングの手法にもとづき ドキュメントとプログラムをひとつのHTMLに記述しています。 プログラムを取り出すには wtangleプログラムを使用して下さい。

Makefile

Makeするとpalmtablet.prcが生成されます。
GCCのPalm開発環境を想定してます。 ちょっと古いのでbuild-prcとかpilrcとかそのまま使えるかどうか不明です。

CC=m68k-palmos-coff-gcc
CFLAGS = -O2 -g
PILRC = pilrc
TXT2BITM = txt2bitm
OBJRES = m68k-palmos-coff-obj-res
BUILDPRC = build-prc

ICONTEXT = "PalmTablet"
APPID = PMTB

palmtablet.prc: palmtablet
	$(OBJRES) palmtablet
	$(BUILDPRC) palmtablet.prc $(ICONTEXT) $(APPID) *.grc

palmtablet: palmtablet.o
	$(CC) palmtablet.o  -o palmtablet

palmtablet.c: palmtablet.html
	wtangle palmtablet.html

install:
	pilot-xfer /dev/ttyd2 -i palmtablet.prc

clean:
	- /bin/rm -f #* *~ *.c *.o *.grc
	/bin/rm core a.out palmtablet

プログラムソース

SerSend()はPalmOS1.0と2.0で仕様が変わったようで、 ここではPalm2.0上のコンパチ関数SerSend10()を使っています。 PalmOS3.xではどうなっているか知りません。

Graffitiエリアで何か字を書くと画面が消去されます。

起動したとき何故かPenUpイベントが来るので無視するようにしているが そういうものだったろうか...?

//
//	$Date: 2000/04/28 12:16:59 $
//	$Revision: 1.2 $
//
#pragma pack(2)
#include 
#include 
#include 

UInt serref;

void InitApplication()
{
	Err err;
	err = SysLibFind("Serial Library",&serref);
	ErrFatalDisplayIf(err,"no ser lib");
	err = SerOpen(serref, 0/*port*/, 9600L );
}

void StopApplication()
{
	SerClose(serref);
}

static Boolean ApplicationHandleEvent(EventPtr event)
{
	Char buf[100];
	Char c;
	RectangleType rect;
	static Word x=-1,y=-1;
	switch(event->eType){
	case penDownEvent:
		sprintf(buf,"D %d %d\n",event->screenX,event->screenY);
		SerSend10(serref,buf,StrLen(buf));
		break;
	case penMoveEvent:
		sprintf(buf,"M %d %d\n",event->screenX,event->screenY);
		SerSend10(serref,buf,StrLen(buf));
		WinDrawLine(x,y,event->screenX,event->screenY);
		break;
	case penUpEvent:
		if((int)x >= 0){	
			sprintf(buf,"U %d %d\n",event->screenX,event->screenY);
			SerSend10(serref,buf,StrLen(buf));
			WinDrawLine(x,y,event->screenX,event->screenY);
		}
		break;
	case keyDownEvent:
		rect.topLeft.x=0;
		rect.topLeft.y=0;
		rect.extent.x=160;
		rect.extent.y=160;
		WinEraseRectangle(&rect,0);
		sprintf(buf,"\n");
		SerSend10(serref,buf,StrLen(buf));
		break;
	default:
		return false;
	}
	x = event->screenX;
	y = event->screenY;
	return true;
}

DWord PilotMain(Word cmd, Ptr cmdPBP, Word launchFlags)
{
	EventType event;
	Word error;
	int i;

	if (cmd == sysAppLaunchCmdNormalLaunch)
	{
		InitApplication();

		do {
			EvtGetEvent(&event, evtWaitForever);
			if (SysHandleEvent(&event)) continue;
			if (MenuHandleEvent(NULL, &event, &error)) continue;
			if (ApplicationHandleEvent(&event)) continue;
			FrmDispatchEvent(&event);
		}
		while (event.eType != appStopEvent);

		StopApplication();
	}
	return 0;
}