Skip to content

Latest commit

 

History

887 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GmtTestTool - 微控制器暫存器通用測試工具

基於 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/                # 技術文件

📋 核心功能

1. 暫存器視覺化與操作

  • 動態樹狀結構:根據 JSON 定義檔自動生成 Peripheral → Register → Field 的三層結構
  • 即時讀寫:支援單一暫存器或整批周邊模組的具備「上下文感知」讀取與寫入功能
  • 位元欄位 (Field) 解析:自動將暫存器數值解析為具體的位元欄位,並提供 CheckBox 方便設定
  • 數值變更高亮:當前數值與參考基準值不同時自動變色(紅色),並可隨時重置基準
  • 企業視覺識別:主視窗整合企業 Logo,採用專業的工業級 UI 設計
  • 多種數值格式:支援 Hex、Decimal、Binary、Octal 格式即時切換
  • 標籤欄位監控:支援透過 Tag 系統篩選和監控特定欄位群組
  • 多晶片視圖:GXXXX 系列支援同時顯示多個晶片,並在切換時保留暫存器數值
  • 智慧視窗管理:重複開啟暫存器視窗時自動激活現有視窗,防止視窗氾濫
  • 可收合參數區塊:Pattern Generator 參數區塊使用 Expander 控制項,提供更好的空間利用率
  • RPM 快照儲存/載入:M8314 系列支援速度曲線 RPM 快照的儲存與載入功能
  • 響應式工具列:主視窗工具列使用 Viewbox 包裝,自適應不同視窗大小

2. 智慧啟動流程

  1. USB 自動偵測:啟動後自動掃描 configuration/usbconfig.json 定義的裝置
  2. 熱插拔支援:支援裝置拔插後自動重新連線(500ms 輪詢監控)
  3. 韌體版本檢查:連線後讀取硬體版本,並與目標版本比對
  4. 自動載入晶片:根據配置自動載入對應的暫存器定義檔

3. 操作模式與安全性

  • 模式切換:支援透過全域熱鍵在任何視窗進行切換:
    • CTRL+SHIFT+ALT+F11: BackDoor Mode (顯示 Tag 為 "backdoor" 的周邊)
    • CTRL+SHIFT+ALT+F1: Engineering Mode
  • 數據競爭保護:
    • 輸入保護:使用者編輯時自動標記 IsEditing 狀態,防止背景硬體更新沖掉輸入內容
    • 更新抑制:實作內部更新抑制旗標,消除 UI 與 Model 之間的更新風暴
  • 執行緒安全:所有硬體存取(I2C/UART/PWM)皆受 SemaphoreSlim 保護

4. 高效能繪圖模組 (ScottPlot 5)

  • 即時監控:支援 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)

5. 硬體通訊架構

分層設計

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 埠)

事件驅動的 HID 通訊

  • 使用 HidStream.BeginRead/EndRead 模式,無限 timeout(無輪詢)
  • HidReportParser 自動解析 HID 報告並分發到各個佇列
  • 使用 SemaphoreSlim 實現事件驅動的佇列存取
  • 零 CPU 使用率:閒置時完全不消耗 CPU,資料到達時立即回應

6. 測試工具集與安全性

  • 零警告編譯:全面優化 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)
  • 安全工具:
    • 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 測試視窗首次開啟時自動置於主視窗右側並排
    • 位置記憶:關閉視窗時自動記住當前位置和大小,重新開啟時恢復
    • 會話限定:記憶僅在應用程式執行期間有效,重啟後恢復預設設定
    • 螢幕適應:智慧判斷螢幕空間,右側不足時自動選擇左側或邊緣定位

🏗️ 架構特色

MVVM with Source Generators

使用 CommunityToolkit.Mvvm 的 Source Generators 自動生成屬性和命令:

// 屬性定義
[ObservableProperty]
private string _chipName;  // 自動生成 ChipName 屬性

// 命令定義
[RelayCommand]
private async Task LoadChip()
{
    // 自動生成 LoadChipCommand
}

// 帶條件的命令
[RelayCommand(CanExecute = nameof(CanExecuteHardwareCommands))]
private async Task ReadRegister()
{
    // ...
}

依賴注入 (DI)

使用 Microsoft.Extensions.DependencyInjection 管理所有服務和 ViewModel:

  • Singleton:ILogger, MainViewModel, ConsoleViewModel, I2cConfigService
  • Transient:MainWindow, ConsoleWindow, 子視窗

所有依賴透過建構子注入,消除手動 new 實例化。

嵌入式資源管理

晶片定義檔(JSON)嵌入執行檔,支援檔案系統覆蓋:

  1. 優先載入:檔案系統中的 chips/*.json(允許使用者自訂)
  2. 回退載入:嵌入式資源(確保基本功能)

設計時資料支援

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 行日誌,造成日誌檔案膨脹與效能影響

根本原因:

  1. 多個 ViewModel 訂閱同一個快取的 RegisterModel 實例 → 重複操作
  2. 每個 I2C 操作記錄 5-7 行 DEBUG 詳細日誌

解決方案:

  1. 獨立模式禁用快取(RegisterViewViewModel.cs:1805-1820)
  2. 減少單一暫存器操作的日誌詳細程度(僅在批次操作時記錄詳細資訊)
  3. 條件式日誌記錄(僅在值實際變更時記錄)

效能改善:

  • 日誌行數:~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

🛠️ 開發工具

Claude Code Slash Commands

  • /wpf-plan - WPF 專案規劃與實作指南
  • /code-review - 自動化程式碼稽核(平行多代理)
  • /add-new-chip - 自動化新增晶片實作流程
  • /update-docs - 更新專案文件(README, PROJECT_STATUS, CLAUDE.md)
  • /delete-reserved-files - 自動刪除 Windows 保留名稱檔案(NUL, CON 等)
  • /handoff - 更新專案狀態並準備交接

📝 開發規範

必須遵守

  1. Source Generators:所有 ViewModel 使用 [ObservableProperty] 和 [RelayCommand]
  2. DI 注入:所有服務透過建構子注入
  3. TextBox 綁定:UpdateSourceTrigger=LostFocus
  4. 非同步 I/O:所有 I/O 操作使用 async/await
  5. 錯誤處理:[RelayCommand] async 方法包裝 try-catch
  6. 視窗管理:子視窗不設定 Owner
  7. HID 讀取:使用事件驅動,禁止輪詢

效能考量

  1. 重量級控制項:優先使用預先創建 + Visibility 切換
  2. ScottPlot 刷新:必須非同步執行(Background 優先級)
  3. Grid 嵌套:不超過 3 層
  4. 資源引用:優先使用 StaticResource(除非必須動態)

🔧 故障排除

常見問題

Q: 如何刪除意外產生的 NUL 檔案?

/delete-reserved-files

Q: 視窗切換時卡頓怎麼辦? 參考 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)

About

GMT Motor Test Tool V1 - WPF Application for Motor Testing and Configuration

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages