Skip to content

Release 0.1.0-beta.2: fixes for beta reports (#3-#7) - #8

Open
771-8bit wants to merge 12 commits into
masterfrom
dev
Open

771-8bit wants to merge 12 commits into
masterfrom
dev

Conversation

@771-8bit

@771-8bit 771-8bit commented Nov 4, 2026

Copy link
Copy Markdown
Owner

Summary

Second beta, 0.1.0-beta.2 (pre-release): fixes for the first beta reports and problems found while fixing them. One commit per issue:

Closes #3, closes #4, closes #5, closes #6, closes #7

Verification

  • Every commit checked on its own: tsc / eslint / vitest, cargo fmt / clippy / test.
  • Final state: Rust 437 tests (5 parallel runs in a row without a failure), frontend 211 tests; designs reviewed before implementation.
  • In the app (com0com): wrapped long lines with Auto Scroll, 3000 lines, dropdown opening, Light theme in all windows, Copy with timestamps, settings after restart, the tester's firmware line format in the plotter, opening the plotter 10 s after data started.
  • Not verified: a device plugged in right before opening the dropdown (needs a physical device); OV-1 is still open.

🤖 Generated with Claude Code

771-8bit and others added 12 commits November 4, 2026 16:07
ネイティブの <select> は開いた瞬間の選択肢を出すので、2 秒ポーリングの間に
挿したデバイスが一覧に出なかった。mousedown(と F4 / Alt+↓)で既定の展開を止め、
ポートを列挙し直してから showPicker() で開く。showPicker の無い WebView では
従来どおり開きつつ一覧を更新する。リロードボタンは付けない(オーナー判断)。

Closes #5

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ASCII ビューは行の高さを 20 px 固定とみなす仮想スクロールで、Line Wrap で
1 行が複数段になると描画ブロックがモデルの下端からはみ出し、Auto Scroll の
位置では最新行が画面外に残っていた(巨大な取り込みで高さが縮小される時も同様)。

- get_ascii_lines は末尾を超える開始行を「最後の line_count 行」に丸め、実際の
  開始行と、データの末尾まで届いたか(reaches_end)を返す。末尾が LF のとき行索引に
  空の最終行があるので、行数からは判定できない
- 末尾まで取得したブロックは下端揃え(min-height + flex-end)で描き、Auto Scroll
  は実際の DOM の下端までスクロールする。判定はスクロール位置でなくデータで行うので
  モードの出入りで振動しない(Fable レビュー済み)
- 行のタイムスタンプ表記(HH:MM:SS.d)を共通関数にまとめた(#4 でも使う)

Closes #3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
スクロール領域の高さは 1,000 万 px で頭打ちにして縮小しているが、表示行を
scrollTop / scrollHeight の比で求めていたため、最下部(scrollHeight − ビューポート)
でも最後の数十〜数百行に届かなかった(約 8 MB 超)。スクロール範囲全体を行範囲全体
(先頭行〜最後の 1 ページ)に写す rowAtScrollTop に置き換えた。縮小なしの場合は
従来と同じ scrollTop / ROW_HEIGHT になる。#3 と同じ種類の不具合(オーナー判断で修正)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ASCII 表示で Timestamp が ON のとき、Save と Copy は各行の先頭に時刻(画面と同じ
HH:MM:SS.d)と選んだ区切り(Space / Comma / Tab)を付けたテキストを出す。データ本体は
受信したバイトのまま(CR/LF も無加工)。OFF または Hex 表示では従来どおり、Save は
受信バイトそのもの、Copy は平文 / Hex。

- DataStore::write_timestamped: データを 1 MiB ずつ、行頭を数千行ずつ索引から取って
  書き出すので、巨大な取り込みでもメモリは一定
- 新コマンド export_text_with_timestamps、get_clipboard_text に timestamp_separator
- 時刻は約 100 ms ごとにしか記録しないので、ms 表記は偽の精度になる(Fable の指摘)

Closes #4

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
localStorage に "sme.<key>" で JSON 保存する usePersistentState を追加し、
シリアル設定(ボーレート・データビット・パリティ・ストップビット・フロー制御・
DTR/RTS)、最後に選んだポート、Send(改行・Send with Enter・Send Binary・入力モード)、
Receive(Hex/ASCII・Line Wrap・Timestamp・区切り・Auto Scroll)、プロッタの時間窓と
ダウンサンプル方式を保持する。不正・欠落した値は既定値に戻す(起動を壊さない)。

- 最後のポートはユーザーの選択と Connect のときだけ保存し、起動時に無ければ従来どおり
  先頭を選ぶ(自動の選び直しで好みを消さない)
- プロッタは開くたびに保存済みのダウンサンプル方式をバックエンドへ送る(再オープン時に
  表示が Peak のまま裏が Average だった不整合も解消)
- 送信履歴(パスワード等を打つことがある)とウィンドウ位置・サイズは保存しない
  (Fable レビュー済み)
- テストは毎回 localStorage を空にしてから始める

Closes #7

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
これまでアプリはダーク固定の配色なのに、:root の color-scheme: light dark で
ネイティブ部品(select の一覧・チェックボックス・スクロールバー)だけが OS の
設定に従い、見た目が混ざっていた。

- Settings パネルに Theme(Dark / Light / System)。既定は Dark(従来の見た目)
- CSS の約 150 色を意味トークン(背景・枠・文字・強調・状態色など)に置き換え、
  <html data-theme> ごとにダーク / ライトのパレットを定義。color-scheme も揃える
- メイン・プロッタ・AI ガイドの 3 ウィンドウが storage イベントで追従。
  チャートの軸・格子と State Timeline のキャンバス描画もテーマ色を使う
- タイトルバーも各ウィンドウが set_window_theme で合わせる(オーナー許可)
- テーマは layout effect で適用し、子のチャートが古い色を読まないようにする

Closes #6

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
実機ファームウェアの `[Mon t=2916094] V=30.58 Vdc=12.37 I=0.825/0.797 … age=11ms`
が、どのトークンも列位置の状態値(ch3 = "V=30.58" 等)になり、約 20 本の状態行だけが
並んで数値グラフが 1 本も出なかった(#3 のデータで発見、オーナー要求)。

- 結合子 `=` / `:`(前後の空白可)。スペース区切りの行では「単語 数値」もペアにする。
  ただしヘッダー採用後は使わず、行内の裸の数値がすべて直前に単語を持つときだけ
  (`RUNNING 25.5 60` は従来どおり列位置)
- 区切りは従来どおりカンマ > タブ > スペース(依頼の「コロン」はカンマと解釈)
- 名前は文字(日本語可)か `_` で始まること(`12:34:56` を名前にしない)
- 値: 有限の数値 / 数値+短い単位(`11ms`、`3.3V`)は数値、文字始まりは状態、
  それ以外(`0.825/0.797`、`1/1`)と空の値(`key=`)はチャンネルにしない
- `=` を含む行はヘッダーにしない
- SYS-F-715、docs/07 のパースルール、プロッタの「No data」ヒントを更新
- テスト 12 件と、任意の結合子・区切り・単位で名前と値が戻るプロパティテスト
  (Fable レビュー済み)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
プロッタの時刻の原点が「プロッタがストアに接続した時点」で、溜まっていた行を
すべて経過 0 ms として読み、1 ms ずつ過去へ広げる処理が 0 で止まるため、何秒分の
データも時刻 0 の 1 点になっていた。並列テストで test_batch_timestamps_are_spread が
まれに落ちていたのも同じ原因(スレッドがストアを見つける前にデータが届くと潰れる)。

- 原点をストア(=セッション)の作成時刻にする
- 1 回の読み出しを、ストアが約 100 ms ごとに記録する「何バイトまで届いたか」で切り、
  各区間をその時刻に置く。区間内の行は区間の幅に均等に並べる。読み出しの末尾は次の
  記録の時刻を使う(1 MiB の読み出し上限をまたぐ溜まり分も「今」に潰さない)
- 記録が時計と合わないとき(壁時計の補正)は今の時刻に戻し、同じ時刻になった区間は
  まとめて広げる(Fable レビュー済み)
- 再現テスト 2 件(修正前は決定的に失敗)、読み出しをまたぐ場合・時計ずれ・
  再開境界・区間内の均等配置・slice_timestamp の境界値・索引検索の境界のテスト
- SYS-F-808 と docs/27(PF-8)を更新

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- バージョンを 0.1.0-beta.2 に(package.json / Cargo / tauri.conf / ライセンス一覧の自クレート)
- CHANGELOG に beta.2 の節(#3〜#7 の修正と、修正中に見つけた不具合)
- OV-1(自動再接続の実機抜き差し)は beta.2 でも未確認のまま公開

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
前提条件(Node.js / Rust / OS ごとの Tauri の前提、Ubuntu の apt パッケージと
dialout)、clone から `npm run tauri dev` までの手順、初回ビルドの時間と変更時の
再読み込み、インストーラのビルド、CI と同じ検査を、番号付きの手順に分けた。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
<select> の幅が最長の選択肢(機器名)で決まっていたため、機器の抜き差しで一覧が
更新されるたびに 1 行目のレイアウトが動いていた(オーナー指摘)。

- 右側の部品(ボーレート・Connect・Auto Reconnect)は固定幅で右寄せし、ポート一覧は
  その残りの幅いっぱいにする(flex: 1、width: 0、最小 120 px)
- Connect ボタンは Connect / Disconnect / Cancel で幅が変わらないよう固定幅
- 自動再接続の状態表示(機器パスを含む)は MCP Server の行の Theme の左へ移した

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant