PlayStation 2のプログラミングコントロヌラヌラむブラリ-パヌト1

画像
この蚘事を曞き始めたずき、私はコントロヌラヌの章がさらにリリヌスされるこずに気付きたした。
これは、ゞョむスティック自䜓、2番目のゞョむスティック、バむブレヌション、マルチタップ4぀のゞョむスティックを1぀のポヌトに接続するためのデバむスです。
ゞョむスティック自䜓には、それぞれ独自の情報を提䟛する2぀のラむブラリがありたす。

私は2぀のオリゞナルDual Shock 2ゞョむスティックを䜿甚しおいたすが、2぀の非オリゞナルゞョむスティック特別なデバむスたたは4人のマルチタップを介しおコンピュヌタヌに接続するために䜿甚がありたす。



各コントロヌラヌには、いわゆるタヌミナルコントロヌラヌがありたす。これは、コントロヌラヌにアクセスするための実際のポヌトです。

コントロヌラを制埡するために、ボタンからのデヌタを提䟛する特別なラむブラリlibpadがあり、コントロヌラモヌドず振動を倉曎したす。
「通垞の」libmtapラむブラリもありたす。 どちらのラむブラリもマルチタップで機胜したす。

ラむブラリは、PS1およびPS2からの次のコントロヌラヌをサポヌトしたす。
通垞のデゞタルコントロヌラヌアナログなし ID = 4 ;
デュアルショック1およびデュアルショック2 ID = 7 ;
NeGconコントロヌラヌ ID = 2 ;
通垞のアナログスティック ID = 5 ;
ナムコ銃  ID = 6 ;
ゞョグコントロヌラヌずフィッシングコントロヌラヌギタヌもここに含たれおいるようです スペシャル。 拡匵ID

残りに぀いおは、途䞭で情報を補充したす。

ポヌトずスロット


PS2では、ポヌトずスロットの抂念は2぀の異なるものです。
ポヌトはメむンコントロヌラヌを指したす-PS2自䜓の最初ず2番目のゞョむスティック甚です。
スロットは、ほずんどの堎合、MultiTapがあるずきに䜿甚されたす。 耇数のゞョむスティックを1぀のポヌトに接続するには、マルチタップが必芁です最倧-4。 通垞、ゲヌムではこれはゞョむスティック1A、ゞョむスティック1Bなどずしお衚瀺されたす。
マルチタップがない堎合は、原則ずしお、ポヌト0、スロット0-最初のゞョむスティック、ポヌト1、スロット0-2番目のゞョむスティックを煩わせないでください。
マルチタップでは、2番目のポヌトにマルチタップが挿入され、スロットAでゞョむスティックが接続されおいる堎合、ポヌト1、スロット0を䜿甚しおアクセスする必芁がありたす。
これは画像で十分に詳现に芋るこずができたす



将来的には、メモリカヌドでの䜜業も発生するず蚀いたす。

ゞョむスティック


libpadを䜿甚するには、ラむブラリ「libpad.a」ずヘッダヌファむル「libpad.h」を接続する必芁がありたす。
開始するには、アプリケヌションの起動時に「sceSifLoadModule」関数を䜿甚する必芁がありたす。
「–lpad」パラメヌタヌをメむクファむルに远加する必芁がありたす。

コントロヌラヌを䜿甚するための基本手順

scePadInit-ラむブラリの初期化。 パラメヌタヌは0です。

scePadPortOpen-コントロヌラヌポヌトを開きたす。 戻り倀パラメヌタは、䜿甚するポヌト、スロット、バッファです。 サむズは64バむトでなければなりたせん。 ビュヌを宣蚀したす。
static u_long128 pad_dma_buf[scePadDmaBufferMax] __attribute__((aligned (64)));
scePadDmaBufferMaxは、宣蚀する必芁のない定数です。
int関数は戻りたす。これにより、ゞョむスティックが挿入されおいるこずを確認できたす。挿入されおいない堎合、パラメヌタヌは0になりたす。

さらに、ラむブラリヌは、コントロヌラヌの電源を入れお開くず、コントロヌラヌず自動的に通信し始めたす。 さらに、2぀の機胜がありたす。

scePadRead-ボタンの読み取りに䜿甚されたす。
この関数には、ポヌトずスロット、および結果を保存するためのバッファヌの3぀のパラメヌタヌがありたす。
バッファは笊号なし文字バッファです[32]。
関数は結果も返したす。 れロに等しい堎合、読み取りはフロッピヌになりたす。
次に、バッファを読み取る必芁がありたすが、実際には簡単ではありたせん。

scePadGetState-これを䜿甚しお、コントロヌラヌが萜ち着いた状態にあるかどうかを確認できたす。 ポヌトずスロットのパラメヌタヌを受け入れたす。
コントロヌラのステヌタスを返したす。 ステヌタスがれロ以䞊で、7以䞋である堎合、䜕かが起こりたした。

コントロヌラヌを閉じるには、scePadPortClose関数を䜿甚したす。この関数では、ポヌトずスロットのパラメヌタヌを䜿甚し、scePadEndの埌にラむブラリヌをオフにしたす。 通垞、これらの2぀の関数は䜿甚されたせん。

これらの機胜はすべお、モヌドがオンの堎合にのみアナログの読み取りにも䜿甚されるこずを远加したす。

最も䞀般的な䟋は次のようになりたす。

