# KL630 Host Stream Firmware

即時影像語義分割系統，運行於 Kneron KL630 (Cortex-A7, uClibc)。
透過 IMX662 DOL-HDR 雙曝光攝影機進行 STDC 語義分割，並將結果以 RTSP 串流或 HDMI 輸出。

**技術細節 → [`docs/technical_report.md`](docs/technical_report.md)**

---

## 目錄結構

```
kl630_build/
├── web_serve.py             # Web 控制台（主要使用）
├── build_and_serve.py       # CLI 版本（不需要瀏覽器）
├── compile.sh               # Docker 內 ARM 交叉編譯腳本
├── Dockerfile               # kl630-dev image 定義
├── requirements.txt         # Python 套件清單
│
├── src/
│   ├── host_stream/         # 主程式（初始化、推論迴圈、結果處理）
│   ├── app_flow/            # VMF pipeline 控制
│   ├── pre_post/            # YOLOv5 前後處理
│   └── stdc/                # STDC 語義分割後處理
│
├── include/
│   ├── stdc/                # stdc_post_process.h（分析結果結構）
│   └── fake/                # SDK 缺少時的 stub headers
│
├── ini/
│   └── host_stream.ini      # 執行期設定（model、stream、ISP、FEC 參數）
│
│
├── lib/                     # 裝置端 .so 函式庫（VMF SDK）
├── docs/
│   └── technical_report.md  # 完整技術文件
└── build/                   # 編譯輸出（由 compile.sh 產生）
```

---

## 快速開始

### 前置條件

