Why
プレイ中にサブモニタで横目に見て 1F ずれを読み取れることが、このツールの成否そのものである。
What
src/ui.rs を作る。eframe と egui を使う。History::recent_trials を読んで描く。hidapi と report_decode に依存させない。
入力履歴のリストを 1 つだけ置く。ピアノロールは作らない。Street Fighter の入力表示と同じ形にする。
- 直近
trials_shown 件 (既定 5) を History::recent_trials で取り、各試行の Trial::rows を古い順に縦に並べる
- 新しい行を下に足す。リストは上に流れる
- 試行の境目には区切り線を引く
- 1 行の中身は、その区間で押されている入力の名前、押下 F、持続 F の 3 つ
- 名前は
held の全部を横に並べる。L1 と ↑ を同時に押していれば 1 行に 2 つ出る
- 十字キーの
↑ と左スティックの ↑ は別の名前にする。D↑ と L↑ のように区別する
held が空の行も出す。名前の欄を空にして持続 F だけを出す。入力と入力の間合いは、この行の数字で読む
- 押下 F は
(at_us - origin_us) / (1_000_000.0 / fps)。fps の既定は 60
- 持続 F は
end_us - at_us を同じ式で F に直した値。押しっぱなしの間は増え続ける
- どちらも小数第 1 位まで出す。整数に丸めない。12.7ms と 20.7ms がどちらも
1F になり、境界付近で判断を誤る
- 持続 F が 99.0 を超えたら
99+ と出す。桁を 3 文字に収めるため。60fps の 99F は 1.65 秒で、1F のずれを読む用途でそれより長い持続を区別する意味が無い
- 上限で
99 と出さないのは、120F を 99 と書くと数字が嘘になるため
gap_before が立った行は背景をグレーにする。欠落を隠さない
長押しで行が増えることは無い。Timeline がレポートごとではなく変化ごとにイベントを出し、Trial::rows がそれを区間に畳むので、前方向を 2 秒押しても行は 1 本になる。その 1 本の長さを表すのが持続 F になる。
常時表示する情報は以下。
- 接続中のデバイス名、または未接続の表示
Timeline::scale_us_per_tick の推定値
Timeline::scale_warning が Some ならその文言
- 量子化誤差の目安。USB のレポート間隔 4ms が
±0.24F に当たること
- F 数が自前の 60fps グリッド上の値であること。ゲームがパッドを読む瞬間の位相は外から観測できないので、ゲームの中の数え方とは最大 1F ずれる
ゴール
- Windows で起動し、DualSense を繋いでボタンを押すと、入力履歴のリストに行が増えて F 数が出る
L1 と ↑ を同時に押したとき、2 つの名前が 1 行に並ぶ
- 意図的に間を空けて
R1 を押したとき、間の空の行の持続 F が体感と合う
- 前方向を押しっぱなしにしたとき、行が増えずに持続 F だけが増える。2 秒を超えると
99+ になる
- 左スティックを 8 方向の境界の上で微動させたとき、行が増えない
- ウィンドウを別のウィンドウで完全に覆った状態でも記録が続く。覆う前と後で受信間隔の median が変わらない。これは仕様の未検証の前提にあたるので、結果を issue にコメントする
ui.rs が hidapi と report_decode に依存していない
cargo coupling --check --min-grade=B --max-circular=0 ./src が通る
分解: #1 (comment) / Task 5 / e82b5387df06
Why
プレイ中にサブモニタで横目に見て 1F ずれを読み取れることが、このツールの成否そのものである。
What
src/ui.rsを作る。eframeとeguiを使う。History::recent_trialsを読んで描く。hidapiとreport_decodeに依存させない。入力履歴のリストを 1 つだけ置く。ピアノロールは作らない。Street Fighter の入力表示と同じ形にする。
trials_shown件 (既定 5) をHistory::recent_trialsで取り、各試行のTrial::rowsを古い順に縦に並べるheldの全部を横に並べる。L1と↑を同時に押していれば 1 行に 2 つ出る↑と左スティックの↑は別の名前にする。D↑とL↑のように区別するheldが空の行も出す。名前の欄を空にして持続 F だけを出す。入力と入力の間合いは、この行の数字で読む(at_us - origin_us) / (1_000_000.0 / fps)。fpsの既定は 60end_us - at_usを同じ式で F に直した値。押しっぱなしの間は増え続ける1Fになり、境界付近で判断を誤る99+と出す。桁を 3 文字に収めるため。60fps の 99F は 1.65 秒で、1F のずれを読む用途でそれより長い持続を区別する意味が無い99と出さないのは、120F を99と書くと数字が嘘になるためgap_beforeが立った行は背景をグレーにする。欠落を隠さない長押しで行が増えることは無い。
Timelineがレポートごとではなく変化ごとにイベントを出し、Trial::rowsがそれを区間に畳むので、前方向を 2 秒押しても行は 1 本になる。その 1 本の長さを表すのが持続 F になる。常時表示する情報は以下。
Timeline::scale_us_per_tickの推定値Timeline::scale_warningがSomeならその文言±0.24Fに当たることゴール
L1と↑を同時に押したとき、2 つの名前が 1 行に並ぶR1を押したとき、間の空の行の持続 F が体感と合う99+になるui.rsがhidapiとreport_decodeに依存していないcargo coupling --check --min-grade=B --max-circular=0 ./srcが通る分解: #1 (comment) / Task 5 / e82b5387df06