Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ dist/
build/
.pytest_cache/
logs/
runtime_logs/
pr_body.md
inventory_results.txt
inventory_results.csv
Expand Down
25 changes: 25 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,31 @@

通常使う入口は、原則として次の2つです。

54コマンドの仕様照合・USM02実機事前確認は、通常Inventoryとは分けて次の専用CLIを使います。

```powershell
$env:PYTHONPATH = "."
py -m src.utr_usm02_v117_validation_cli --rom-number 2052
```

既定はdry-runで、COMポートを開きません。詳細は [USM02 Ver.1.17 54コマンド検証](docs/usm02_v117_54_command_validation.md) を参照してください。

bootstrap後のブザー・ANT1一時切替・周波数開始CH一時変更は、次のPhase 2 CLIをdry-runしてから実行します。

```powershell
$env:PYTHONPATH = "."
py -m src.utr_usm02_safe_controls_cli --target-antenna 1
```

ANT0・ANT1・ANT2を順番に1回ずつInventoryし、タグ応答があったANTだけブザーを鳴らす確認は、次の専用CLIを使います。

```powershell
$env:PYTHONPATH = "."
py -m src.utr_usm02_inventory_buzzer_cli --antennas 0,1,2
```

実機実行時も最初にROM、設定、ANT0〜ANT3の物理接続を再取得します。指定ANTが1つでも接続OKでない場合、Inventory前に停止します。タグ固有値は表示・JSON保存しません。

### 1. 標準Inventoryフロー

