基於 WPF (.NET 9.0) 的通用微控制器暫存器視覺化、編輯與測試工具。透過 JSON 檔案定義暫存器結構,支援多種 MCU 系列,並提供 USB (HID/CDC) 與 Serial Port 等硬體通訊介面。
# 還原套件
dotnet restore
# 建置專案
dotnet build
# 執行應用程式
dotnet run| 項目 | 技術 | 版本 |
|---|---|---|
| 框架 | .NET | 9.0 Windows |
| UI | WPF | - |
| MVVM | CommunityToolkit.Mvvm | 8.4.0 |
| DI | Microsoft.Extensions.DependencyInjection | 10.0.1 |
| 日誌 | Serilog | 4.3.0 |
| 序列化 | Newtonsoft.Json | 13.0.4 |
| 硬體通訊 | HidSharp, System.IO.Ports | 2.1.0, 9.0.0 |
| 繪圖 | ScottPlot.WPF | 5.0.53 |
| 腳本引擎 | Microsoft.CodeAnalysis.CSharp.Scripting | 4.12.0 |
| Python | IronPython | 3.4.2 |
GmtTestTool/
├── Models/ # 資料模型(繼承 ObservableObject)
├── ViewModels/ # MVVM ViewModel(使用 Source Generators)
│ ├── Base/ # ViewModel 基底類別(M8322ViewModelBase 等)
│ ├── Families/ # 晶片家族 ViewModel(MxxxxViewModel, GxxxxViewModel)
│ └── Chips/ # 晶片特定 ViewModel
├── Views/ # WPF 視圖(Windows + UserControls)
│ ├── Families/ # 家族特定視圖
│ └── Chips/ # 晶片特定視圖
├── Services/ # 硬體通訊、日誌、工具服務
│ ├── Hardware/ # I2C, UART, USB, Capture, GPIO 服務
│ ├── Infrastructure/ # Logger, DI, Config, Cache 核心基礎設施
│ ├── Data/ # Snapshot, Plot, Decimation 資料服務
│ └── Interfaces/ # 服務介面定義
├── Converters/ # WPF 值轉換器
├── Helpers/ # 工具類別
├── Resources/ # XAML 資源字典
├── chips/ # 晶片定義 JSON(嵌入式資源)
├── configuration/ # 設定檔(usbconfig.json, i2cconfig.json 等)
└── docs/ # 技術文件
- 動態樹狀結構:根據 JSON 定義檔自動生成 Peripheral → Register → Field 的三層結構
- 即時讀寫:支援單一暫存器或整批周邊模組的具備「上下文感知」讀取與寫入功能
- 位元欄位 (Field) 解析:自動將暫存器數值解析為具體的位元欄位,並提供 CheckBox 方便設定
- 數值變更高亮:當前數值與參考基準值不同時自動變色(紅色),並可隨時重置基準
- 企業視覺識別:主視窗整合企業 Logo,採用專業的工業級 UI 設計
- 多種數值格式:支援 Hex、Decimal、Binary、Octal 格式即時切換
- 標籤欄位監控:支援透過 Tag 系統篩選和監控特定欄位群組
- 多晶片視圖:GXXXX 系列支援同時顯示多個晶片,並在切換時保留暫存器數值
- 智慧視窗管理:重複開啟暫存器視窗時自動激活現有視窗,防止視窗氾濫
- 可收合參數區塊:Pattern Generator 參數區塊使用 Expander 控制項,提供更好的空間利用率
- RPM 快照儲存/載入:M8314 系列支援速度曲線 RPM 快照的儲存與載入功能
- 響應式工具列:主視窗工具列使用 Viewbox 包裝,自適應不同視窗大小
- USB 自動偵測:啟動後自動掃描
configuration/usbconfig.json定義的裝置 - 熱插拔支援:支援裝置拔插後自動重新連線(500ms 輪詢監控)
- 韌體版本檢查:連線後讀取硬體版本,並與目標版本比對
- 自動載入晶片:根據配置自動載入對應的暫存器定義檔
- 模式切換:支援透過全域熱鍵在任何視窗進行切換:
CTRL+SHIFT+ALT+F11: BackDoor Mode (顯示 Tag 為 "backdoor" 的周邊)CTRL+SHIFT+ALT+F1: Engineering Mode
- 數據競爭保護:
- 輸入保護:使用者編輯時自動標記
IsEditing狀態,防止背景硬體更新沖掉輸入內容 - 更新抑制:實作內部更新抑制旗標,消除 UI 與 Model 之間的更新風暴
- 輸入保護:使用者編輯時自動標記
- 執行緒安全:所有硬體存取(I2C/UART/PWM)皆受
SemaphoreSlim保護
- 即時監控:支援 30 FPS 渲染節流,在大數據量下保持流暢
- 雙游標系統:支援座標量測、Delta 計算與高精度數值顯示
- 矩形框選縮放 (Rectangle Zoom):支援精確區域放大,快速聚焦關注數據範圍
- 磁吸式互動 UX:
- 游標開啟時:左鍵點擊自動捕捉最近的游標並跟隨拖曳(200px 半徑);右鍵定義為平移
- 游標關閉時:恢復為傳統的左鍵平移與右鍵框選縮放
- 數據一致性:實施
SyncLock保護,確保背景匯出與前端繪圖不會發生線程衝突 - 速度曲線優化:採用預先創建 + Visibility 切換策略,切換延遲從 2-5 秒降至 <100ms
- 速度曲線驗證:XP/YP 順序驗證警告,防止非遞增數據點導致異常曲線
- Online RPM 公式:依據 M83XX FG Ratio Reference 實作即時 RPM 計算
- 互動設計文件:完整的繪圖互動設計指南(參見
docs/PLOT_MODULE_GUIDE.md)
Application Layer (ViewModel)
↓
IHardwareInterface (ReadRegister/WriteRegister)
↓
Protocol Layer (UartOverHidService, I2cOverHidService)
↓
ITransportLayer (Send/Receive)
↓
Transport Layer (UsbHidTransport, UsbCdcTransport)
↓
Low-level (HidDeviceInstance, SerialPort)
- UART over USB/HID:
UartOverHidService+UsbHidTransport - I2C over USB/HID:
I2cOverHidService+UsbHidTransport - UART over USB/CDC:
UartOverHidService+UsbCdcTransport(虛擬 COM 埠)
- 使用
HidStream.BeginRead/EndRead模式,無限 timeout(無輪詢) HidReportParser自動解析 HID 報告並分發到各個佇列- 使用
SemaphoreSlim實現事件驅動的佇列存取 - 零 CPU 使用率:閒置時完全不消耗 CPU,資料到達時立即回應
- 零警告編譯:全面優化 Nullability 與類型匹配
- CRC 穩定性與同步:
- 修正 16/32-bit 暫存器的 Big-Endian 序列計算
- 快照中繼資料強化,確保 CRC 可重現性
- 批次操作時的 CRC 更新抑制,提升 UI 流暢度
- 代碼重構:核心暫存器模型簡化 (
ValueFormatter) 與硬體服務層導入 Guarded Execution 模式 - 智慧型檔名命名規則:根據操作模式自動建議檔名
- 日誌自動加密 (v3.7.0):
- User/BackDoor Mode: 自動使用 XOR 加密日誌 (
app-{timestamp}_encrypted.log) - Engineering Mode: 明文日誌方便除錯 (
app-{timestamp}.log) - 模式切換時自動關閉舊日誌並創建新日誌
- 支援加密日誌解密 (File → Security Tools → Decrypt File)
- User/BackDoor Mode: 自動使用 XOR 加密日誌 (
- 安全工具:
- AES 加密/解密 (用於暫存器配置檔案,統一使用 AES-128 金鑰)
- XOR 加密/解密 (用於日誌和文字檔案)
- 自動偵測加密方法並解密
- I2C 測試視窗:獨立的 I2C 讀寫測試工具,與暫存器視圖參數同步
- 控制台視窗:即時顯示 Serilog 日誌訊息
- PWM 測試視窗:PWM 波形生成與測試工具
- Capture 測試視窗:FG 訊號擷取測試工具,支援 Init/Run/Stop/Edge/Pole 命令、即時 RPM/電壓/電流顯示、內建 PWM 控制、可設定移動平均濾波
- WebView 自動化測試:基於 Playwright + Pytest 的嵌入式 Web UI 自動化測試方案 (詳見
WEBVIEW_DEBUG_TUTORIAL.md) - GPIO 控制面板:GXXXX 系列專用的 GPIO 控制工具(BackDoor/Engineering 模式)
- 簡化單一 GPIO 控制:PA4 (ENA) 腳位
- PEN 控制:支援 IO1/IO2 (PA2/PA3) 腳位控制,具備可設定延遲的電源啟動序列
- 自動循環模式:可設定 High/Low 時間與重複執行
- 即時硬體觸發:使用
GpioPinViewModel統一架構 - 視覺化反饋:進度條顯示循環狀態
- 智慧視窗定位與記憶:
- 自動定位:Console 與 PWM 測試視窗首次開啟時自動置於主視窗右側並排
- 位置記憶:關閉視窗時自動記住當前位置和大小,重新開啟時恢復
- 會話限定:記憶僅在應用程式執行期間有效,重啟後恢復預設設定
- 螢幕適應:智慧判斷螢幕空間,右側不足時自動選擇左側或邊緣定位
使用 CommunityToolkit.Mvvm 的 Source Generators 自動生成屬性和命令:
// 屬性定義
[ObservableProperty]
private string _chipName; // 自動生成 ChipName 屬性
// 命令定義
[RelayCommand]
private async Task LoadChip()
{
// 自動生成 LoadChipCommand
}
// 帶條件的命令
[RelayCommand(CanExecute = nameof(CanExecuteHardwareCommands))]
private async Task ReadRegister()
{
// ...
}使用 Microsoft.Extensions.DependencyInjection 管理所有服務和 ViewModel:
- Singleton:
ILogger,MainViewModel,ConsoleViewModel,I2cConfigService - Transient:
MainWindow,ConsoleWindow, 子視窗
所有依賴透過建構子注入,消除手動 new 實例化。
晶片定義檔(JSON)嵌入執行檔,支援檔案系統覆蓋:
- 優先載入:檔案系統中的
chips/*.json(允許使用者自訂) - 回退載入:嵌入式資源(確保基本功能)
ViewModels 提供範例資料供 XAML Designer 預覽,無需執行程式即可查看 UI 佈局。
問題:使用 DataTrigger 動態創建 UserControl 導致切換時長時間無回應(2-5秒)
解決方案:預先創建 + Visibility 切換
<!-- ❌ 錯誤:動態創建 -->
<ContentControl>
<DataTrigger Binding="{Binding Mode}" Value="0">
<Setter Property="Content">
<HeavyControl/> <!-- 每次切換都重新創建! -->
</Setter>
</DataTrigger>
</ContentControl>
<!-- ✅ 正確:預先創建 + Visibility -->
<Grid>
<HeavyControl Visibility="{Binding Mode,
Converter={StaticResource NumericEqualityToVisibilityConverter},
ConverterParameter=0}"/>
<HeavyControl2 Visibility="{Binding Mode,
Converter={StaticResource NumericEqualityToVisibilityConverter},
ConverterParameter=1}"/>
</Grid>效能改善:
- 切換時間:2-5秒 → <100ms(95%+ 改善)
- CPU 使用率:80-100% → <5%(95% 改善)
- 權衡:首次載入 +2秒,記憶體 +4-6MB
詳見:docs/M8322CA_SPEED_CURVE_GUIDE.md
問題:多晶片模式下,變更 1 個 bit 產生約 30 行日誌,造成日誌檔案膨脹與效能影響
根本原因:
- 多個 ViewModel 訂閱同一個快取的 RegisterModel 實例 → 重複操作
- 每個 I2C 操作記錄 5-7 行 DEBUG 詳細日誌
解決方案:
- 獨立模式禁用快取(
RegisterViewViewModel.cs:1805-1820) - 減少單一暫存器操作的日誌詳細程度(僅在批次操作時記錄詳細資訊)
- 條件式日誌記錄(僅在值實際變更時記錄)
效能改善:
- 日誌行數:~30 行 → ~5-8 行(73-83% 減少)
- 日誌檔案大小:77% 減少
- UI 回應性:減少屬性變更通知次數,降低 UI 執行緒負載
- 記憶體權衡:獨立模式每個標籤頁增加 10-50KB(可接受)
詳見:docs/LOG_VERBOSITY_FIX_2026-01-29.md
- 專案總覽:
README.md(本檔案) - 開發指南:
CLAUDE.md - 專案狀態:
docs/PROJECT_STATUS.md - 專案統計:
專案摘要.md
- DI 架構:
WPF_DI_DataContext綁定機制.md - MVVM 重構:
CommunityToolkit_重構說明.md - USB 通訊:
USB_HID自動偵測與讀寫流程.md - HID 事件驅動:
HID_REPORT_PARSER_實作說明.md - 暫存器系統:
REGISTER_SYSTEM_DEVELOPER_GUIDE_ZH.md
- 標籤欄位監控:
TaggedFields/TAGGED_FIELDS_DEMO.md - 值變更高亮:
REGISTER_COLOR_HIGHLIGHTING.md - 設計時預覽:
DESIGN_TIME_DATA.md - 速度曲線優化:
docs/M8322CA_SPEED_CURVE_GUIDE.md - 速度曲線後端:
docs/M8322CA_SPEED_CURVE_BACKEND.md - 繪圖互動設計:
docs/PLOT_MODULE_GUIDE.md - 新增晶片流程:
docs/ADD_NEW_CHIP_INSTRUCTION.md - 晶片定義指南:
docs/CHIP_DEFINITION_GUIDE.md - 日誌自動加密:
docs/spec_walkthrough/LOG_AUTO_ENCRYPTION_IMPLEMENTATION.md - 主視窗 UI 結構:
docs/spec_walkthrough/MAINWINDOW_UI_STRUCTURE.md - MXXXX API 參考:
docs/MXXXX_API_REFERENCE.md - GXXXX 開發者指南:
docs/spec_walkthrough/GXXXX_DEVELOPER_GUIDE.md
/wpf-plan- WPF 專案規劃與實作指南/code-review- 自動化程式碼稽核(平行多代理)/add-new-chip- 自動化新增晶片實作流程/update-docs- 更新專案文件(README, PROJECT_STATUS, CLAUDE.md)/delete-reserved-files- 自動刪除 Windows 保留名稱檔案(NUL, CON 等)/handoff- 更新專案狀態並準備交接
- Source Generators:所有 ViewModel 使用
[ObservableProperty]和[RelayCommand] - DI 注入:所有服務透過建構子注入
- TextBox 綁定:
UpdateSourceTrigger=LostFocus - 非同步 I/O:所有 I/O 操作使用
async/await - 錯誤處理:
[RelayCommand]async 方法包裝 try-catch - 視窗管理:子視窗不設定
Owner - HID 讀取:使用事件驅動,禁止輪詢
- 重量級控制項:優先使用預先創建 + Visibility 切換
- ScottPlot 刷新:必須非同步執行(Background 優先級)
- Grid 嵌套:不超過 3 層
- 資源引用:優先使用
StaticResource(除非必須動態)
Q: 如何刪除意外產生的 NUL 檔案?
/delete-reserved-filesQ: 視窗切換時卡頓怎麼辦?
參考 docs/M8322CA_SPEED_CURVE_GUIDE.md 中的優化策略。
Q: HID 通訊不穩定?
檢查 HID_REPORT_PARSER_實作說明.md,確保使用事件驅動模式而非輪詢。
Q: DI 注入失敗?
參考 WPF_DI_DataContext綁定機制.md,確認服務已在 ServiceCollectionExtensions 中註冊。
此專案為內部開發工具,僅供公司內部使用。
最後更新:2026-02-24 維護團隊:Motor Test APP Development Team 版本:v3.9.0 (Speed Curve Enhancements & RPM Snapshot)