From 45e5965f89ac617dc724499f71c14e128f41dd6a Mon Sep 17 00:00:00 2001 From: Claude Code Date: Sun, 27 Sep 2026 18:26:04 +0900 Subject: [PATCH] docs: publish the README, the license, and a demo example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 公開するので README を英語で置いた。画面に日本語を出さない判断と揃える。 license が無いと全権利留保の扱いになり、受け取った人が使ってよいかを判断 できない。MIT にした。 examples/demo.rs は合成した入力を History に積み、配るものと同じ ui::show を 呼ぶ。デバイスも Windows も無しに表示だけを見られる。 見出しの .small() を外した。等幅でも字送りが本文と変わるので、見出しの行だけ 列がずれていた。実機の画面で見つけた。 Co-Authored-By: Claude Opus 5 (1M context) --- Cargo.toml | 3 + LICENSE | 21 +++++++ README.md | 96 ++++++++++++++++++++++++++++++++ docs/images/window.png | Bin 0 -> 77050 bytes examples/demo.rs | 123 +++++++++++++++++++++++++++++++++++++++++ src/ui.rs | 6 +- 6 files changed, 247 insertions(+), 2 deletions(-) create mode 100644 LICENSE create mode 100644 README.md create mode 100755 docs/images/window.png create mode 100644 examples/demo.rs diff --git a/Cargo.toml b/Cargo.toml index db21efe..a89fc77 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,9 @@ name = "frametap" version = "0.1.2" edition = "2021" +license = "MIT" +description = "Frame-by-frame controller input display for Windows" +repository = "https://github.com/torabit/frametap" [dependencies] bitflags = "2.13.2" diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c989580 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 torabit + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0334de6 --- /dev/null +++ b/README.md @@ -0,0 +1,96 @@ +# frametap + +Read your own controller inputs frame by frame, next to the game. + +![The input list, showing held inputs with the frame each one started and how long it lasted](docs/images/window.png) + +## What it is + +A small always-on-top window that lists what you pressed and for how long, counted in frames. It reads the controller directly over HID, so it works with any game. It never writes to the controller. + +It was built for one question: *was that attack 1 frame late, or did the game drop it?* The list answers the first half. Each row carries the frame the input started and the number of frames it was held, both to one decimal place. + +## What you need + +- Windows 10 or 11 +- A DualSense, DualSense Edge, or DualShock 4, over USB or Bluetooth +- Nothing else. No driver, no runtime, no Visual C++ redistributable + +## Install + +Download the latest [release](https://github.com/torabit/frametap/releases), put `frametap.exe` and `frametap.toml` in the same folder, and run the exe. + +The exe is unsigned, so SmartScreen will warn on first run. Choose **More info** and then **Run anyway**. If your antivirus quarantines it, please open an issue with a screenshot rather than adding an exclusion. + +## Reading the list + +``` +frametap 0.1.2 connected: DualSense +device clock: 0.3274 us/tick +USB reports every 4ms, so each frame count carries +/-0.24F of error +counted on a private 60fps grid, may differ from the game by up to 1F + +input press hold +LS8 0.0 1.0 +LS8 Circle 1.0 2.0 +LS8 3.0 15.0 +LS8 R1 18.0 2.0 +``` + +| Column | Meaning | +| --- | --- | +| `input` | Everything held during that interval, in the order it was pressed | +| `press` | Frames since the first press of the attempt | +| `hold` | How long that exact combination lasted. Capped at `99+` | + +A new row appears only when the set of held inputs changes. Holding a direction for two seconds is one row whose `hold` keeps growing, not a hundred rows. + +Directions use numpad notation. `DP8` is d-pad up, `LS8` is left stick up, `LS6` is right, `LS2` is down. The prefix separates the d-pad from the stick, because the game sees both but you may want to know which one you used. + +A horizontal rule separates attempts. An attempt ends after 300ms with nothing held. + +The window keeps recording while it is completely covered by another window, so you can leave it behind the game and read it afterwards. + +A row with a grey background means a report was dropped between it and the row above. The gap is real and the tool will not interpolate across it, so treat that interval's timing as unknown. + +## The frame count is not the game's frame count + +The tool samples the controller at 250Hz and divides elapsed time by a 60fps grid of its own. The game reads the pad once per frame, at an instant nothing outside the game can observe. Those two grids are not in phase. + +A number here can therefore be one frame away from what the game counted. Two inputs 10ms apart may land in the same game frame or in adjacent ones, and this tool cannot tell you which. That is why the counts carry a decimal: `3.0` and `3.4` are different measurements even though both would print as `3` in a game's own input display. + +## Configuration + +`frametap.toml` sits next to the exe. It is optional; without it the defaults apply. Anything the tool cannot accept is reported in red at the top of the window rather than silently ignored. + +| Key | Default | Meaning | +| --- | --- | --- | +| `fps` | `60` | The frame rate the counts are expressed in | +| `trial_gap_ms` | `300` | Idle time that ends an attempt | +| `stick_deadzone` | `0.5` | Normalized distance before the stick counts as a direction | +| `trials_shown` | `5` | How many attempts to keep on screen | +| `show_released` | `false` | Also list the intervals where nothing was held | + +## When it crashes + +There is no console window, so a panic writes `frametap-panic.txt` next to the exe instead, appending rather than overwriting. Please attach that file to an issue. + +If the exe cannot write to its own folder, the file goes to your temp directory. + +## Limitations + +- Windows only. The HID and timing code has no other implementation +- It opens the controller read-only and never sends output or feature reports, so it cannot fight with Steam Input over the device +- The byte layout for DualShock 4 is taken from Linux's `hid-playstation` and has not been checked against real hardware. DualSense has been + +## Building + +``` +cargo build --release +``` + +Requires a Rust toolchain. `cargo run --example demo` opens the window with synthetic input and no controller attached, which is useful for working on the display itself. + +## License + +MIT. See [LICENSE](LICENSE). diff --git a/docs/images/window.png b/docs/images/window.png new file mode 100755 index 0000000000000000000000000000000000000000..63e03f4cc6dbc591262cfd123b93d70c54686c13 GIT binary patch literal 77050 zcmYg&cRW|^|G#8rtCY$ndxUJV_uhNU-eix=q>x!z30c`&wjyMcy_HqAY<{nEf4+bG zdOSS3>wceeu5(?l@f@#rQL4%^csK6dKtVyllarNHM?tw(i-Lk$iiH7xvwr$K7=F9v zt}Y{vQquom9sYo3Ev6)ff>Iufb8dzXf5vu^)pJKd!S6tRu5~%*TcV&`<;qElX?h#~ zN%soA{q3UliQt#*Ci_;h8P^9cx7M4E@NZDteU1Mb64EI-!aZ~==$aJWH%X0Gvv)11 z>=ey49pt`-p75be)^&?GJjr`dUHc7uWo|?H~Rv+Fi+b zxdgK7%k|{Vd6%96ch;|?I&_Kg5j`Mkt3jvS&6PYADOp{t$3CZQ>?Fn)4<>x}S8l%O z;{NSg@$hn#Fi~Be8Vf2GOa&~-yCo#^M{k;AS5J`+!pRkN z@mzZ+wjrX7Fu4^qX*4YY8vZNrxxauTAUUwPO!98t zsXo)IT-5M^_~CCyLOBOwox1^d=8M|g+xA-z+oD4^Lrk(O2Zmy+>^H*&vWD-jsBBCZ zUeVqj8AVy!CSDO!7ixQ)Rhsve21PS9yeyPgssHYv6{=lP%qoUw1qSb%y}M;?L<@YB zVWEE~7QM8TUaLxR`)l?Xguf}^!7`ke@ntL7UaWU=JUmQzX`+5x1MS@n5vRX6IaHrl zcmzN0b1+nzJzQ%&ozL+fr&CB_)%vG(e|g>cUEGp?rR#F8bkT{F z1EHMeo(_|$rvm#z109|>X$|kNXE~RNNs>|5*ae5H62t}m#qn;A-2PInf_(#f!{X=1 zdkHIwa%_glgjl^|k`ElRn3AoY%XS-Li+HQ^3JiC78L_Ttex=S&E9}FS^JQ84Q58lk zpB!HJT|lgv#6gUvi0P$ri<4%+#hh51R=Bp*LUvdryOzwg+qX#;`0$mv#aZ4IXliM3NwgvIwWLST)+~% zh5tNGdwx< z+9p_tpUAW+o{uqA@gUt{w*A=HQDSZUr@ )*Oa2>1gDN^CtlhR0F;Zzc5c(uR0;# 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