```powershell
Expand Down
177 changes: 177 additions & 0 deletions docs/usm02_v117_54_command_validation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
# USM02 Ver.1.17 54コマンド検証

## 目的

UTR-SUN02-4CH / ROMシリーズUSM02について、通信プロトコル説明書Ver.1.17の通常コマンド54件を、漏れと重複なく検証するための入口です。

54件を一律に「ACK確認」とは扱いません。正常時の応答形態、機種・ROM対応、安全条件により、次を区別します。

- 単一ACK
- 設定によりACKまたは無応答
- タグ応答0件以上+完了ACK
- 仕様上の無応答
- NACK(解析済みでも正常完了にはしない)
- USM02では非対応
- 実機ROMでは非対応
- 条件未準備
- ユーザー判断で非実行

## 対象実機

- 機種: UTR-SUN02-4CH
- ROMシリーズ: USM02
- 接続: USBシリアル
- 既定ポート: COM6
- 既定速度: 115200 bps

## 1. 実機に接続しないdry-run

PowerShellでリポジトリ直下から実行します。

```powershell
$env:PYTHONPATH = "."
py -m src.utr_usm02_v117_validation_cli --rom-number 2052
```

`2052`はVer.2.052を仮定する指定です。実機値ではありません。実ROMが不明な場合は `--rom-number` を省略してください。

dry-runではCOMポートを開かず、54件の計画と集計だけを表示します。

## 2. 実機の事前情報だけを取得

```powershell
$env:PYTHONPATH = "."
py -m src.utr_usm02_v117_validation_cli `
--execute-bootstrap `
--port COM6 `
--baudrate 115200 `
--json-out runtime_logs\usm02_v117_bootstrap.json
```

この段階で送信するのは、次の事前確認だけです。

1. ROMバージョンを読み、USM02 / UTR-SUN02-4CHを確定する。
2. RAM上の動作モードをコマンドモードへ切り替える。
3. コマンドモードのアンテナ切替設定を読む。
4. ANT0〜ANT3へUHF_CheckAntennaを送り、物理接続状態を確認する。
5. Inventoryパラメータを読み、TID付加設定を確認する。
6. コマンドモードと自動読み取りモードのEPC(UII)関連設定を読み、応答件数・順序へ影響する設定を確認する。

次の3種類のアンテナ数は別々に記録します。

| 項目 | 取得元 | 意味 |
|---|---|---|
| 物理容量 | ROMシリーズから確定した機種仕様 | USM02ではANT0〜ANT3の4ポート |
| 設定アンテナ | 7.4.5 アンテナ切替設定 | 現在「使用する」と設定されたアンテナ |
| 接続OKアンテナ | 7.3.5 UHF_CheckAntenna | 実際に接続OKと応答したアンテナ |

## 3. 2バイト目の解釈

応答の2バイト目は、常にアンテナ番号ではありません。

- RFタグデータ応答(コマンド `6Ch`)かつ「アンテナID出力=有効」の場合だけ、アンテナ番号として解釈します。
- 通常ACK、NACK、完了ACK、または「アンテナID出力=無効」のRFタグ応答では、リーダライタIDとして解釈します。

## 4. 強制安全ルール

- Kill、Lock、UHF_Encode、FLASH設定初期化は送信しません。
- 予期しないNACK、timeout、復元失敗が発生したら後続送信を止めます。
- Access/Kill Passwordをログへ出しません。
- PC/UII/EPC/TIDの実値を共有用ログへ出しません。
- 設定変更は事前読取、同値書込、再読取、復元確認の順で行います。
- タグ書込は廃棄可能タグのUser領域だけを対象とし、事前読取と復元を必須とします。
- UHF_ThroughCmdは、TIDでタグICを特定し、そのIC向け安全コマンドを確定できるまで実行しません。

## 5. 現在の実装範囲

現時点のCLIは、54件の仕様カタログ、応答検証ロジック、dry-run、実機事前確認までを実装しています。54件すべてを自動送信する機能ではありません。

まず実機事前確認結果からROMと設定依存条件を確定し、その結果に基づいて実行可能なコマンドだけを次の実装単位へ進めます。これにより、非対応コマンドや破壊的コマンドを「54件達成」のために誤送信することを防ぎます。

## 6. Phase 2: 安全制御確認

bootstrapが正常で、USM02、接続ANT、設定値を確認できた場合だけ実行します。

dry-run:

```powershell
$env:PYTHONPATH = "."
py -m src.utr_usm02_safe_controls_cli --target-antenna 1
```

実機実行:

```powershell
$env:PYTHONPATH = "."
py -m src.utr_usm02_safe_controls_cli `
--execute `
--port COM6 `
--baudrate 115200 `
--target-antenna 1 `
--verify-rf-channel `
--json-out runtime_logs\usm02_phase2_safe_controls.json
```

実行内容:

1. ROM、応答依存設定、ANT0〜ANT3の接続状態を再取得する。
2. ブザー制御を応答要求ありで1回実行し、ACKを確認する。
3. コマンドモードRAMのアンテナを接続OKのANT1へ一時変更する。
4. アンテナ設定を読み戻す。
5. コマンドモードRAMの周波数開始CHを、現在使用許可されている26〜32ch内の別CHへ一時変更する。
6. 周波数設定を読み戻し、使用許可CHマスクが不変であることを確認する。
7. Inventoryを1回だけ実行し、タグ固有値を保存せず、タグ応答ANTと完了ACKの実使用CHを確認する。
8. 周波数開始CHを元へ戻して読み戻す。
9. アンテナ設定を元へ戻して読み戻す。

周波数確認で変更するのはRAM上の「開始チャンネル番号」だけです。使用許可CHは変更せず、FLASHへ保存しません。`--verify-rf-channel` を指定した場合だけInventoryを1回実行します。タグのPC/UII/EPC/TIDは表示・保存せず、応答件数、アンテナ番号、完了ACKの実使用CHだけを残します。「現在設定されているチャンネル番号」は最後にキャリア出力したCHなので、Inventory前の読戻し時点では変化していなくても正常です。

例外、NACK、読戻し不一致の場合も `finally` で周波数、アンテナの順に復元します。復元確認に失敗した場合は後続操作を行わず、UTRRWManagerまたは読取コマンドで現在値を確認してください。

## 7. ANT0〜2 Inventory・タグ検出時ブザー確認

ANT0、ANT1、ANT2へタグを1枚ずつ置いた状態で、アンテナ別の読取と条件付きブザーを確認します。これは54コマンド全件検証とは分けた、限定的な実機確認です。

dry-run:

```powershell
$env:PYTHONPATH = "."
py -m src.utr_usm02_inventory_buzzer_cli --antennas 0,1,2
```

実機実行:

```powershell
$env:PYTHONPATH = "."
py -m src.utr_usm02_inventory_buzzer_cli `
--execute `
--port COM6 `
--baudrate 115200 `
--antennas 0,1,2 `
--json-out runtime_logs\usm02_ant012_inventory_buzzer.json
```

実行順序:

