osContStartReadData.htm
2.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<HTML>
<HEAD>
<TITLE>HTML 文書</TITLE>
<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0j">
</HEAD>
<BODY>
<P>
<B><FONT FACE="Arial">osContStartReadData(3P) <BR>
</FONT></B>
<P>
<B>関数名<BR>
</B>
<P>
osContStartReadData, osContGetReadData
<P>
→ コントローラからのデータの獲得<BR>
<P>
<B>構文<BR>
</B>
<P>
#include <ultra64.h>
<P>
<B>s32 osContStartReadData(OSMesgQueue *mq);</B>
<P>
void osContGetReadData(OSContPad *pad);<BR>
<P>
<B>説明<BR>
</B>
<P>
<B>osContStartReadData</B>コールはコントローラの状態を獲得するためのリードコマンドを発行し、osContGetReadDataコールは3Dスティックとボタンの状態をOSContPad構造体のpadに返します。ユーザーはMAXCONTROLLERS個のOSContPad構造体に十分なメモリブロックをあらかじめ用意しておかなければなりません。メッセージキューmqはOS_EVENT_SIイベントに関連づけられた初期化済みのメッセージ待ち行列でなければなりません。メッセージキューに関しては<A HREF="osSetEventMesg.htm" >osSetEventMesg</A>(3P)を参照してください。リードデータコマンドを発行してからゲームコントローラデータを読み込むのにおよそ2msかかります。したがって、osRecvMesgコールを用いて,このイベントに対して待機しておくようにセットすると良いでしょう。
<BR>
<P>
ジョイスティックデータはsigned charで、-80〜80までの範囲です。ボタンの状態は、下記の定数のORで返ってきます。
<BR>
<PRE WIDTH=132>
START_BUTTON STARTボタン
A_BUTTON Aボタン
B_BUTTON Bボタン
U_CBUTTONS Cボタンユニット上
D_CBUTTONS Cボタンユニット下
L_CBUTTONS Cボタンユニット左
R_CBUTTONS Cボタンユニット右
U_JPAD 十字キー上
D_JPAD 十字キー下
L_JPAD 十字キー左
R_JPAD 十字キー右
Z_TRIG Zトリガーボタン
L_TRIG Lトリガーボタン
R_TRIG Rトリガーボタン
</PRE>
<P>
ゲームコントローラからのエラー返値は以下のようになります。 <BR>
<P>
<B>CONT_NO_RESPONSE_ERROR</B>
<P>
コントローラ反応無し
<P>
<B>CONT_OVERRUN_ERROR</B>
<P>
コントローラが本体の転送レートよりも速くデータ送ったときにセットされます。つまり本体はコントローラの値を正しく読めていません。
<BR>
<P>
CONT_OVERRUN_ERRORを検出したときはデータを無視してください。
<BR>
<BR>
<BR>
<P>
<B>例<BR>
</B>
<PRE WIDTH=132>
main()
{
OSMesgQueue intMesgQueue;
OSMesg intMesgBuf[NUM_MESSAGE];
OSContStatus sdata[MAXCONTROLLERS];
OSContPad rdata[MAXCONTROLLERS];
osCreateMesgQueue(&intMesgQueue, intMesgBuf, NUM_MESSAGE);
osSetEventMesg(OS_EVENT_SI, &intMesgQueue, dummyMassage);
osContInit(&intMesgQueue, &pattern, &sdata[0]);
osContStartReadData(&intMesgQueue);
・
・
osRecvMesg(&intMesgQueue, &actualMesg, OS_MESG_BLOCK);
osContGetReadData(&rdata[0]);
}
</PRE>
<P>
<B>参照<BR>
</B>
<P>
<A HREF="osContInit.htm">osContInit</A>(3P), <A HREF="osContReset.htm">osContReset</A>(3P),
<P>
<A HREF="osContStartQuery.htm">osContStartQuery</A>(3P), <A HREF="osContSetCh.htm">osContSetCh</A>(3P)
<BR>
</BODY>
</HTML>