osContInit.htm
4.52 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
157
<HTML>
<HEAD>
<TITLE>HTML 文書</TITLE>
<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0j">
</HEAD>
<BODY>
<P>
<B><FONT FACE="Arial">osContInit(3P) <BR>
</FONT></B>
<P>
<B>関数名<BR>
</B>
<P>
osContInit
<P>
→ ゲームコントローラのための初期設定
<BR>
<P>
<B>構文<BR>
</B>
<P>
#include <ultra64.h>
<P>
s32 osContInit(OSMesgQueue *mq, u8 *bitpattern, OSContStatus
*status);<BR>
<P>
<B>説明<BR>
</B>
<P>
osContInitは、コントローラを使用するための初期化関数です。コントローラ等で使用される内部変数の初期化などを行います。また、どのコントローラが接続されているのかをビットパターンbitpatternで返し、接続されているコントローラ、コントローラパックの状態を調べ、これをstatusに返します。
<P>
コントローラ、コントローラパック、EEP-ROMを使用する場合、必ず最初に一度この関数を呼ばなければなりません。
<P>
2回以上この関数を呼んでも意味がありません。2回目以降の呼び出しでは、何も行いません。つまり、コントローラの状態を調べることはできません。2回目以降、コントローラやコントローラパックの状態を調べたいときには、関数<A HREF="osContStartQuery.htm" >osContStartQuery</A>(3P)&osContGetQuery(3P)を使用してください。
<P>
statusに指し示される領域は、MAXCONTROLLERS個分のOSContStatus構造体が入るだけの大きさを確保しておく必要があります。メッセージ待ち行列mqはOS_EVENT_SIイベントに結びつけられたイニシャライズされたメッセージ待ち行列でなければなりません。この結合の作成方法についてはosSetEventMesg(3P)を参照してください。osContInitルーチンがメッセージ待ち行列mq上で待機状態になった後は、この待ち行列はシェアされてはいけません。コールが成功すれば0値が返され、そうでなければ-1が返されます。
<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>
接続されていないと認識されたコントローラ・ポート(bitpatternのビットが0、または、ステータスのエラーが0でない場合)は、コントローラのステータスのタイプ、および、ステータスの値は無効となります。そのため、まず最初にbitpatternを見て、接続されているかどうか判断してから、コントローラのタイプやステータスを見てください。
<P>
通常のコントローラを使用するアプリケーションの場合には、ステータスのタイプの、CONT_ABSOLUTEとCONT_JOYPORTのビットが立っていることを確認してください。
<P>
Nintendo64 OS Ver 2.0f以降では、コントローラのリセットは行いません。通常行う必要はないと思いますが、コントローラをリセットしたい場合には、<A HREF="osContReset.htm" >osContReset</A>(3P)を使用してください。
<BR>
<P>
<B>例<BR>
</B>
<P>
main()
<P>
{
<P>
OSMesgQueue intMesgQueue;
<P>
OSmesg intMesgBuf[1];
<P>
OSContStatus sdata[MAXCONTROLLERS]; <BR>
<P>
osCreateMesgQueue(&intMesgQueue, intMesgBuf, 1);
<P>
osSetEventMesg(OS_EVENT_SI, &intMesgQueue, dummyMessage);
<P>
osContInit(&intMesgQueue, &pattern, &sdata[0]);
<P>
}<BR>
<P>
<B>参照<BR>
</B>
<P>
<A HREF="osContReset.htm" >osContReset</A>(3P), <A HREF="osContStartQuery.htm" >osContStartQuery</A>(3P),
<P>
<A HREF="osContStartReadData.htm" >osContStartReadData</A>(3P),
<A HREF="osContGetQuery.htm" >osContGetQuery</A>(3P),
<P>
<A HREF="osContGetReadData.htm" >osContGetReadData</A>(3P), <A HREF="osContSetCh.htm" >osContSetCh</A>(3P)
<BR>
</BODY>
</HTML>