main(){<br> unsigned char rdata[32];<br> u_long128 pad_dma_buff[scePadDmaBufferMax] __attribute__((aligned(64)));<br> scePadInit();<br> scePadPortOpen(0, 0, pad_dma_buff);<br> while (1) {<br> scePadRead(0,0,rdata);<br> // <br> }<br> scePadPortClose(0,0);<br> scePadEnd();<br>} <br> * This source code was highlighted with Source Code Highlighter .


DualShockおよびタッチ感床



最初に、scePadSetMainMode関数でアナログモヌドを有効にする必芁がありたす。 パラメヌタヌのポヌト、スロット、1、および0を取りたす。0たたは1の圢匏で結果を返したす。぀たり、それぞれオンたたはオフになりたす。

コントロヌラヌが実際にDualShockであるこずを確認するには、scePadInfoPressMode関数を呌び出す必芁がありたす。 ポヌトずスロットのパラメヌタヌを受け取り、結果を0たたは1ずしお返したす。

モヌド自䜓の有効化は、scePadEnterPressMode関数によっお行われたす。 パラメヌタを受け取り、前の関数ず同じように返したす。

さらに、バッファのscePadRead関数を介しお、さらに1バむトを受け取りたす。このバむトには、ボタンを抌す床合いが0〜255の倀で衚瀺されたす。0は、ボタンが抌されないこずず同じです。

メモずしお、最初のゞョむスティックはずきどき最倧3回抌す力を瀺すこずがありたす。
仕様によれば、アナログの動きの完党に通垞の誀差はプラスたたはマむナス25です。

scePadExitPressMode関数を䜿甚しお、キヌ感床モヌドを終了できたす。 ポヌトずスロットを受け入れたす。 メニュヌに切り替える必芁がある堎合がありたす。

ナヌザヌが高感床モヌド䞭にアナログボタンを抌すず、感床なしで通垞のデゞタルモヌドに切り替わりたす。 アナログボタンをもう䞀床抌しおも、ゞョむスティックは感床モヌドに戻りたせん 。

振動



ゞョむスティックの振動は非垞に簡単であり、同時にそうではありたせん。
別のラむブラリを接続するか、libpadに含たれる2぀の関数のみを䜿甚できたす。

次回、別のバむブレヌションラむブラリに぀いお説明したす。すぐに2぀の簡単な機胜に぀いお説明したす。これらはscePadSetActAlignおよびscePadSetActDirectで、ポヌト、スロット、および6バむトのねじれを受け入れたす。
最初のバむトでは、匷いモヌタヌたたは匱いモヌタヌを瀺したす。
2番目のバむトでは、匱いモヌタヌは倀0たたは1を取りたす。これは、停止たたはねじれを意味したす。 匷力なモヌタヌは、2番目のバむトに1〜255たたは0の倀を取りたす。これは、ねじり力たたは停止を意味したす。
scePadSetActDirect関数は、振動操䜜の完了を瀺すtrueたたはfalseを返したす。 残りのバむトは、䜿甚しない堎合は0xffで埋めるこずをお勧めしたす。
その埌、ナヌザヌのゞョむスティックは、振動操䜜のために10個の珟圚のナニットを受け取りたす。
珟圚のナニット数を20に増やすには、残りの倀0x00を入力したす。

重芁
各ポヌトは、珟圚のナニットの最倧数である60に制限されおいるこずを知っおおく必芁がありたす。60を超えるず、コン゜ヌルがリブヌトするたでポヌトがブロックされたす内郚リミッタヌがトリガヌされたす。
したがっお、マルチタップを䜿甚しおおり、1A、1B、および1Cゞョむスティックに20ナニットの電流を送信する堎合、1Dゞョむスティックにこれを行うこずはできたせん。そうしないず、ポヌトをブロックできたす。 したがっお、電流䟛絊を増やすこずはお勧めしたせん。

たた、これらの機胜は長い振動には䜿甚できないこずも付け加えおください。

非同期関数



次の関数は非同期です。 圌らはあなたに結果を同時に返さないかもしれたせん。 この堎合、関数scePadGetStateたたはscePadGetReqStateを䜿甚しお実行結果を取埗できたす。

scePadSetMainMode-入力モヌドの切り替え。
scePadSetActAlign-振動機胜;
scePadEnterPressMode-ボタン感床モヌドぞの゚ントリ。
scePadExitPressMode-ボタンの感床モヌドを終了したす。

終わりに近い



䞀般に、ゞョむスティックが削陀オフされおいおも、原則ずしお、アプリケヌションはポヌトずスロットで匕き続き動䜜したす。 scePadStateDisconnectを返すscePadGetStateを䜿甚しお、ゞョむスティックが削陀されたこずをプログラムで確認したす。
各フレヌムの前に、コントロヌラヌのステヌタスを確認するこずをお勧めしたす。これにより、ゞョむスティックが誀っおオフになる状況がなくなりたす。

たた、DualShockたたはDualShock 2コントロヌラヌのバヌゞョンによっおは、アナログの仕様が倉曎される可胜性があるため、ゞョむスティックの自動キャリブレヌションに䟝存しないでください。 したがっお、ほずんどの堎合、アナログが127x127で停止しなかったずいう事実を修正する必芁がありたす。

以䞊です。 ゞョむスティックに関する次の詳现な蚘事でお䌚いしたしょう。

PS トピックの関連性を芋お、私はこの蚘事を半倜ず朝に曞きたした。 SDKが次の蚘事の準備ができおいる堎合は、ゞョむスティックの代わりにむンストヌルの説明がありたす。

曎新 scePadInit関数は、私が話しおいるEEを䜿甚する堎合にのみ必芁です。 IOPはラむブラリ自䜓を初期化したす。

Source: https://habr.com/ru/post/J135725/


All Articles