TOP / TEC / USB /

■ Macro Pad ■


■概要
デュアルショック2のUSBアダプタを改造し、マクロ機能を組み込みます。
今回はかなり本格的です。

通常はデュアルショック2をUSBゲームパッドとして使うためのアダプタ、しかし特定操作をすることで予め設定したマクロが動作して勝手に操作データを送り出します。
マクロはPC上のアプリからプログラミング可能です。
マクロ自体の機能もボタン押下や軸操作に加えて、ウェイトやループといった制御構造を持つそれなりに構造的なものです。

ちなみにZT4やds2-USBではデュアルショック2のみを対象としていましたが、今回は地球に優しいリサイクルを主眼に、旧デュアルショックも対応します。


■目的
Windows上で動作するアプリで、とても人間にさせる内容とは言えない機械的な単純作業を強いられることがあります。
この人件費がバカみたいに高く、コンピュータは価格崩壊する世の中で人間様に単純作業をさせることほど勿体無いことはありません。
普通のアプリであればVBか何かで単純にSendKeyなどでキーストロークを送ってやれば済むんですが、中にはDirectInputしか見ていないやつ、他のアプリからのメッセージは破棄するやつなど、無礼者がいます。

ならば、人間様の腕をサイボーグ化してしまえば文句無かろう。
というのが始まりです。

まあよくあるゲームなどですな、ゲームパッドからの入力しか受け付けないのであれば、そのゲームパッド自体を自動化してしまおうという作戦です。

具体的に言っちゃうとファンタシースター某で補助魔法のレベル上げのため延々と魔法発動→チャージマシン使用を繰り返す時とか。


■HW構成
ZT4-USBそのままです。


■SW構成
□ターゲット
・デバイスFW:MacroPad_v7_2.zip

簡単なブロック図を以下に示します。

blocks

モジュールという表現をしていますが、単なるソース上の関数の塊です。
まず右上から行きますと、
「擬似プレステモジュール」
これがPS(又はPS2)の振りをしてデュアルショック(又はデュアルショック2及びその互換品)から全ボタンデータを取得します。
ZT4やds2-USBと異なり、ds2ネイティブステートまで進めていませんので内部的には全て初代デュアルショックとして互換動作しています。
後述するタイマ管理モジュールからの16ms経過メッセージを受ける毎に「PADデータバッファ」を更新します。

ZT4やds2-USBはほぼここが全てでした。

次に左上に行って、
「マクロモジュール」
今回追加のメイン、ここだけで一種の仮想アセンブラを構成しています。
「実行エンジン」が仮想インストラクションを解釈実行します。
データは「スクリプト用メモリ」に直列に配置されており、現在実行している行はその名も「プログラムカウンタ」により制御しています。
仮想インストラクションの内、制御構文でないPADデータ更新命令を実行する時、「PADデータバッファ」を更新します。


真ん中の、
「PADデータバッファ」
USBのゲームコントローラとしてPCに対して送信するデータの一次バッファです。
デュアルショック(以降DS)用とマクロ用で別々に持っており、通常はDS用を、マクロ実行中の場合はマクロ側をPCに送信することになります。


飛ばして下へ行きます
「USBコントローラ」
エンドポイントというPCとの通信で使う端点があります。
事実上の送受信バッファです。
今回のFWでは入出力それぞれ1つずつしか使用しません。
なお、USBでは明確にホスト→ターゲット方向をOUT、逆をINと定義していますので、ターゲットデバイスを開発する場合は出て行くほうがINパケットになります。
通常時はDS用、マクロ実行中であればマクロ用バッファの内容をこのINバッファに転記することで送信されます。

逆に、USB経由でPCから来たデータはOUT1バッファに格納されます。
このとき、USB関連割込み機能で受信が通知され、後述の「コマンド解釈モジュール」がPCからの制御コマンドを解釈実行します。

またUSBでは(LowSpeedを除き)1ms周期でSOF(Start of Frame)というパケットが届きます。
これを割込みで拾い、デバイス内のタイマ管理モジュールに1msの基準クロックとして渡します。


「コマンド解釈モジュール」
PCからの受信データを解釈し、マクロの開始、停止、スクリプトの初期化や個別書き込みなどを実行します。
なおマクロの開始停止に関しては「擬似PSモジュール」側にも仕込まれていて、SELECT+上下キーによって操作できるようになっています。


「タイマ管理モジュール」
1msの基準クロックからPADポーリング用の16ms、「WAIT」仮想インストラクションやボタンデータ更新のホールドタイムに用いる500msなどを生成管理します。


□ホスト
・ドライバ:不要
・設定ソフト:MacroPadTool

例によって標準HIDゲームコントローラとして動作しますので専用のドライバは不要です。
設定ソフトはVBで作成しましたが、配布条件とかよくわからないので公開していません。

基本機能:
 1.(設定ファイルで)指定したVID/PIDを持つデバイスの検出。
 2.検出できた指定デバイスに対して任意のデータの送信。
補助機能1(コマンド生成):
 ・デバイスに対する「マクロ動作開始」、「同停止」、「スクリプト全削除」、「同初期化」、「同個別書き込み」のコマンドを生成。
  (基本機能2で任意のデータを送れるのですがコマンドの内容を脳内バイナリ変換してヘキサで打ち込むのはつらいため。)
補助機能2(スクリプト作成補助):
 ・各インストラクションのデータ生成機能(コメント付加可能)。
 ・スクリプトの行挿入/削除(シフト)機能。
 ・スクリプトのファイル保存/読み出し機能。




■画像
□ターゲット
DS2接続


□ホスト
ホストアプリホストアプリ

左がメイン画面。
ここでデバイスの検出及びデータの送信をします。
右がスクリプトの編集画面。
実際に各命令のデータをいじるフレームは排他表示なので全てをお見せすることはできません。
これは軸データ編集中。
右上のコメントボタンでこのフォームがにょ〜んとさらに右に延びて各行のコメントが閲覧できます。
実際には人間様としてはコメントがないと見づらいので展開して使ってます。


ホストアプリ

ほいでもってメイン画面の「ポーリング」ボタンから出て来るこの画面でゲームパッドとしての動作をチェックします。


■その他
VIDは例によってCypress社のものを借用。
あくまでも動作サンプルです。
しかしどうにかならんかなこのVID縛りは。
SCSIで懲りなかったんですかね。



TOP / TEC / USB /