# SatBox Ver0.1.1a 機能拡張仕様書
## YAESU FT-847対応および複数無線機対応

### 1. 開発目的

現在のSatBoxはICOM IC-820Hを使用して衛星通信のドプラー補正を行っている。

今回、YAESU FT-847を追加し、将来的にICOM IC-9700およびSA818Sにも対応できる構成に変更する。

さらに、無線機の選択・設定、OFFSET値の管理、受信周波数と送信周波数の連動制御を改善する。

**重要：すべての機能を一度に実装しないこと。**

以下の項目1～5を順番に進め、各項目の実装後に動作確認を行う。確認が完了するまでは次の項目に進まない。

---

### 2. 作業フォルダー

現在の作業フォルダー：

`C:\Users\kueno\OneDrive\Desktop\Ham\3_Arduino\ESP32_SatBox\SatBox_Ver0.1.1a`

**作業開始前には、必ず既存ファイルをbackupフォルダーへバックアップすること。**

バックアップ条件：

- 修正前のファイルを保存する。
- 同名ファイルを上書きせず、日時などで区別する。
- バックアップは復元可能な状態にする。
- 既存の設定値、衛星データ、OFFSET値を失わないようにする。
- 作業対象以外の機能を不用意に変更しない。
- 変更内容とテスト方法を作業終了時に報告する。

開発進捗によってVer0.1.1aからVer0.1.1bなどに変更する可能性がある。その場合はユーザーが新しい作業フォルダーを指定する。

**Codexの判断で作業フォルダーやバージョンを変更しないこと。**

---

### 3. FT-847 CAT通信の実機テスト結果

ESP32-S3とYAESU FT-847をRS-232Cで接続し、実機でCAT制御を検証した。

以下は確認済みの仕様であり、FT-847の実装ではこの結果を優先する。

#### 3.1 ハードウェア

| 項目 | 設定 |
|---|---|
| MCU | ESP32-S3 |
| CATインターフェース | MAX3232 |
| ESP32 RX | GPIO15 |
| ESP32 TX | GPIO16 |
| FT-847 CATボーレート | 57600bps |
| シリアル形式 | 8N2 |
| CATコマンド長 | 5バイト |
| CATコマンド間隔 | **300ms** |
| 読み出しタイムアウト | 500ms（暫定値） |
| 周波数制御分解能 | 10Hz |

Arduinoでの初期化：

```cpp
HardwareSerial FT847(1);
FT847.begin(57600, SERIAL_8N2, 15, 16);
```

上記のGPIOは実験で使用した配線である。SatBox本体に組み込む際には、既存のピン割り当てとハードウェア構成を確認すること。既存のGPIO設定を無断で変更しない。

#### 3.2 FT-847 CATコマンド

FT-847のCATコマンドは5バイト構成で、最初の4バイトがパラメータ、最後の1バイトがコマンドである。

| 機能 | コマンド |
|---|---|
| CAT ON | `0x00` |
| CAT OFF | `0x80` |
| SAT ON | `0x4E` |
| SAT OFF | `0x8E` |
| MAIN周波数読み出し | `0x03` |
| SAT RX周波数読み出し | `0x13` |
| SAT TX周波数読み出し | `0x23` |
| SAT RX周波数設定 | `0x11` |
| SAT TX周波数設定 | `0x21` |

CAT ONとSAT ONの間には、実機で500msの待ち時間を使用して正常動作を確認した。

SAT ON後には1000msの待ち時間を使用した。

初期化時の待ち時間は、通常のCATコマンド間隔300msとは別に扱うこと。

#### 3.3 周波数データ形式

周波数は8桁のBCD形式で、10Hz単位で送受信する。

例：

`43 59 00 00`

これは435.90000MHzを表す。

読み出し応答は5バイトで、最初の4バイトがBCD周波数、最後の1バイトがモード情報となる。

確認済みモード例：

- `0x01`：USB
- `0x00`：LSB

周波数設定時にはHz値を10で割り、8桁BCDに変換して送信する。

#### 3.4 CAT待ち時間の実機測定

| CAT待ち時間 | 結果 |
|---|---|
| 500ms | 正常 |
| 400ms | 正常 |
| 300ms | 正常 |
| 250ms | 正常 |
| 240ms | READBACK ERROR |
| 200ms | READBACK ERROR |

**FT-847ではCATコマンド間隔を300msに設定すること。**

250msでも動作したが、安定性を考慮して300msを採用する。

この値は重要であり、他の無線機の待ち時間を流用しないこと。

