Skip to content

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

Merged
771-8bit merged 24 commits into
masterfrom
dev
Nov 5, 2026
Merged

771-8bit merged 24 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 23 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>
C# 版は CR だけの改行も改行として表示していたが、行索引が LF しか見ておらず、
CR で行を終える機器の出力が 1 行に繋がっていた。

- LF・CR・CRLF をそれぞれ 1 つの改行とする(CRLF は 1 つ、LF CR と CR CR は 2 つ)
- CR の次が LF かはチャンクをまたいで判定する。チャンク末尾の CR は次のバイトまで
  保留し、索引が縮むことはない
- ResumeBoundary を LineIndexer にまとめ、保留中の CR も持たせる。切断で保留が
  失われても再開位置が行頭として入る

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Windows の USB 機器はフレンドリ名がすでに " (COM5)" で終わるため、一覧が
"USB Serial Port (COM5) (COM5)" になっていた。製品名の末尾がそのポート名の
括弧書きなら取り除いてから "製品名 (COM5)" にする。形式は変えないので、
portPath / extract_port_path の解釈と MCP の ports もそのまま。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
C# 版は '-' ' ' ',' '.' '/' で区切り、各トークンを 1 バイト(1〜2 桁)として
読んでいた。新版は空白だけを無視して 2 桁ずつ組にしていたため、`0A-0B` は
エラーになり、`12 3 4` は黙って 0x12 0x34 を送っていた(誤送信)。

- 空白・, - . / : で区切り、1〜2 桁のトークンを 1 バイトとする。0x 接頭辞も可
- 3 桁以上の偶数桁のトークンは 2 桁ずつ(`48656C6C6F` は従来どおり)
- それ以外(`123` のような奇数桁、16 進でない文字)は推測せずにエラー。どの
  トークンかを入力欄の下に表示し、その間は Send を押せない(ブロックする
  alert をやめた)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
C# 版の規則どおり、CR/LF を除くと空になる入力は送信はするが履歴に入れない。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
C# 版は入力ミスを防ぐため送信欄を 16pt(受信欄 12pt)にしていた。
送信欄を 13px から 17px にする。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
C# 版には Show [CRLF] / Show [NUL](既定 OFF)があり、OFF では改行を普通の改行
として、NUL を消して表示していた。新版は常に制御文字を記号で出すため、全行の
末尾に CR LF の記号が並んでいた。

- ASCII 表示に Show CR/LF と Show NUL(既定 OFF、設定は保存)を追加
- Show CR/LF が OFF のとき CR・LF を隠し、TAB は実際のタブで表示する。隠した
  CR・LF は大きさ 0 の span に残すので、選択範囲のコピーでも改行は消えない
  (display:none では選択に含まれず、コピー処理が改行を失う)
- Show NUL が OFF のとき NUL を表示しない(コピーにも含めない。C# 版と同じ)
- 表示の切り替えだけで、受信データ・Save・Copy の全体出力は変わらない

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
C# 版はバイナリ表示でも受信のまとまりごとに時刻を付けていた。新版は Hex 表示で
Timestamp を選べなかった。

- Hex 表示でも Timestamp を選べるようにし、16 バイトの行ごとに先頭バイトの受信
  時刻を出す(get_display_rows に show_timestamp、行に timestamp)
- 切り替えたら行を取り直す(取得済みの行には時刻が無い/有る)
- Timestamp ON の Copy は各行に時刻と区切りを付ける。Save は Hex 表示では常に
  受信したバイトのまま(handleExport で ASCII 表示に限定)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
C# 版は Copy・Save のあとに自動で閉じるメッセージ("Copied" など)を出し、空の
ときは警告していた。新版は成功しても何も出ず、空の Copy は無反応だった。

- "Copied" / "Saved" / "Nothing to copy" / "Nothing to save" を 1.5 秒の
  トーストで出す(role=status、クリックを妨げない)
- 空の Save の alert もトーストにした(alert は JS を止め、再接続の照合も止まる)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
C# 版の Auto Connect は、ポートが開いていなければ選択中のポートを 200 ms ごとに
開こうとしていた(起動時やデバイスを初めて挿したときも接続し、Disconnect で
OFF になる)。新版の Auto Reconnect は、接続中に失ったデバイスが戻ったときしか
開かなかった。

- ON の間、ポートが開いていなければ選択中のポートが開け次第開く(起動時・挿した
  とき・ON にしたとき・ポートを選び直したとき)。起動時は前回のポートを、無くても
  選択したまま "(not present)" で待つ
- 自動で開くときは常に reopen_port(同じキャプチャに追記)。新しいセッションに
  するのは Connect ボタンだけ(SYS-F-803)
- Disconnect と待機中の Cancel で OFF にする(C# 版と同じ。OFF にしないと
  即座に開き直す)
- 一覧にあるのに開けない(他のプログラムが使用中など)ときは 5 回失敗した後
  1 s 間隔に落とし、"(cannot open the port)" と理由(ツールチップ)を出す
- 照合間隔を 500 ms から C# 版と同じ 200 ms に
- 設定は新しいキー autoConnect(既定 OFF)。起動時にポートを開くようになったので
  旧 Auto Reconnect の ON は引き継がない
- 表示は "Connected automatically …"。ブリッジ / MCP の reconnecting の説明も
  自動接続の待機を含む文言に(プロトコルの名前は変えない)
- docs 21 SYS-F-807 / 23 / 24 / 27、FT232H 治具の説明を更新

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ポートを開いただけでボードがリセットされないよう、DTR と RTS を既定 OFF にする。
DTR ON は Arduino Uno 型(CH340 互換機を含む)をリセットし、DTR OFF のままの
RTS ON は ESP32 系の自動リセット回路でチップをリセット状態に保つ。

- DtrEnable / RtsEnable の横に "?" を置き、ホバー(キーボードのフォーカスでも)で
  注記を出す。DTR は Uno 型がリセットされること、USB 直結のボード(Leonardo、
  Pico、ESP32-S2/S3/C3)は DTR ON にしないと送ってこない場合があること。RTS は
  ESP32 系で DTR OFF のまま ON にするとリセット状態になること
- ポートを開いた直後は DTR を RTS より先に設定する(逆順だと ESP32 系で一瞬
  RTS だけが ON になりリセットがかかる)。順序をコメントで固定
- そのほかの既定値は C# 版に合わせる: 送信の改行なし(LF だった)、Send with
  Enter ON、Line Wrap OFF、タイムスタンプの区切り " > "(選択肢に追加)
- 保存済みの設定はそのまま使う(変わるのは新規インストールだけ)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
beta.2 と同じリリースで出すので、CHANGELOG は beta.2 の節に追記する。README の
機能一覧(Auto Connect、Show CR/LF・NUL、両表示のタイムスタンプ、Hex 送信の書き方)
と、DTR/RTS の既定値と Arduino での注意を更新。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
C# 版から失われていた挙動を戻す(Auto Connect、CR 改行、Show CR/LF など)
@771-8bit
771-8bit merged commit d53746f into master Nov 5, 2026
4 checks passed
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