1998/10/4
こうして取得した構造体のメンバを参照するだけで、容易にコントローラの入力を得ることができます。
typedef struct { Uint32 id; Uint32 support; Uint32 on; Uint32 off; Uint32 press; Uint32 release; Uint16 r; Uint16 l; Sint16 x1; Sint16 y1; Sint16 x2; Sint16 y2; Sint8* name; void* extend; Uint32 old; } PDS_PERIPHERAL;
id | デバイスID |
support | ボタン・レバーのサポート状態 |
on | デジタルボタン状態 |
off | デジタルボタン状態(反転) |
press | デジタルボタンダウンエッジ状態 |
release | デジタルボタンアップエッジ状態 |
r | アナログ軸Rの値(0〜255) |
l | アナログ軸Lの値(0〜255) |
x1 | アナログ軸X1の値(-128〜127) |
y1 | アナログ軸Y1の値(-128〜127) |
x2 | アナログ軸X2の値(-128〜127) |
y2 | アナログ軸Y2の値(-128〜127) |
name | デバイス名称 |
extend | 拡張データアドレス(未使用) |
old | 予約 |
typedef struct { Uint32 type; Uint32 reserved[3]; Uint8 is_root; Uint8 area_code; Uint8 connector_dir[2]; Sint8 product_name[32]; Sint8 license[64]; Uint16 stdby_pow; Uint16 max_pow; } PDS_PERIPHERALINFO;
type | ペリフェラルのタイプ |
reserved[3] | 予約 |
is_root | ルートデバイスフラグ |
area_code | エリアコード |
connector_dir[2] | 拡張コネクタの向き |
product_name[32] | 製品名 |
license[64] | ライセンス文字列 |
stdby_pow | スタンバイ消費電流 |
max_pow | 最大消費電流 |
本ライブラリではそれを簡略化し、以下のように定義します。
デバイス | デバイスID (id) | デバイス名称文字列 (name) |
---|---|---|
標準コントロールパッド | PDD_DEV_CONTROLLER | デバイス自体が持つ製品名 |
以下の表にしたがってビットアサインが決まっており、ボタン・レバーを持つ場合は1、持たない場合は0が格納されています。
コントローラ系デバイスは、十字キーA、スタートボタン、Aボタン、Bボタンを持つことが必須となっているため、
これらのボタンのみを使用してアプリケーションを組むことにより、互換性を維持することができます。
ボタン・レバー | ビット位置指定用定数 |
---|---|
十字キーA上 | PDD_DEV_SUPPORT_KU |
十字キーA下 | PDD_DEV_SUPPORT_KD |
十字キーA左 | PDD_DEV_SUPPORT_KL |
十字キーA右 | PDD_DEV_SUPPORT_KR |
十字キーB上 | PDD_DEV_SUPPORT_KUB |
十字キーB下 | PDD_DEV_SUPPORT_KDB |
十字キーB左 | PDD_DEV_SUPPORT_KLB |
十字キーB右 | PDD_DEV_SUPPORT_KRB |
スタートボタン | PDD_DEV_SUPPORT_ST |
Aボタン | PDD_DEV_SUPPORT_TA |
Bボタン | PDD_DEV_SUPPORT_TB |
Cボタン | PDD_DEV_SUPPORT_TC |
Xボタン | PDD_DEV_SUPPORT_TX |
Yボタン | PDD_DEV_SUPPORT_TY |
Zボタン | PDD_DEV_SUPPORT_TZ |
Dボタン | PDD_DEV_SUPPORT_TD |
アナログ軸R | PDD_DEV_SUPPORT_AR |
アナログ軸L | PDD_DEV_SUPPORT_AL |
アナログ軸X1 | PDD_DEV_SUPPORT_AX1 |
アナログ軸Y1 | PDD_DEV_SUPPORT_AY1 |
アナログ軸X2 | PDD_DEV_SUPPORT_AX2 |
アナログ軸Y2 | PDD_DEV_SUPPORT_AY2 |
デジタルボタン | ビット位置指定用定数 |
---|---|
十字キーA上 | PDD_DGT_KU |
十字キーA下 | PDD_DGT_KD |
十字キーA左 | PDD_DGT_KL |
十字キーA右 | PDD_DGT_KR |
Aボタン | PDD_DGT_TA |
Bボタン | PDD_DGT_TB |
Cボタン | PDD_DGT_TC |
Dボタン | PDD_DGT_TD |
Xボタン | PDD_DGT_TX |
Yボタン | PDD_DGT_TY |
Zボタン | PDD_DGT_TZ |
Lボタン | PDD_DGT_TL |
Rボタン | PDD_DGT_TR |
スタートボタン | PDD_DGT_ST |
十字キーB上 | PDD_DGT_KUB |
十字キーB下 | PDD_DGT_KDB |
十字キーB左 | PDD_DGT_KLB |
十字キーB右 | PDD_DGT_KRB |
メンバ
なお、デジタルLRボタン情報は、アナログLR情報からソフトウェアで擬似的に生成しています。
アナログLRボタンを持たないデバイスの場合、ビットは変化しませんので注意してください。
(デジタルLRボタンを物理的に持つデバイスはありません)
メンバ | 符号 | レンジ | センター位置 | レバー/ボタン |
---|---|---|---|---|
Uint16 r | 符号なし | 0〜255 | 0 | アナログRボタン |
Uint16 l | 符号なし | 0〜255 | 0 | アナログLボタン |
Sint16 x1 | 符号付き | -128〜0〜127 | 0 | アナログレバーX1 |
Sint16 y1 | 符号付き | -128〜0〜127 | 0 | アナログレバーY1 |
Sint16 x2 | 符号付き | -128〜0〜127 | 0 | アナログレバーX2 |
Sint16 y2 | 符号付き | -128〜0〜127 | 0 | アナログレバーY2 |
メンバ | 設定値 |
---|---|
id,name,extend | 前回の値 |
デジタルボタン | すべてボタンが押されていない状態 |
アナログ軸 | センター位置 |
エラーが発生したかどうかは、関数pdGetPeripheralError()で調べることができます。
エラーコード | 内容 |
---|---|
PDD_ERR_OK | エラーなし |
PDD_ERR_RETRY | ボタンデータが正常に取得できませんでした |
PDD_ERR_GENERIC | 未定義エラー |
ビット位置指定マクロ | 持っている機能 |
---|---|
PDD_DEVTYPE_CONTROLLER | コントローラ |
PDD_DEVTYPE_STORAGE | バックアップRAM |
PDD_DEVTYPE_LCD | モノクロ液晶 |
PDD_DEVTYPE_TIMER | タイマ |
PDD_DEVTYPE_SOUNDINPUT | 音声入力 |
PDD_DEVTYPE_ARGUN | GUN |
PDD_DEVTYPE_KEYBOARD | キーボード |
ビット位置指定マクロ | 仕向地 |
---|---|
PDD_DEVAREA_USA | 北アメリカ地区 |
PDD_DEVAREA_JAPAN | 日本地区 |
PDD_DEVAREA_ASIA | アジア地区 |
PDD_DEVTYPE_EUROPE | ヨーロッパ地区 |
指定マクロ | コネクタ方向 |
---|---|
PDD_CONDIR_TOPSIDE | 上側 |
PDD_CONDIR_BOTTOMSIDE | 下側 |
PDD_CONDIR_LEFTSIDE | 左側 |
PDD_CONDIR_RIGHTSIDE | 右側 |
関数 | 機能 |
---|---|
pdGetPeripheral | コントローラのボタン状態を取得する |
pdGetPeripheralError | コントローラに関するエラーを取得する |
pdExecPeripheralServer | ペリフェラルデータ取得サーバ関数 |
pdGetPeripheralInfo | ペリフェラル情報の取得 |
pdTmrAlarm | アラームを鳴らす |
per = pdGetPeripheral(PDD_PORT_A0);
if (per->press & PDD_DGT_ST) {
/* スタートボタンが押された */
:
:
}
err = pdGetPeripheralError(PDD_PORT_B0);
const PDS_PERIPHERALINFO* info; info = pdGetPeripheralInfo(PDD_PORT_A1); if (info->type & PDD_DEVTYPE_LCD) { /* このペリフェラルは液晶を持っている */ : } if (info->area_code & PDD_DEVAREA_USA) { /* このペリフェラルは北アメリカ向けである */ : } /* 製品名とライセンスを表示する */ njPrintC(NJM_LOCATION(0, 0), info->product_name); njPrintC(NJM_LOCATION(0, 1), info->license);
const PDS_PERIPHERAL* per; per = pdGetPeripheral(PDD_PORT_A1); if (per->info->type & PDD_DEVTYPE_LCD) { /* このペリフェラルは液晶を持っている */ : } if (per->info->area_code & PDD_DEVAREA_USA) { /* このペリフェラルは北アメリカ向けである */ : } /* 製品名とライセンスを表示する */ njPrintC(NJM_LOCATION(0, 0), per->info->product_name); njPrintC(NJM_LOCATION(0, 1), per->info->license);
Uint8 data[4]; Uint32 ret; data[0] = 0xc0; data[1] = 0x80; data[2] = 0x00; data[3] = 0x00; ret = pdTmrAlarm(PDD_PORT_A1, data); if (ret != PDD_TMRERR_OK) { /* 鳴らせなかった */ }