読み出しタイムアウトは500msを暫定値とする。これは応答がない場合の最大待機時間であり、正常応答時に常に500ms待つという意味ではない。

#### 3.5 FT-847 TRACK機能の検証結果

FT-847本体のTRACKスイッチをONにすると、パネルのVFO操作ではRXとTXが逆方向に連動する。

しかし、CATによる周波数設定では連動しなかった。

実機確認結果：

1. CATでTX周波数のみ100Hzずつ変更 → RXは変化しない。
2. CATでRX周波数のみ100Hzずつ変更 → TXは変化しない。
3. CATでRX/TXを個別に変更 → 両方とも正常に動作する。

したがって、**SatBoxではRXとTXの周波数を個別に計算し、CATコマンドで設定する必要がある。**

TRACK ON/OFFに相当するCATコマンドは、現在確認できていない。

未確認のコマンドを推測して送信しないこと。

---

## 4. 実装項目

### 項目1：設定画面への無線機選択機能追加

最初に実装する項目。

現在はICOM IC-820Hのみを想定しているが、以下の4種類から選択できるようにする。

| 無線機 | 状態 |
|---|---|
| ICOM IC-820H | 有効 |
| YAESU FT-847 | 有効 |
| ICOM IC-9700 | 将来対応・無効 |
| SA818S | 将来対応・無効 |

IC-9700とSA818Sは選択候補として表示するが、現時点では使用できないようにする。

#### 1-1. 設定方法

以下の両方から無線機を設定できるようにする。

- PC側の設定プログラム `SatBox_Settings_language.py`
- SatBox本体のWeb設定画面

どちらから設定しても同じ設定値が保存され、再起動後も保持されること。

#### 1-2. 設定項目

- 無線機の機種
- CAT通信ボーレート
- ICOMの場合はCI-Vアドレス

初期値の例：

| 無線機 | ボーレート | CI-Vアドレス |
|---|---|---|
| IC-820H | 現在の既存設定を維持 | 0x42 |
| FT-847 | 57600 | 不要 |
| IC-9700 | 未実装 | 未実装 |
| SA818S | 未実装 | 不要 |

FT-847のシリアル形式は8N2とする。

ICOMのCI-V設定は既存の処理を維持する。

無線機を変更しても、他の無線機に保存された設定値が失われない構成が望ましい。

#### 1-3. 既存機能の保護

- 初期状態ではIC-820Hを選択する。
- 既存のIC-820HのCI-V制御を壊さない。
- 既存設定ファイルを読み込めるようにする。
- 設定保存後に正しく読み戻せることを確認する。
- WebとPC設定プログラムの設定内容に矛盾が生じないようにする。

**項目1の実装が終わったら作業を停止し、ユーザーに動作確認を依頼すること。**

---

### 項目2：PC設定プログラムのタブ化

対象ファイル：

`SatBox_Settings_language.py`

現在の設定画面をタブ形式に変更する。

タブ構成：

1. ステーション
2. ネットワーク
3. アラート
4. メース設定
5. 無線機

各タブで該当する設定項目を編集できるようにする。

既存の入力項目、保存機能、読み込み機能は維持する。

画面レイアウトの変更によって設定データの形式が変わる場合は、既存データとの互換性を確保する。

「メース設定」の正式名称と対応する既存設定項目は、実装前に確認すること。

項目1で追加した無線機設定は「無線機」タブに配置する。

項目2の実装後も、必ず動作確認を行う。

---

### 項目3：選択した無線機によるドプラー制御

設定で選択された無線機に応じて、適切なCAT/CI-V制御を使用する。

#### IC-820H

既存のCI-Vドプラー制御をそのまま維持する。

既存の周波数計算、OFFSET補正、MAIN/SUB制御などを壊さないこと。

#### FT-847

実機テストで確認済みのCATコマンドを使用する。

- SAT RX周波数設定：`0x11`
- SAT TX周波数設定：`0x21`
- SAT RX周波数読み出し：`0x13`
- SAT TX周波数読み出し：`0x23`
- CATコマンド間隔：300ms
- 読み出しタイムアウト：500ms（暫定）

RXとTXを独立して制御する。

既存のドプラー計算ロジックを可能な限り共通化し、無線機ごとに通信処理を切り替える設計とする。

FT-847への対応のために、IC-820Hの既存処理を不用意に書き換えない。

#### ポートについて

現在のSatBoxで使用している通信ポート、GPIO、USB Host、UARTの割り当てを先に調査する。

選択した無線機に対応する通信インターフェースを使用すること。

ポートの競合がある場合は、実装前に報告する。

**ハードウェアの変更を必要とする場合は、ユーザーの承認を得てから進めること。**

