osContStartQuery.htm 3.67 KB
<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 &lt;ultra64.h&gt;
<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(&amp;intMesgQueue, intMesgBuf, NUM_MESSAGE);
<P>
osSetEventMesg(OS_EVENT_SI, &amp;intMesgQueue, dummyMessage);
<P>
osContInit(&amp;intMesgQueue, &amp;pattern, &amp;sdata[0]);
<P>
osContStartQuery(&amp;intMesgQueue);
<P>

<P>

<P>
osRecvMesg(&amp;intMesgQueue, &amp;actualMesg, OS_MESG_BLOCK);
<P>
osContGetQuery(&amp;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>