1. ROM、応答依存設定、ANT0〜ANT3の物理接続を再取得する。
2. アンテナID出力がON、EPCバッファリングがOFF、ANT0〜2がすべて接続OKであることを確認する。
3. 開始前のコマンドモードRAMアンテナ設定を読み取る。
4. ANT0、ANT1、ANT2の順にRAM設定を切り替え、毎回読み戻す。
5. 各ANTでInventoryを1回だけ実行する。
6. タグ応答が1件以上のANTだけ、応答要求ありの「ピッピッピ」ブザーを1回送信しACKを確認する。
7. 開始前のアンテナ設定へ戻し、読み戻す。

画面とJSONへ残すのは、ANT別のタグ応答数、ユニークタグ数、完了ACK枚数、実使用CH、ブザーACK、復元結果だけです。PC/UII/EPC/TID、生フレームは残しません。タグが0件のANTではブザーを送信しません。NACK、timeout、応答不正、ANT番号不一致が出た場合は後続ANTへ進まず、`finally` で開始前のアンテナ設定へ復元します。

ブザーACKはリーダライタがコマンドを正常受理した確認です。実際に音が聞こえたかは自動判定できないため、ANT0、ANT1、ANT2ごとに人が確認し、ACK結果とは分けて記録します。

## 8. 開発者確認

```powershell
$env:PYTHONPATH = "."
py -m pytest -q
py -m compileall -q src tests
git diff --check
```

実機結果のJSONは `runtime_logs/` に保存し、Gitへコミットしません。
56 changes: 56 additions & 0 deletions prompts/codex_usm02_ant012_inventory_buzzer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Codex依頼文: USM02 ANT0〜2 Inventory・タグ検出時ブザー確認

`UTR_USB_Python_CodeX` の `feature/usm02-v117-validation-harness` ブランチで、コードを変更せず、ANT0・ANT1・ANT2のInventoryとタグ検出時ブザーだけを実行してください。

前提実機:

- UTR-SUN02-4CH / USM02 Ver.2.052
- COM6 / 115200 bps
- ANT0、ANT1、ANT2にタグを1枚ずつ配置済み
- ブザー音は「ピッピッピ」を使用

禁止:

- Kill、Lock、UHF_Encode、FLASH設定初期化を送信しない
- FLASH、タグメモリ、Access Passwordを書き換えない
- 指定CLI以外から実機コマンドを追加送信しない
- 生Hex、PC/UII/EPC/TID、タグ固有値、製造番号、パスワードを回答へ載せない
- コード変更、commit、push、PR変更、mergeをしない

手順:

```powershell
cd C:\Users\tamaru\Documents\Codex\repos\UTR_USB_Python_CodeX
git fetch origin
git switch feature/usm02-v117-validation-harness
git pull --ff-only
git status --short
$env:PYTHONPATH = "."
py -m pytest -q
py -m src.utr_usm02_inventory_buzzer_cli --antennas 0,1,2
py -m src.utr_usm02_inventory_buzzer_cli --execute --port COM6 --baudrate 115200 --antennas 0,1,2 --json-out runtime_logs\usm02_ant012_inventory_buzzer.json
git status --short
```

実行時の判断:

- bootstrapでANT0、ANT1、ANT2のいずれかが接続OKでなければ、Inventoryを実行せず停止する。
- アンテナID出力がONでなければ停止する。
- EPCバッファリングがOFFでなければ停止する。
- NACK、timeout、タグ応答ANT不一致、読戻し不一致、復元失敗が出たら、追加コマンドを送らず停止する。
- タグ0件のANTは異常と決めつけず、ブザー未送信として記録する。
- プログラムのブザーACKと、人が実際に音を聞いた確認を混同しない。

回答項目:

1. pytest結果
2. dry-run結果
3. ROM、機種、接続OKアンテナ、アンテナID出力
4. ANT0、ANT1、ANT2ごとのタグ応答数とユニークタグ数
5. ANT0、ANT1、ANT2ごとの完了ACK枚数と実使用CH
6. ANT0、ANT1、ANT2ごとのブザー送信有無とブザーACK
7. ユーザーに、ANT0、ANT1、ANT2の「ピッピッピ」音が実際に聞こえたか確認する
8. 開始前アンテナ設定と復元結果
9. RF送信はInventory最大3回、FLASH変更なし、タグ書込なし
10. NACK、timeout、例外、復元失敗の有無
11. `git status --short`
49 changes: 49 additions & 0 deletions prompts/codex_usm02_phase2_safe_controls.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Codex依頼文: USM02 Phase 2安全制御確認

