osContStartQuery.htm
3.67 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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<HTML>
<HEAD>
<TITLE>HTML 文書</TITLE>
<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0j">
</HEAD>
<BODY>
<P>
<B><FONT FACE="Arial">osContStartQuery(3P) <BR>
</FONT></B>
<P>
<B>関数名<BR>
</B>
<P>
osContStartQuery, osContGetQuery
<P>
→ ゲームコントローラの状態取得<BR>
<P>
<B>構文<BR>
</B>
<P>
#include <ultra64.h>
<P>
s32 osContStartQuery(OSMesgqueue *mq);
<P>
void osContGetQuery(OSContStatus *status);<BR>
<P>
<B>説明<BR>
</B>
<P>
コントローラが挿し込まれているかどうか,コントローラの種類はどういったものなのかなど、コントローラの状態を調べるときに使用するのがosContStartQueryです。
<P>
osContStartQueryはコントローラのステータスとタイプを獲得するためのクエリーコマンドをコントローラに対して発行します。そして、osContGetQueryコールはゲームコントローラのステータスとタイプをstatusに返します。
<P>
statusに指し示される領域は、MAXCONTROLLERS個分のOSContStatus構造体が入るだけの大きさを確保しておく必要があります。メッセージ待ち行列mqはOS_EVENT_SIに結びつけられた初期化されたメッセージ待ち行列でなければなりません。この結合の生成方法についてはosSetEventMesg(3P)を参照してください。クエリーコマンドがゲームコントローラからの返値を引っ張ってくることに、およそ2ミリ秒かかるでしょう。従って、メッセージ待ち行列mqでのosRecvMesgコールはこのイベントのために待機しておくために使用されます。
<BR>
<P>
<PRE>
typedef struct {
u16 type; /* コントローラの種類 */
u8 status; /* コントローラパックの状態 */
u8 errno;
}OSContStatus;
</PRE>
<BR>
<P>
コントローラの状態に応じて、status->typeには以下のビットが立てられます。
<BR>
<P>
<B>CONT_ABSOLUTE</B>
<P>
コントローラは内部にカウンタを含み、ジョイスティックのデータを絶対値で
送ります。通常のコントローラはこれになります。
<P>
<B>CONT_RELATIVE</B>
<P>
コントローラは内部にカウンタを含み、ジョイスティックのデータを相対値で
送ります。
<P>
<B>CONT_JOYPORT</B>
<P>
コントローラパックが接続可能なジョイポートが付いています。<BR>
<P>
<BR>
<P>
コントローラパックの状態に応じて、status->statusには以下のビットが立てられます。<BR>
<P>
<B>CONT_CARD_ON</B>
<P>
このビットはコントローラにコントローラパックが接続されているときにセットされ
ます。
<P>
<B>CONT_CARD_PULL</B>
<P>
コントローラのリセット後に、コントローラパックが抜かれたときに、このビッ
トがセットされます。
<P>
<B>CONT_ADDR_CRC_ER</B>
<P>
このビットはアドレスがジョイポートに正しく転送されなかったときにセット
されます。<BR>
<P>
<BR>
<P>
コントローラからの読み込みに異常があった場合、status->errorは以下の値を取ります。<BR>
<P>
<B>CONT_NO_RESPONSE_ERROR</B>
<P>
コントローラ反応なし。コントローラが挿し込まれていません。
<P>
<B>CONT_OVERRUN_ERROR</B>
<P>
コントローラがハードウェアのハンドリング能力よりも高いデータ転送速度で
データを送ったときにセットされます。この場合、データは無視してください。<BR>
<P>
<B>例<BR>
</B>
<P>
main()
<P>
{
<P>
OSMesgQueue intMesgQueue;
<P>
OSMesg intMesgBuf[NUM_MESSAGE];
<P>
OSContStatus sdata[MAXCONTROLLERS]; <BR>
<P>
osCreateMesgQueue(&intMesgQueue, intMesgBuf, NUM_MESSAGE);
<P>
osSetEventMesg(OS_EVENT_SI, &intMesgQueue, dummyMessage);
<P>
osContInit(&intMesgQueue, &pattern, &sdata[0]);
<P>
osContStartQuery(&intMesgQueue);
<P>
・
<P>
・
<P>
osRecvMesg(&intMesgQueue, &actualMesg, OS_MESG_BLOCK);
<P>
osContGetQuery(&sdata[0]);
<P>
}<BR>
<P>
<B>参照<BR>
</B>
<P>
<A HREF="osContInit.htm" >osContInit</A>(3P), <A HREF="osContReset.htm" >osContReset</A>(3P),
<P>
<A HREF="osContStartReadData.htm" >osContStartReadData</A>(3P),
<A HREF="osContGetReadData.htm" >osContGetReadData</A>(3P),
<P>
<A HREF="osContSetCh.htm" >osContSetCh</A>(3P)<BR>
</BODY>
</HTML>