---

### 項目4：OFFSET値を衛星・無線機別に管理

現在のOFFSET値は衛星ごとに保存されている。

これを次の組み合わせで管理する方式に変更する。

**衛星ID + 無線機ID → OFFSET値**

例えば：

| 衛星 | 無線機 | OFFSET |
|---|---|---|
| RS-44 | IC-820H | -2382Hz |
| RS-44 | FT-847 | 0Hz |
| FO-29 | IC-820H | 既存値 |
| FO-29 | FT-847 | 0Hz |

上記の数値はデータ構造を示す例である。

必要条件：

- 同じ衛星でも無線機ごとに異なるOFFSETを保存できる。
- 無線機を切り替えると対応するOFFSETを読み込む。
- OFFSETを変更しても別の無線機の値に影響しない。
- 現在保存されているOFFSET値を失わない。
- 旧形式のデータを新形式へ移行できるようにする。
- 旧データはIC-820H用として引き継ぐことを基本方針とする。

保存形式は既存プログラムの構造を確認してから決定する。

---

### 項目5：RX/TX周波数のリアルタイム連動

**この項目は特に慎重に実装すること。**

現在のSatBoxでは、ロータリーエンコーダーで受信周波数を調整し、スイッチを長押しして送信周波数を合わせる方式になっている。

これを改善する。

#### 目的

ロータリーエンコーダー、または無線機本体のVFOで受信周波数を変更すると、送信周波数もリアルタイムで連動して変化するようにする。

これにより、衛星経由で戻ってくる自分の声を聞きながら周波数を調整できるようにする。

FT-847本体のTRACK機能に相当する動作をSatBox側で実現する。

#### 基本要件

- ロータリーエンコーダーでRX周波数を変更するとTX周波数も連動する。
- 無線機本体のVFO操作でRX周波数が変わった場合も検出し、TX周波数を連動させる。
- RXとTXの周波数変化方向は衛星の運用モードに応じて正しく処理する。
- 現在のドプラー補正を維持する。
- 保存済みOFFSET値を正しく適用する。
- 不必要なCATコマンドの連続送信を避ける。
- 無線機のCAT通信間隔制限を守る。

#### 注意事項

FT-847では、CATでRX周波数を変更してもTXは自動追従しないことを実機で確認している。

したがってSatBox側でTX周波数を計算し、独立したCATコマンドで設定する必要がある。

また、SatBoxが設定した周波数を再びVFO操作として認識してしまうと、制御がループする可能性がある。

この問題を防止する仕組みが必要である。

特に以下を検討すること。

- CAT設定値と実際の読み出し値の比較
- ユーザーによるVFO操作の検出
- ドプラー補正による自動周波数変更との区別
- 周波数制御の競合防止
- CATコマンド送信間隔
- 周波数変化の追従遅延
- 衛星モードごとのRX/TX連動方向
- 送信中の周波数変更動作

**項目5は、いきなり実装せず、最初に設計案を提示すること。**

ユーザーが設計を確認した後に、段階的に実装・テストする。

---

## 5. Codexへの作業指示

今回の最初の依頼では、次の順序で進めること。

### Step 1：既存プログラムの調査

作業フォルダー内のソースコードを調査し、以下を確認する。

- 設定データの保存方法
- Web設定画面の構成
- `SatBox_Settings_language.py` の構成
- IC-820HのCI-V設定と通信処理
- CAT/CI-Vで使用しているポート
- 無線機設定の追加に必要な変更ファイル

調査結果と変更方針をユーザーに報告する。

### Step 2：バックアップ

変更対象のファイルをbackupフォルダーに保存する。

### Step 3：項目1だけを実装

無線機選択機能を追加する。

この段階ではドプラー制御の切り替えまで実装しない。

既存のIC-820Hの動作を維持する。

### Step 4：動作確認

以下を確認する。

- PC設定プログラムで機種を選択できる。
- Web画面で機種を選択できる。
- ボーレートを設定できる。
- ICOMのCI-Vアドレスを設定できる。
- 設定を保存できる。
- 再起動後も設定値が保持される。
- IC-9700とSA818Sは未対応として扱われる。
- IC-820Hの既存動作に影響がない。

### Step 5：作業報告と停止

実装内容、変更ファイル、確認結果、未確認事項を報告する。

**ユーザーから次の指示があるまで項目2以降を実装しないこと。**

---

## 6. 最重要事項

