23日目(12⁄23)の記事です。Nintendo_Switch_Reverse_Engineeringを参考に、ほとんどわからないなりにボタンとスティックの入力を取るくらいのことはできたので、その辺の知識をまとめていきます。Switchのコントローラーです。JoyconにはLとRがあり、Switchを買うと二つ付いてきます。加速度センサージャイロセンサーnfcの読みとりモーションIRカメラこんなにたくさんの機能が!。(nfcの読みとり,モーションIRカメラはRのみ。3.0により行われています。EngineeringNintendo_Switch_Reverse_EngineeringこれはdekuNukemという方のリポジトリで、主にJoyconをリバースエンジニアリングした結果とその解説を載せてくれています。markdownでまとめてくれているので、それをよく参照することになるかと思います。ファイルの概要(笑)です。reportsについて解説しています。reportsで送信するサブコマンドの列挙と説明が乗っています。これを通して、Joyconに各種命令を送信します。・imu_sensor_notes.md今回僕はそんなにみていないですが、加速度センサー&ジャイロセンサー周りの説明がされています。・rumble_data_table.mdjoyconを振動させる際に送信する周波数と振幅周りの表です。表形式になっていますが、表になっている意味がいまいちよくわかりません。rumbleとはvibrationのことのようです。・spi_flash_notes.md今回一回も参照しなかったので、文字通り何もわからないです。spiって何...まずは接続してみる。これは普通にイヤホンを接続する感覚でJoyconを接続できます。接続するとき、Joyconのシンクロボタンを長押しすることに注意しましょう。hidapiでは、接続されたJoyconをプログラムで読み取ってみます。そのために、hidapiを使用します。取得し、各種レポートを送信するクロスプラットフォームのC++ライブラリです。このライブラリの説明をこれ以上すると長くなりすぎるので、割愛します。Joyconを取得してみる。hidapiをセットアップしたら、実際に取得してみましょう。接続されているHIDデバイスの連結リストを取得。deviceをopenする。すると、そのhidデバイスの情報が載ったhid_deviceが帰ってくる。今開いているデバイスのプロダクト名の取得。hid_free_enumeration(device);}これを実行すると、こういう感じの出力が得られます。コンパイルのコマンドはmac用です。(L)しっかりとJoyconを取得できてますね。他にも色々なものがhidデバイスとして認識されているのがわかります。(キーボードのバックライトもhidデバイスなのか...??)Joyconのランプを操作する。Joyconも認識できたということで、ここから実際に色々とJoyconとやりとりしていきます。Joyconのランプを操作するところから初めてみます。Joyconをパソコンに接続すると、下のgifのようになりますね。これを変更するには、joyconにsubcommandを送信する必要がありますので、早速やっていきます。SendSubcommand()は、渡されたデバイスにサブコマンドを送る関数です。これを実行すると、joyconの一番上のランプが光ります。