skif-arduino.inoないしddci-ch552.ino(これを書いている時点における、GitHubのmasterブランチのコードをコピーしています)を見ていて、おそらく今後コードを見返した際にどういう動きをしているんだこれ?となりそうなのでメモを残すことにします。ddci-ch552はskif-arduinoのコードをベースにしているので、まずはskif-arduinoから。
・割り込みハンドラの動作 (skif-arduino)
Timer1を使い、125μs毎に割り込みを発生させる。
- 割り込み発生時点におけるGPIOの状態をCurrPinStatusに記録。
- 時間計測用のカウンタ(Counter)を増やす。
- eager debounce用のカウンタ(PinMaskCounter)を減らす。
- loop()側をキック。
・loop()の動作 (skif-arduino)
タイマ割り込みが発生するまでsleep命令で待つ。割り込み発生後、以下の処理を行う。
- 保持しているGPIOの状態(PrevPinStatus)と割り込みハンドラで取得したGPIOの状態(CurrPinStatus)の変更箇所(changed)を求める。
- eager debounce用のカウンタ(PinMaskCounter)が0ならPrevPinStatus、そうでなければCurrPinStatusを使用するようマスク(useprev)を生成。
- changedをuseprevでマスクした結果(ここでeager debounceが掛かる)信号変化ありと判断した場合か、時間計測用のカウンタ(Counter)がオーバーフローした場合はこれ以降の処理を実行。そうでなければここで処理を打ち切る。
- PrevPinStatusは信号変化の起こる前のピン状態を保持しており、これとその経過時間(Counter)を送信。
- PrevPinStatusを、CurrPinStatusとuseprevを使って更新。
- 時間計測用のカウンタ(Counter)を0に初期化。
- 信号変化のあったピンについてはPinMaskCounterを設定。
ddci-ch552も大体これと同じような流れになりますが、時間計測を行わないのでCounterが無くなることと、信号変化の前ではなく後の情報を送信するので少し変わります。
・割り込みハンドラの動作 (ddci-ch552)
Timer2を使い、1ms毎に割り込みを発生させる。
- 割り込み発生時点におけるGPIOの状態をCurrPinStatusに記録。
- eager debounce用のカウンタ(PinMaskCounter)を減らす。
- loop()側をキック。
・loop()の動作 (ddci-ch552)
タイマ割り込みが発生するまで待つ。割り込み発生後、以下の処理を行う。
- 保持しているGPIOの状態(PrevPinStatus)と割り込みハンドラで取得したGPIOの状態(CurrPinStatus)の変更箇所(changed)を求める。
- eager debounce用のカウンタ(PinMaskCounter)が0ならPrevPinStatus、そうでなければCurrPinStatusを使用するようマスク(useprev)を生成。
- PrevPinStatusを、CurrPinStatusとuseprevを使って更新(ここでeager debounceが掛かる)。
- 信号変化のあったピンについてはPinMaskCounterを設定。
- ピンの信号変化があった場合はステータスを送信。ステータスはPrevPinStatusに基づく。
ddci-ch512、この日記を書く際にコードを見直していたら豪快に間違えている箇所があったので、直しておきました。コードをよくよく見てみると、full-speedで動いている割にbInterval=10なので、今後はdescriptor周辺も直していく必要がありそうです。折角なので、NKRO(N-key rollover)キーボード風に作り直してみます…メインのロジックを変えずに、report descriptorを変えるだけで済みますからね。
なお、AliExpressではCH552Gを搭載したこの手のアダプタが数多く売られているようです(例)。商品の紹介動画を見る限りでは、マウスの左右ボタンとして振る舞うように見えます。MorseLinkなるソフトウェアも使っているようです。アダプタの回路図はMorseLink---CW电键转接器やMorseLink_connectorに出ていますが、ファームウェアは.hexの形でしか存在せず、ソースコードは秘匿されているといって良いでしょう。
21日恒例の、JMH電波予報です。前回は20-Jul-2026。
受信直前の電波状態があまり良くないように思えたので、今回は7MHz帯で受信しています。56.7kg(24:00)