devkitPro 1.4.9的タッチスクリーンの使いかた。


RGKT-NDS-STDY-011(001)
RGKT-NDS-MEMO-001(002)


consoleInit()
bgInit()
フレームバッファモード
チャタリング
タッチスクリーン


とざっくり駆け巡ってみたのですが
タッチスクリーンが一番解説簡単なんでこちらを。
結構簡単に説明済ませちゃってますが
プログラミングへの実装の参考程度にはなるかと。


touch screen test.


libnds で整備されてる関数のおかげで
誰でも簡単にタッチスクリーンというインターフェイスを利用することができます。
実際はもっと複雑な処理が裏では動いてて(ARM7用の touch.c を見ると分かりますが)、
その恩恵でもって簡単に扱えるだけということは知っておいて欲しいです。
能書きはいいので実際の使いかたをば。


タッチスクリーンの入力情報は以下2関数を使うことで取得することができる。

touchPosition touchReadXY(void)
void touchRead(touchPosition *data)


入力情報は touchPositon 構造体で持つことになるので
利用する際は touchPositon 型の変数を最初に用意しておくこと。

touchPosition touch;


構造体メンバー変数の内訳は以前と変わらない。
補正前データ用のメンバー変数名が'x', 'y' から "rawx", "rawy" にリネームされてる以外は
旧バージョンと同じものだと考えてよいだろう。

typedef struct {
	u16	rawx; //!< Raw x value from the A2D
	u16	rawy; //!< Raw x value from the A2D
	u16	px;   //!< Processes pixel X value
	u16	py;   //!< Processes pixel Y value
	u16	z1;   //!< Raw cross panel resistance
	u16	z2;   //!< Raw cross panel resistance
} touchPosition;


rawx, rawy:補正前の X 検出生データ、補正前の Y 検出生データ
px, py:補正された X 座標 (0-255) データ、補正された Y 座標 (0-191) データ

付属のタッチペンの形状ではどうしても画面端の座標を押すのが厳しいので
(シャーペンなど先端の細いものでなら取得可能だが)
コードに実装するときは4ピクセルぐらいゆとりを持たせると良いと思う。


z1, z2 抵抗膜式タッチパネルの接触時の抵抗値
エミュレータで見ることのできない値なのでDSL実機で動かして試してみたところ
筆圧感知とは違うと思うが、圧力が掛かるほど抵抗値も増分されてるので
工夫次第ではソフト的に筆圧検知も出来そうな気がする。


タッチスクリーン入力情報の取得の為の関数2種は
どちらも同じ動作であって情報の取得方法が
ポインタ渡しなのか返値で得るかの違いなので分かりやすい方を使うとよい。
旧バージョンからある touchReadXY() 関数は返値で情報を取得する。

touch = touchReadXY();


新バージョンから加わった touchRead() 関数はポインタ渡しで情報を取得する。

touchRead(&touch);


実のところ touchReadXY() の内部では touchRead() が更に呼び出され、得られたデータを
返値として返してるだけなので、
微々たる速度や資源もケチりたいなんて方は touchRead() 関数を使用することを進めておく。


尚、タッチの有無だけを単純に知りたい場合は
わざわざ構造体変数を用意してタッチスクリーン入力関数でデータ取得なんてする必要は無くて、
scanKeys() でキー状態を得て、
キー入力関数と KEY_TOUCH マクロ定義で論理積を取れば入力があったがどうかが調べられる。

scanKeys();

///

if(keysDown() & KEY_TOUCH){
	//タッチスクリーンに接触があったときの処理
}


実機テスト用「touch screen test.」ソースコード

//---------------------------------------------------------------------------------
//	
//	touch screen test.
//	
//	Feb 03, 2009
//	CODING BY. AYUMI.K @REGEKATSU
//	This program was made from devkitPro Version 1.4.9
//	
//	REGEKATSU
//	-Console/Homebrew Programming-
//
//	this web site.
//	http://akiba.geocities.jp/consolehomebrewprogramming/
//
//---------------------------------------------------------------------------------
#include <nds.h>
#include <stdio.h>

int main(void)
{
	
	touchPosition touch;
	
	consoleDemoInit();
	
	iprintf("touch screen test.\n");
	iprintf("Feb 03, 2009\n");
	iprintf("CODING BY. AYUMI.K @REGEKATSU\n");
	
	while(1) {
		
		touchRead(&touch);
		
		iprintf("\x1b[4;0HtouchPosition.rawx = %04d", touch.rawx);
		iprintf("\x1b[5;0HtouchPosition.rawy = %04d", touch.rawy);
		iprintf("\x1b[6;0HtouchPosition.x = %03d", touch.px);
		iprintf("\x1b[7;0HtouchPosition.y = %03d", touch.py);
		iprintf("\x1b[8;0HtouchPosition.z1 = %04d", touch.z1);
		iprintf("\x1b[9;0HtouchPosition.z2 = %04d", touch.z2);
		
		swiWaitForVBlank();
		
	}
	
	return 0;
	
}