`UTR_USB_Python_CodeX` の `feature/usm02-v117-validation-harness` ブランチで、コードを変更せずPhase 2だけを実行してください。

前提実機:

- UTR-SUN02-4CH / USM02 Ver.2.052
- COM6 / 115200 bps
- 設定アンテナ: ANT0
- 接続OK: ANT0、ANT1
- bootstrapでNACK、timeout、例外なし

禁止:

- Kill、Lock、UHF_Encode、FLASH設定初期化を送信しない
- FLASH、タグメモリ、Access Passwordを書き換えない
- RF送信はPhase 2 CLI内のInventory 1回だけに限定する
- 生Hex、タグ固有値、製造番号、パスワードを回答へ載せない
- コード変更、commit、push、PR変更、mergeをしない

手順:

```powershell
cd C:\Users\tamaru\Documents\Codex\repos\UTR_USB_Python_CodeX
git fetch origin
git switch feature/usm02-v117-validation-harness
git pull --ff-only
git status --short
$env:PYTHONPATH = "."
py -m pytest -q
py -m src.utr_usm02_safe_controls_cli --target-antenna 1 --verify-rf-channel
py -m src.utr_usm02_safe_controls_cli --execute --port COM6 --baudrate 115200 --target-antenna 1 --verify-rf-channel --json-out runtime_logs\usm02_phase2_safe_controls.json
git status --short
```

NACK、timeout、読戻し不一致、復元失敗、対象条件不一致が出たら、追加コマンドを送らず停止してください。

回答項目:

1. pytest結果
2. dry-run結果
3. ブザーACKの成否(音が聞こえたかは推測せず、ユーザー確認事項として分ける)
4. アンテナの変更前→一時変更→復元と、各読戻し結果
5. 開始CHの変更前→一時変更→復元
6. 使用許可CHが変更されていないこと
7. Inventoryのタグ応答数、タグ応答ANT、完了ACKの実使用CH(タグ固有値は記載しない)
8. RF送信はInventory 1回だけ、FLASH変更なし、タグ書込なし
9. NACK、timeout、例外、復元失敗の有無
10. `git status --short`
49 changes: 49 additions & 0 deletions prompts/codex_usm02_v117_bootstrap.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Codex依頼文: USM02事前確認だけを実行

対象リポジトリで、既存コードを変更せず、以下だけを実行してください。

対象:

- UTR-SUN02-4CH / ROMシリーズUSM02
- USB COM6
- 115200 bps

禁止:

- Kill、Lock、UHF_Encode、FLASH設定初期化を送信しない
- タグメモリを書き換えない
- FLASHを書き換えない
- PC/UII/EPC/TID、シリアル番号、パスワードの実値を回答やGitへ載せない
- merge、commit、push、PR作成をしない

手順:

```powershell
cd C:\Users\tamaru\Documents\Codex\repos\UTR_USB_Python_CodeX
git fetch origin
git switch feature/usm02-v117-validation-harness
git pull --ff-only
git status --short
git branch --show-current
$env:PYTHONPATH = "."
py -m pytest -q
py -m src.utr_usm02_v117_validation_cli --rom-number 2052
py -m src.utr_usm02_v117_validation_cli --execute-bootstrap --port COM6 --baudrate 115200 --json-out runtime_logs\usm02_v117_bootstrap.json
git status --short
```

予期しないNACK、timeout、対象機種不一致、例外が1件でも出たら、その時点で停止してください。

回答は次の項目だけにしてください。

1. pytest結果
2. dry-runの54件集計
3. 実機ROM(シリーズ名USM02とバージョンだけ。製造番号は記載しない)
4. 物理アンテナ容量
5. 設定アンテナ番号
6. 接続OKアンテナ番号
7. アンテナID出力、TID付加、EPCバッファリング、読取サイクル完了応答、アンテナ切替完了応答、キャリア検知応答のON/OFF
8. NACK、timeout、例外の有無
9. `git status --short`(`runtime_logs/`以外の変更がないこと)

生の送受信Hexとタグ固有値は回答へ貼らないでください。
Loading