# Sick Encoder CAN Monitor

Ứng dụng giám sát encoder Sick qua giao tiếp CAN (PCAN-USB), hiển thị vị trí thời gian thực, trạng thái node, heartbeat, PDO, và hỗ trợ thay đổi bitrate / node ID runtime.

## 🎯 Mục tiêu chính
- Đọc và hiển thị vị trí encoder Sick (mm) từ PDO TPDO1 theo thời gian thực
- Giám sát trạng thái node (Bootup, Pre-Operational, Operational, Stopped, Timeout)
- Hỗ trợ thay đổi **bitrate** và **Node ID** runtime (bao gồm unlock + save to EEPROM)
- Giao diện web đơn giản, responsive bằng **Blazor**

## 🏗️ Kiến trúc
      ┌─────────────────────┐
      │   Blazor Web App    │  (UI: Start/Stop, Bitrate, NodeID, Table frames)
      └──────────┬──────────┘
                 │
                 ▼
      ┌─────────────────────┐
      │  PcanCanService     │  (.NET service xử lý PCAN-Basic)
      │  - Init/Uninit      │
      │  - Read loop        │
      │  - NMT commands     │
      │  - Apply bitrate    │
      │  - Apply node ID    │
      └──────────┬──────────┘
                 │            
                 ▼
        ┌─────────────┐
        │ Sick Encoder│  CAN (PCAN-USB)
        └─────────────┘

## 🚀 Công nghệ sử dụng
- **Backend**: .NET 10 (LTS)
- **Frontend**: Blazor Web App (Server hoặc WebAssembly tùy chọn)
- **CAN Driver**: Peak PCAN-Basic (PCAN-USB)
- **Dependency Injection**: Microsoft.Extensions.Options
- **OS hỗ trợ**: Windows (PC phát triển), có thể port sang Linux (mono hoặc .NET runtime)

## 📂 Cấu trúc thư mục (hiện tại)
      SickBlazorApp/
      ├── SickBlazorApp/                  # Project Blazor chính
      │   ├── Components/                 # (nếu có reusable components)
      │   ├── eds/                        # EDS files của Sick encoder
      │   ├── Models/                     # PositionPdo, CanFrame, CanNodeState, ...
      │   ├── Options/                    # CanBusOptions
      │   ├── Services/                   # PcanCanService + interface
      │   ├── Pages/                      # Home.razor, sick.razor(UI)
      │   └── Program.cs
      ├── docs/                           # Tài liệu
      └── README.md

## 🚦 Trạng thái hiện tại
- Đã hoàn thành: 
  - Kết nối PCAN-USB + đọc CAN frame liên tục
  - Parse heartbeat (node state + auto resume)
  - Xử lý Position PDO (raw → mm)
  - Thay đổi bitrate runtime (unlock + save EEPROM + reset)
  - Thay đổi Node ID runtime (unlock + save + reset)
  - UI Blazor hiển thị bảng frame, trạng thái node, vị trí mm
- Đang phát triển: 
  - Cải thiện UI/UX (loading state, error message, reconnect)
  - Thêm logging chi tiết
  - Hỗ trợ nhiều channel PCAN (nếu cần)