# 🧪 `mocker.py` の設計と連携可能性の整理

## ✅ 目的と背景

- 実機がない環境でも `haniwers daq`, `haniwers scan` の機能を開発・テスト・デモできるようにする。
- 実験データやスキャンデータの取得処理（`sampler.py`, `scan`）に自然に差し替えて利用可能とする。
- 特に **リアルタイムモニター** の動作デモで **測定間隔を再現した再生**ができるようにする。

---

## 📦 `mocker.py` に追加する主なクラス・関数

- `MockSerial`
- `FileBackedMockSerial`
- `create_mock_device`
- `create_mock_from_file`
- `load_csv_lines`
- `parse_timestamps`
- `compute_time_deltas`
- `is_mock_port`
- `inject_noise`
- `drop_columns`

---

## 🛠 主な2種類のモックデバイス

| クラス名                 | 用途             | 特徴                                           |
|--------------------------|------------------|------------------------------------------------|
| `MockSerial`   | 実CSVの再利用    | 実データの再現、タイミングの復元、シャッフル対応など |
| `RandomMockSerial`             | ランダム生成     | 自由なダミーデータ生成に最適                 |

---

## 🔁 実データの再利用と拡張オプション

- **シャッフル**: 実データの順序をランダム化して使用
- **スピード変更**: `speed=2.0` で倍速再生、`speed=0.0` で sleep 無効化
- **ループ再生**: ファイル末尾で先頭に戻るオプションも検討可能
- **ノイズ追加 / 列の削除**: より多様なテストパターンの再現に対応可能

---

## 🔗 `sampler.py`, `scan`, `daq` との統合性

- `MockSerial`, `RandomMockSerial` は `serial.Serial` と同等のインターフェースを提供
- `sampler.sample()` や `for_events()`, `for_duration()` などの既存関数に **そのまま渡せる**
- `run_session()` の `device` 引数に渡すことで `haniwers daq` や `haniwers scan` も動作可能
- 実際の接続処理 `device.connect()` で `port == "mock"` などによりモック自動切り替えも可能

---

## 💡 将来的な拡張アイデア

| 拡張項目                | 説明                                                    |
|-------------------------|---------------------------------------------------------|
| `mock:` プレフィクス構文 | `port = "mock:file.csv?shuffle=true&speed=2.0"` のような設定で柔軟に |
| エラーパターン生成       | 欠損データ、異常ADC、時間逆転なども再現可能に             |
| `mocker_utils.py` の分離 | 補助関数群を分けてテスト性・再利用性を向上                  |

---

## ✅ 結論

- `mocker.py` は `sampler`, `scan`, `daq` とシームレスに統合可能な設計
- 実データ再利用・測定タイミングの再現により、**リアルタイムモニターやスレッショルドスキャンの動作確認が実用的に可能**
- 開発・CI・ドキュメント用途でのデモにおいても、非常に有用なモジュールになる