- [Docker Desktop](https://www.docker.com/products/docker-desktop/) 已安裝並執行中
- Python 3.8+

### 安裝

```bash
pip install -r requirements.txt
```

| 套件 | 用途 |
|------|------|
| `flask` | Web 控制台 + HTTP file server |
| `opencv-python` | RTSP 串流預覽（內建 FFmpeg，無需另外安裝）|

### 啟動

```bash
python web_serve.py
```

瀏覽器開啟 `http://localhost:8080/`

---

## 新機器首次設定 SOP

全新 KL630 裝置依序執行以下步驟：

### Step 1 — Compile

在 Web 控制台按 **Compile**。
- 自動建立 Docker image（若不存在）
- 交叉編譯 ARM binary
- 複製 binary / INI / 腳本到 `build/`

> 若 binary 已是最新版本，可跳過此步驟直接從 Step 2 開始。

### Step 2 — 設定 Output Mode

在 **INI Settings** 面板選擇輸出模式（預設 RTSP）：

| 組合 | RTSP | HDMI | 啟動腳本 |
|------|------|------|---------|
| RTSP 串流 | ON | OFF | `demo_rtsp.sh` |
| HDMI 顯示 | OFF | ON | `demo_hdmi.sh` |
| RTSP + HDMI 同時 | ON | ON | `demo_rtsp_hdmi.sh`（INI voc_enable=1）|
| 純推論（無輸出） | OFF | OFF | 直接啟動 binary |

### Step 3 — Deploy to KL630

按 **Deploy to KL630**，自動透過 Telnet 完成：
1. 停止舊 firmware
2. 下載 binary、INI、NEF 模型
3. 下載 `demo_rtsp.sh`、`demo_hdmi.sh`、`demo_rtsp_hdmi.sh`
4. 設定 VOC 輸出模式
5. 啟動 firmware

### Step 4 — First-time ISP Setup

按 **First-time ISP Setup**。
寫入 DOL-HDR 所需的 flash 參數（`dwStatisticsSrcType=2`、`bGTREnable=1`），
**只需執行一次**，設定永久保留在 flash，重新 Deploy 不會被覆蓋。

> 跳過此步驟影像會過暗或曝光不正確。

### Step 5 — 魚眼鏡頭校正（FEC）

在 **INI Settings** 面板設定 Fish-Eye Correction：

| 參數 | 推薦設定 | 說明 |
|------|---------|------|
| FEC | ON | 開啟魚眼校正 |
| **Mode** | **4 — 180° Two Direction** | 天花板魚眼鏡頭推薦模式，同時展開水平與垂直方向 |
| Install Type | 0 — Ceiling | 天花板安裝 |
| EIS | 視需求 | 電子防手震 |

按 **Apply to Device + Restart** 套用並重啟 firmware。


---

## Web 控制台功能說明

### Network Config
設定 **Host IP**（這台 PC）、**KL630 IP**、**HTTP Port**、**Docker Image**。
按 Save 後自動更新 `deploy.sh` 的 `HOST_URL`。

### HTTP Server Files
列出 `build/` 目錄下所有可下載的檔案，以及裝置端手動部署指令：
```sh
wget http://<host_ip>:8080/deploy.sh -O /tmp/deploy.sh && sh /tmp/deploy.sh
```

### RTSP Stream Preview
直接在網頁預覽 KL630 串流，不需要開 VLC。
按 **▶ Start Stream** 即可，連線失敗時 6 秒內回報錯誤。

---

## Actions

| 按鈕 | 說明 |
|------|------|
| **Compile** | Docker 交叉編譯 ARM binary，複製到 `build/` |
| **Deploy to KL630** | Telnet 部署 binary / INI / NEF / 腳本，依 Output Mode 啟動 firmware |
| **First-time ISP Setup** | 新機器一次性 ISP flash 設定（DOL-HDR 參數） |
| **Write Autostart** | 寫入開機自動啟動腳本 `/etc/init.d/S99firmware` |

---

## INI Settings

### Fish-Eye Correction (FEC)

| 參數 | 說明 |
|------|------|
| FEC ON/OFF | 開啟或關閉魚眼校正（`fec_mode = 0` 為關閉）|
| Mode 1 | Single Region |
| Mode 2 | 180° All Direction |
| Mode 3 | 180° One Direction |
| **Mode 4** | **180° Two Direction（推薦）** |
| Mode 5 | PT Mode |
| Install Type | Ceiling / Table / Wall（`initial_fec_app_type`）|
| EIS | 電子防手震（`eis_enable`）|
| DrawBox | H.264 burn-in 偵測框（`DrawBoxEnable`）|

### Output Mode

| 選項 | 說明 |
|------|------|
| RTSP | H.264 RTSP 串流輸出，由 `demo_rtsp.sh` 管理 |
| HDMI | VOC HDMI 顯示輸出，由 `demo_hdmi.sh` 管理 |

- **Save INI（disk only）** — 更新本地 `ini/host_stream.ini`，下次 Deploy 時推送至裝置
- **Apply to Device + Restart** — 立即 Telnet 更新裝置 INI 並重啟 firmware

### Model Settings

切換推論模型（NEF 檔）、ModelId、JobId，支援上傳新 NEF。
**Apply to Device + Restart** 會下載 NEF 到裝置並依目前 Output Mode 重啟。

---

## Terminal

Output Log 下方有命令輸入列，可直接在網頁對 KL630 下指令：

```sh
cat /tmp/fw.log           # 查看 firmware 啟動 log
cat /tmp/rtsp_demo.log    # 查看 RTSP demo log
ps | grep firmware        # 確認 firmware 是否在執行
killall kp_firmware_host_stream
```

---

## CLI 版本（不需要瀏覽器）

```bash
python build_and_serve.py            # 編譯 + 檢查 + 啟動 HTTP server
python build_and_serve.py --no-build # 跳過編譯，直接 serve
python build_and_serve.py --port 9090
```

---

## Firmware 執行結果（console log）

```
[STDC] frame=42 mov=1 diff=4.2 bunker=0.0% car=8.3% grass=0.0% greenery=12.1% person=0.0% pond=0.0% road=71.4% tree=8.2%
[STDC] ON ROAD
[STDC WARN] CAR 8.3%
```

---

## 詳細說明

IMX662 DOL-HDR 雙曝光設定、STDC 語義分割架構、新裝置部署 SOP、故障排查：

**[`docs/technical_report.md`](docs/technical_report.md)**