1. 既存のSatBoxの正常動作を維持すること。
2. 作業前に必ずbackupフォルダーへバックアップすること。
3. 5項目を一度に実装しないこと。
4. FT-847のCATコマンド間隔は**300ms**とすること。
5. FT-847のCAT通信は**57600bps、8N2**とすること。
6. FT-847のRX/TXはCATで個別に制御すること。
7. IC-820Hの既存CI-V制御を壊さないこと。
8. OFFSET値の移行では既存データを失わないこと。
9. 項目5のリアルタイム連動は設計レビュー後に実装すること。
10. 各項目が完了したら必ず作業を停止し、ユーザーの確認を待つこと。

**まずは項目1のための既存コード調査から開始してください。**

# SatBox Ver0.1.1a 追加・修正仕様
## 設定プログラムの画面構成と言語切り替え

先ほどの仕様書について、以下の内容を追加・修正してください。

### 1. 設定プログラムの画面構成

対象：`SatBox_Settings_language.py`

現在の1画面にすべての設定項目を表示する方式から、タブ切り替え方式に変更する。

添付した2枚目の「FM Repeater Settings Ver0.1.1」の画面をレイアウトの参考にすること。

タブは次の5種類とする。

1. ステーション（Station）
2. ネットワーク（Network）
3. アラート（Alert）
4. メール設定（Mail Settings）
5. 無線機（Radio）

「メース設定」は誤記であり、正しくは「メール設定」とする。

メール設定タブには、現在のMAILおよびSMTP Serverの設定項目をまとめる。

### 2. 言語選択機能

画面上部にLanguageの選択欄を追加する。

選択肢：

- Japanese
- English

言語を変更すると、タブ名、項目名、ボタン、説明文などの表示言語が切り替わるようにする。

現在の設定プログラムの多言語対応構造を調査し、可能な限り既存の仕組みを利用すること。

選択した言語は保存し、次回起動時にも反映すること。

### 3. COMポートの役割

**重要：画面上部のCOMポートは、PCとESP32-S3を接続するためのポートである。**

これは無線機のCAT/CI-Vポートではない。

例：

`COM13 → ESP32-S3 → 無線機`

したがって、COMポートの選択欄は画面上部に残し、すべてのタブで共通して使用できるようにする。

Refreshボタンも同様に画面上部に配置する。

無線機タブで設定するボーレートは、ESP32-S3と無線機とのCAT/CI-V通信速度である。

**PCとESP32-S3間の設定通信用ボーレートと混同しないこと。**

### 4. 画面レイアウト

希望する基本構成：

```text
SatBox Settings
+-----------------------------------------------+
| COM Port [COM13 ▼]  Language [Japanese ▼]      |
|                                  [Refresh]    |
+-----------------------------------------------+
| Station | Network | Alert | Mail | Radio       |
+-----------------------------------------------+
|                                               |
|       選択したタブの設定項目を表示             |
|                                               |
|                                               |
+-----------------------------------------------+
| [LOAD] [SAVE] [TEST MAIL] [LOGGING] [CLOSE]    |
+-----------------------------------------------+
```

- COMポートと言語選択はタブの外側に配置する。
- LOAD、SAVE、CLOSEなどのボタンは原則として画面下部に固定する。
- TEST MAILはメール設定タブで利用できるようにする。
- 既存のLOGGING機能も維持する。
- 設定項目が画面内に収まらない場合はスクロールできるようにする。
- ウィンドウサイズは現在の画面を参考に、使いやすい大きさとする。

### 5. 無線機タブ

次の項目を配置する。

**Radio Model**

- ICOM IC-820H（有効）
- YAESU FT-847（有効）
- ICOM IC-9700（未対応）
- SA818S（未対応）

**CAT/CI-V Baud Rate**

選択した無線機に対応する通信速度を設定する。

FT-847の初期値は57600bps。

**CI-V Address**

ICOMを選択した場合のみ設定可能とする。

IC-820Hの既定値は`0x42`。

YAESU FT-847ではCI-Vアドレスは不要なので、入力欄を無効化する。

**注意：FT-847のCATコマンド間隔は300ms。**

これは実機テストで確認済みの値であり、ドプラー制御の実装時に必ず適用する。

### 6. 開発手順

先ほどの仕様書の「項目ごとに進める」という方針は変更しない。

最初は項目1の無線機選択・設定保存機能から進める。

項目2のタブ化と言語切り替えは、項目1の動作確認が完了してから実装する。

ただし、項目1の設計時には、項目2でタブ化することを考慮し、後から大幅な作り直しが必要にならない構造にすること。

**作業前のbackupフォルダーへのバックアップは必須。**

各項目の完了後はユーザーに報告し、次の指示を待つこと。