Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
c5daa73
fix(ci): ライセンス一覧の自クレートのバージョンを 0.1.0-beta.1 に(License Check の失敗)
771-8bit Nov 4, 2026
a803322
fix(ui): ポートのドロップダウンを開く前に列挙し直す(#5)
771-8bit Nov 4, 2026
7c47ebd
fix(monitor): Auto Scroll が折り返し行で最終行まで届かない(#3)
771-8bit Nov 4, 2026
7d17b0e
fix(monitor): Hex 表示で巨大な取り込みの最終行までスクロールできない
771-8bit Nov 4, 2026
31cfad3
feat(monitor): Timestamp ON のとき Save / Copy にタイムスタンプを含める(#4)
771-8bit Nov 4, 2026
9840180
feat: 設定をアプリの再起動後も保持する(#7)
771-8bit Nov 4, 2026
fc8a29c
feat(ui): テーマ(Dark / Light / System)を切り替えられるようにする(#6)
771-8bit Nov 4, 2026
4d98911
feat(plotter): 名前と値を = / : / スペースで結んだ行を柔軟に認識する
771-8bit Nov 4, 2026
1189d64
fix(plotter): データ受信後にプロッタを開くと、それまでのデータが 1 点に潰れる(PF-8)
771-8bit Nov 4, 2026
2b3289f
chore(release): 0.1.0-beta.2 の準備
771-8bit Nov 4, 2026
0512169
docs(readme): ソースから起動する手順を詳しくする
771-8bit Nov 4, 2026
50e4002
fix(ui): ポート一覧の幅を機器名に依存させない(#5 のフォローアップ)
771-8bit Nov 4, 2026
6fa8357
fix(serial): CR 単独の改行も行の区切りにする(C# 版のデグレ)
771-8bit Nov 5, 2026
5e538da
fix(ports): ポート名に COM 番号が二重に出ないようにする
771-8bit Nov 5, 2026
10d0b3e
fix(send): Hex 送信で C# 版の区切り文字と 1 桁のバイトを受け付ける(C# 版のデグレ)
771-8bit Nov 5, 2026
3e9be3d
fix(send): 改行だけの入力を送信履歴に残さない(C# 版のデグレ)
771-8bit Nov 5, 2026
6c77c30
style(send): 送信欄の文字を受信欄より大きくする(C# 版のデグレ)
771-8bit Nov 5, 2026
d579252
feat(receive): Show CR/LF と Show NUL の切り替えを復活する(C# 版のデグレ)
771-8bit Nov 5, 2026
0150091
feat(receive): Hex 表示でもタイムスタンプを出す(C# 版のデグレ)
771-8bit Nov 5, 2026
7567c9f
feat(ui): Copy / Save のあとに自動で消える確認を出す(C# 版のデグレ)
771-8bit Nov 5, 2026
2251189
feat(serial): Auto Reconnect を C# 版と同じ Auto Connect に戻す(C# 版のデグレ)
771-8bit Nov 5, 2026
ca7c317
feat(serial): 初期値を見直し、DTR/RTS に Arduino 向けの注記を付ける
771-8bit Nov 5, 2026
e71ba7b
docs: C# 版との差分の修正を README と CHANGELOG(beta.2)に反映する
771-8bit Nov 5, 2026
7cffced
Merge pull request #9 from 771-8bit/fix/csharp-parity
771-8bit Nov 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,78 @@ History before 0.1.0 is not reconstructed here; see the change log in

## [Unreleased]

## [0.1.0-beta.2] - 2026-11-04 (pre-release)

Fixes for the first beta reports (issues #3 to #7) and a few problems found while fixing them,
and behavior of the C# version (0.0.8 and earlier) that the rewrite had lost.
Windows build: NSIS installer only, as for beta.1.

### Added

- **Theme** setting (Dark / Light / System) in the Settings panel; all windows follow it. Before,
the app was dark-only while native widgets followed the OS theme ([#6]).
- Save and Copy include the timestamps when Timestamp is ON in the ASCII view: every line starts
with its time (`HH:MM:SS.d`, the same as on screen) and the chosen separator. With Timestamp
OFF, Save writes the received bytes unchanged as before ([#4]).
- Plotter: names and values joined by `=`, `:` or a space are recognized, separated by commas,
tabs or spaces (`V=30.58 I=0.82`, `temp = 25, hum = 60`, `temp 25.5 hum 60`). A number followed
by a short unit (`11ms`, `3.3V`) is read as the number. Values that are neither a number nor a
word (`0.825/0.797`) and empty values (`key=`) no longer create channels.
- **Show CR/LF** and **Show NUL** in the ASCII view, both off by default (C#: Show [CRLF] /
Show [NUL]). Off hides CR and LF, shows TAB as a real tab and hides NUL; copying a selection
still keeps the line breaks. Before, every line ended in visible CR LF symbols.
- Timestamps in the Hex view: each 16-byte row shows the time of its first byte, and Copy
includes them. Save in the Hex view still writes the received bytes.
- "Copied" / "Saved" / "Nothing to copy" confirmation that disappears by itself.

### Changed

- Settings are remembered across restarts: serial settings, the last chosen port, Send and Receive
options, the plotter's window width and downsampling mode, and the theme. The send history and
the window size/position are not stored ([#7]).
- Opening the port dropdown re-enumerates the ports first, so a device plugged in a moment ago
is listed ([#5]).
- The port list fills the width left by the controls on its right, which are right-aligned; its
width no longer depends on the device names. The Auto Connect status moved to the MCP Server
row.
- The window title bar follows the chosen theme.
- **Auto Reconnect is now Auto Connect**, as in the C# version: while it is on and no port is
open, the app connects to the selected port as soon as it can, also at startup and when the
device is plugged in for the first time. Disconnect (or Cancel while waiting) turns it off.
When the port is listed but cannot be opened (in use by another program), it says so and
retries every second. The setting starts off; an earlier Auto Reconnect setting is not
carried over. The retry interval is 200 ms (was 500 ms).
- Defaults for new installs (saved settings are kept): **DTR and RTS off** (were on), so that
connecting resets neither an Arduino Uno (DTR) nor an ESP32 (RTS). Boards with native USB may
need DtrEnable ticked; a **?** next to DtrEnable / RtsEnable explains this on hover. The other
defaults match the C# version: no line ending (was LF), Send with Enter on (was off), Line
Wrap off (was on), timestamp separator `>` (new option).
- The Send box uses a larger font than the receive view, as in the C# version.
- Port names no longer repeat the port: `USB Serial Port (COM5)` instead of
`USB Serial Port (COM5) (COM5)`.

### Fixed

- Auto Scroll stopped short of the newest line when Line Wrap made lines span several rows, and
for very large captures ([#3]).
- Reopening the plotter window could show "Peak" while the backend still used "Average".
- The Hex view could not scroll to the newest rows of very large captures (more than about 8 MB).
- A plotter line with `name=value` pairs was taken as the CSV header when it came first.
- Opening the plotter after data had arrived drew all of that data as a single point at time 0;
it is now drawn at the times it was received.
- A lone CR now ends a line, as in the C# version; devices that end lines with CR only were
shown as one long line.
- Hex send accepts the C# separators and one-digit bytes (`0A-0B`, `1,2,3`, `0x41`). Before,
`0A-0B` was rejected and `12 3 4` was silently sent as `12 34`. An invalid byte is now named
under the input instead of in a blocking dialog.
- Input that is only line breaks is no longer added to the send history.

[#3]: https://github.com/771-8bit/SerialMonitorEssential/issues/3
[#4]: https://github.com/771-8bit/SerialMonitorEssential/issues/4
[#5]: https://github.com/771-8bit/SerialMonitorEssential/issues/5
[#6]: https://github.com/771-8bit/SerialMonitorEssential/issues/6
[#7]: https://github.com/771-8bit/SerialMonitorEssential/issues/7

## [0.1.0-beta.1] - 2026-11-04 (pre-release)

First beta of the Tauri/Rust version, released to validate it in real use. It contains
Expand Down
60 changes: 49 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,23 @@ did all of that, so I built this one. It is a Tauri/Rust rewrite of an earlier C

- Lossless receive at high line rates: data is kept in fixed-size chunks and spilled to disk,
so long captures do not grow memory without bound
- Hex / ASCII views with virtual scrolling, timestamps, line wrap and visible control characters
- Hex / ASCII views with virtual scrolling, timestamps (in both views), line wrap, and CR / LF /
NUL shown as symbols when you want to see them. CR, LF and CRLF all end a line
- Regex search and filter over the whole capture
- Send text or hex, with a selectable line ending (none / CR / LF / CRLF) and input history
- Send text or hex (`48 65 6C`, `0A-0B`, `1,2,3`), with a selectable line ending
(none / CR / LF / CRLF) and input history (↑ / ↓)
- Any baud rate the driver accepts (including non-standard ones), DTR / RTS control, hardware
or software flow control
- **Auto Reconnect**: when the board resets or is unplugged and comes back on the same port, the
app reopens it and keeps adding to the same capture, so the output from before the reset is
not lost
- Save the capture as a binary file, or copy it as hex or ASCII
- **Auto Connect**: connects to the selected port whenever it is available — at startup, when
the board is plugged in, and when it comes back after a reset or unplug. The capture
continues, so the output from before the reset is not lost. Disconnect turns it off
- Save the capture as a binary file or as text with timestamps, or copy it as hex or ASCII

DTR and RTS are off by default, so connecting does not reset the board (an Arduino Uno resets
when DTR turns on, as with the Arduino IDE; an ESP32 is held in reset by RTS without DTR).
Boards with native USB (Leonardo, Raspberry Pi Pico, ESP32-S3 USB) may send nothing until DTR
is on: tick **DtrEnable** for those. Hover the **?** next to the checkboxes for details. The
other defaults match the earlier C# version: no line ending, Send with Enter on.

### Plotter

Expand Down Expand Up @@ -188,15 +196,45 @@ tests run in CI, plus a smoke test under WSL2. Wayland and HiDPI have not been t

## Building from source

Prerequisites: Node.js 20+, stable Rust, and the
[Tauri prerequisites](https://v2.tauri.app/start/prerequisites/) for your OS.
### 1. Prerequisites

- [Node.js](https://nodejs.org/) 20 or later
- Stable Rust via [rustup](https://rustup.rs/) (`rustup update stable` if you already have it)
- The [Tauri prerequisites](https://v2.tauri.app/start/prerequisites/) for your OS:
- **Windows:** Microsoft C++ Build Tools with the "Desktop development with C++" workload.
WebView2 is already part of Windows 10 (recent updates) and 11.
- **Ubuntu 22.04+:**

```sh
sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev \
librsvg2-dev libxdo-dev libsoup-3.0-dev libjavascriptcoregtk-4.1-dev libudev-dev \
build-essential pkg-config libssl-dev
sudo usermod -aG dialout $USER # serial port access; log in again afterwards
```

### 2. Run from source

```sh
git clone https://github.com/771-8bit/SerialMonitorEssential.git
cd SerialMonitorEssential
npm install
npm run tauri dev # run in development mode (set RUST_LOG=debug for verbose logs)
npm run tauri build # build installers into src-tauri/target/release/bundle
npm run tauri dev
```

`npm run tauri dev` starts the frontend dev server and builds and launches the app. The first run
compiles all Rust dependencies and takes a few minutes; later runs are incremental. Changes to the
frontend (`src/`) reload in place, changes to the backend (`src-tauri/`) rebuild and restart the app
(add `-- --no-watch` to turn that off). Set `RUST_LOG=debug` for verbose backend logs.

# the same checks CI runs
### 3. Build an installer

```sh
npm run tauri build # installers in src-tauri/target/release/bundle (nsis/, msi/, deb/, appimage/)
```

### 4. Checks (the same as CI)

```sh
npm run type-check && npm run lint && npm run format:check && npm test
cd src-tauri && cargo fmt -- --check && cargo clippy --all-targets -- -D warnings && cargo test
```
Expand Down
17 changes: 12 additions & 5 deletions docs/07_plotter_spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ Arduino IDE互換の形式を基本とし、拡張形式もサポートする。
|------|------|-----|
| **単一値** | 1行に1つの数値 + 改行 | `123.45\r\n` |
| **複数値 (CSV)** | カンマ/タブ/スペース区切り | `10,20,30\r\n` または `10\t20\t30\r\n` |
| **ラベル付き値** | `label:value` 形式 | `temp:25.5,humidity:60\r\n` |
| **ラベル付き値** | `label:value` / `label=value` / `label value` 形式 | `temp:25.5,humidity:60\r\n`、`V=30.58 I=0.82\r\n`、`temp 25.5 hum 60\r\n` |
| **ヘッダー行** | 列名定義(初回のみ) | `temp,humidity,pressure\r\n` |
| **状態値** | 文字列/数値で状態を表現 | `state:RUNNING\r\n` または `motor:1\r\n` |

Expand Down Expand Up @@ -79,12 +79,19 @@ pub enum ChannelValue {

1. **行区切り:** 改行コードで1データポイントを区切る
2. **値区切り:** カンマ `,` > タブ `\t` > スペース ` ` の優先順位で検出
3. **ラベル検出:** コロン `:` でラベルと値を分離
3. **ラベル検出(2026-11-04 拡張、SYS-F-715):**
- 最初の `=` または `:` でラベルと値を分離する。前後の空白は可(`temp = 25`、`temp: 25`)
- ラベルは文字(日本語可)か `_` で始まること。`12:34:56` のような時刻はペアにしない
- スペース区切りの行では「単語 数値」もペアにする(`temp 25.5 hum 60`)。ただしヘッダー採用後は使わず、行内の裸の数値がすべて直前に単語を持つときだけ(`RUNNING 25.5 60` は従来どおり列位置)
- ペアを含むスペース区切りの行では、ペアにならない単語(`[Mon`、`occurred`)は捨てる。カンマ/タブ区切りでは列位置の状態値として残す
- 値が空のペア(`key=`)は捨てる(列位置の状態値にしない)
4. **型推論:**
- 数値としてパース可能 → `ChannelValue::Numeric`
- パース不可 → `ChannelValue::State`
- 有限の数値 → `ChannelValue::Numeric`
- 数値+短い単位(4 文字以下・数字なし: `11ms`、`3.3V`、`100%`、`2916094]`)→ 単位を除いて `Numeric`
- 文字か `_` で始まる値(`RUNNING`、`MODE2`、`NaN`)→ `ChannelValue::State`
- それ以外(`0.825/0.797`、`1/1`、`0x1F`、`-inf`、`=` や `:` を含む値)→ 捨てる。状態にすると毎行新しい状態になり State Timeline が埋まるため
5. **ラベル自動生成:** ラベルがない場合は `ch0`, `ch1`, ... を自動付与
6. **ヘッダー検出:** 最初の行がすべて非数値の場合、ヘッダーとして解釈
6. **ヘッダー検出:** 最初の行がすべて非数値で、`:` も `=` も含まない場合、ヘッダーとして解釈

### エラーハンドリング

Expand Down
Loading
Loading