yfC<+ptM^77WzcNef|p4+R1Y!hAu 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 b!UN%xtMg)Mm1nyU;GdMZyjYotq5uB@FT_G# literal 0 HcmV?d00001 diff --git a/examples/demo.rs b/examples/demo.rs new file mode 100644 index 0000000..06208a7 --- /dev/null +++ b/examples/demo.rs @@ -0,0 +1,123 @@ +//! 実機とデバイスを使わずに画面を出す。 +//! +//! README に載せる画像と、表示の手直しを Windows へ渡す前に見るために使う。合成した +//! 入力を [`History`] に積み、実際に配るものと同じ [`frametap::ui::show`] を呼ぶ。 +//! +//! ``` +//! cargo run --example demo +//! ``` + +use std::sync::{Arc, Mutex}; + +use eframe::egui::ViewportBuilder; +use frametap::history::{History, DEFAULT_RETAIN_US, DEFAULT_TRIAL_GAP_US}; +use frametap::report_decode::{Buttons, Direction}; +use frametap::timeline::{EventKind, InputEvent, Target}; +use frametap::ui::{self, Settings, Status}; + +/// 60fps の 1F。 +const FRAME_US: u64 = 16_667; + +fn press(target: Target, at_us: u64) -> InputEvent { + InputEvent { + kind: EventKind::Press, + target, + at_us, + gap_before: false, + } +} + +fn release(target: Target, at_us: u64) -> InputEvent { + InputEvent { + kind: EventKind::Release, + ..press(target, at_us) + } +} + +/// ローリングの直後に攻撃を入れた形を 3 回。1 回ごとに 1F ずつ遅らせる。 +/// +/// この道具が読みたいのは、その 1F の差が数字に出るかどうかになる。 +fn history() -> History { + let mut history = History::new(DEFAULT_RETAIN_US, DEFAULT_TRIAL_GAP_US); + let mut at_us = 0; + + for delay_frames in 0..3u64 { + // 前方向を入れてローリング。 + history.push(&[press(Target::Stick(Direction::N), at_us)], at_us); + history.push( + &[press(Target::Button(Buttons::CIRCLE), at_us + FRAME_US)], + at_us + FRAME_US, + ); + history.push( + &[release( + Target::Button(Buttons::CIRCLE), + at_us + 3 * FRAME_US, + )], + at_us + 3 * FRAME_US, + ); + + // 攻撃。試行ごとに 1F ずつ遅れる。 + let attack_us = at_us + (18 + delay_frames) * FRAME_US; + history.push(&[press(Target::Button(Buttons::R1), attack_us)], attack_us); + history.push( + &[release( + Target::Button(Buttons::R1), + attack_us + 2 * FRAME_US, + )], + attack_us + 2 * FRAME_US, + ); + history.push( + &[release( + Target::Stick(Direction::N), + attack_us + 4 * FRAME_US, + )], + attack_us + 4 * FRAME_US, + ); + + at_us = attack_us + 4 * FRAME_US + 4 * DEFAULT_TRIAL_GAP_US; + } + + history.push(&[], at_us); + history +} + +struct Demo { + history: Arc>, + status: Status, + settings: Settings, +} + +impl eframe::App for Demo { + fn ui(&mut self, ui: &mut eframe::egui::Ui, _frame: &mut eframe::Frame) { + let trials = { + let history = self.history.lock().expect("毒されていない"); + ui::recent_trials(&history, &self.settings) + }; + + ui::show(ui, &trials, &self.status, &self.settings, &[]); + } +} + +fn main() -> eframe::Result<()> { + let options = eframe::NativeOptions { + viewport: ViewportBuilder::default() + .with_title("frametap") + .with_inner_size([440.0, 620.0]), + ..Default::default() + }; + + eframe::run_native( + "frametap demo", + options, + Box::new(|_cc| { + Ok(Box::new(Demo { + history: Arc::new(Mutex::new(history())), + status: Status { + scale_us_per_tick: Some(0.3274), + ..Status::connected("DualSense".to_owned()) + }, + settings: Settings::default(), + })) + }), + ) +} diff --git a/src/ui.rs b/src/ui.rs index aef8b59..8a282ab 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -262,9 +262,11 @@ fn show_column_headers(ui: &mut Ui) { ))); } -/// 見出しの文字。数字より小さく弱くして、行の数字から視線を奪わない。 +/// 見出しの文字。薄くして行の数字から視線を奪わない。 +/// +/// 小さくはしない。等幅でも字送りが本文と変わるので、見出しだけ列がずれる。 fn header_text(text: &str) -> RichText { - RichText::new(text).monospace().small().weak() + RichText::new(text).monospace().weak() } fn show_line(ui: &mut Ui, line: &Line) {