Phase 07 complete: - IMachineFingerprint + ILicenseValidator interfaces - MachineFingerprint: WMI CPU ProcessorID + BaseBoard SerialNumber - LicenseValidator: RSACryptoServiceProvider + SHA256, injectable public key - LicenseFile.TryRead: out-param bool, no exceptions from file I/O - 6 NUnit tests (valid/wrong-machine/tampered/empty/not-base64/missing-file) - 118 tests total, 116 pass, 2 Fanuc FOCAS ignored (Windows DLL) - Fix: missing 'using System' in CncMachineFactoryTests.cs - Fix: Dockerfile.test updated for NcProgramManager rename PublicKeyXml = PLACEHOLDER until Phase 09 generates real key pair. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
107 lines
4.8 KiB
Markdown
107 lines
4.8 KiB
Markdown
# NcProgramManager
|
||
|
||
## What This Is
|
||
|
||
Console EXE (C# .NET 4.7.2) for upload/download of CNC programs to/from machine controllers. Supports Fanuc FOCAS, Heidenhain LSV2, Siemens Sinumerik FTP, and Mitsubishi FTP. Runs on Windows, distributed to licensed machine operators and integrators.
|
||
|
||
## Core Value
|
||
|
||
Machinists and operators transfer CNC programs to/from any controller without manual intervention or internet access.
|
||
|
||
## Current State
|
||
|
||
| Attribute | Value |
|
||
|-----------|-------|
|
||
| Type | Application |
|
||
| Version | 0.2.0-dev |
|
||
| Status | v0.2 in progress — Phase 07 complete |
|
||
| Last Updated | 2026-05-17 |
|
||
|
||
## Requirements
|
||
|
||
### Core Features
|
||
|
||
- Upload programs to CNC controller
|
||
- Download programs from CNC controller
|
||
- Local file management (organize/store programs on disk)
|
||
- Multi-CN brand support (Fanuc + others)
|
||
|
||
### Validated (Shipped)
|
||
- [x] Fanuc FOCAS upload/download — initial
|
||
- [x] AES encryption for program files
|
||
- [x] CLI argument parsing
|
||
- [x] Machine-bound license check (hardcoded)
|
||
- [x] Multi-CN support — Fanuc, Heidenhain, Siemens, Mitsubishi — Phase 1–4
|
||
- [x] 3-file management mode (Fanuc) via IFanucMachine — Phase 4
|
||
- [x] NC program validation before upload (all 4 manufacturers) — Phase 5
|
||
- [x] Project renamed FanucProgramManager → NcProgramManager — Phase 6
|
||
|
||
### Validated (Shipped) — continued
|
||
- [x] RSA offline license core: IMachineFingerprint, ILicenseValidator, LicenseValidator, LicenseFile — Phase 7
|
||
|
||
### Planned (Next)
|
||
- [ ] Wire license into Program.cs — replace checkLicense, replace -chiave= with -licfile= (Phase 08)
|
||
- [ ] License generator tool — sign fingerprint with RSA private key, write .lic file (Phase 09)
|
||
- [ ] Replace PublicKeyXml PLACEHOLDER with real vendor key pair (Phase 09 output)
|
||
- [ ] ReadActiveProgramAsync / SelectMainProgram for Heidenhain and Siemens
|
||
- [ ] Integration test against real hardware (Heidenhain, Siemens, Mitsubishi)
|
||
|
||
### Out of Scope
|
||
- Cloud sync
|
||
- Web UI
|
||
- Internet-dependent license validation
|
||
|
||
## Constraints
|
||
|
||
### Technical Constraints
|
||
- .NET Framework 4.7.2 — max compatibility, no upgrade
|
||
- Fanuc FOCAS via `fwlib32` (32-bit DLL, Windows-only)
|
||
- Must run offline — no internet dependency at runtime
|
||
- License validation must work without network
|
||
|
||
### Business Constraints
|
||
- Software must be license-protected (offline, machine-bound)
|
||
- Current approach: hardcoded machine check — needs improvement
|
||
- Target: hardware fingerprint + encrypted license file
|
||
|
||
## Key Decisions
|
||
|
||
| Decision | Rationale | Date | Status |
|
||
|----------|-----------|------|--------|
|
||
| .NET 4.7.2 | Max compatibility with operator machines | 2026-05-13 | Active |
|
||
| Console EXE output | Simple deployment, scriptable | 2026-05-13 | Active |
|
||
| Offline license only | Operators may have no internet on shop floor | 2026-05-13 | Active |
|
||
| `#` = Warning in Fanuc/Mitsubishi | Macro variable indicator — valid in context | 2026-05-13 | Active |
|
||
| Constructor injection for validator | Internal ctor accepts mock — enables unit testing without Windows DLL | 2026-05-13 | Active |
|
||
| RSA asymmetric licensing | Private key vendor-only; public key embedded in binary — decompiler can't forge licenses | 2026-05-17 | Active |
|
||
| PublicKeyXml PLACEHOLDER until Phase 09 | Real key pair not yet generated; prevents blocking Phase 07 on Phase 09 | 2026-05-17 | Active |
|
||
| Heidenhain LSV2 port 19000 | Standard LSV2 port; needs real hardware verification | 2026-05-13 | Active |
|
||
| Siemens FTP dir `/_N_MPF_DIR/` | Sinumerik standard MPF directory; FTP option must be enabled | 2026-05-13 | Active |
|
||
|
||
## Success Metrics
|
||
|
||
| Metric | Target | Current | Status |
|
||
|--------|--------|---------|--------|
|
||
| Program transfer correctness | 100% (byte-verified) | Unknown | Pending hardware test |
|
||
| License validation (offline) | Works without network | RSA core built, wiring Phase 08 | In progress |
|
||
| Multi-CN support | ≥2 manufacturers | 4 (Fanuc/Heidenhain/Siemens/Mitsubishi) | Done |
|
||
| NC validation coverage | All manufacturers | 4 manufacturers, 30+ tests | Done |
|
||
|
||
## Tech Stack / Tools
|
||
|
||
| Layer | Technology | Notes |
|
||
|-------|------------|-------|
|
||
| Language | C# | .NET Framework 4.7.2 |
|
||
| UI | Console EXE | CLI args via InputArgs.cs |
|
||
| CN Protocol (Fanuc) | FOCAS fwlib32 | 32-bit DLL, Windows-only |
|
||
| CN Protocol (Heidenhain) | LSV2 over TCP | Port 19000, CRC-16/CCITT |
|
||
| CN Protocol (Siemens) | FTP (FtpWebRequest) | ASCII mode, passive, `/_N_MPF_DIR/` |
|
||
| CN Protocol (Mitsubishi) | FTP (FtpWebRequest) | Port 21, `/PRG/`, no extensions |
|
||
| Validation | NcProgramValidator | Universal + per-manufacturer rules |
|
||
| Encryption | AES (AesCrypt.cs) | Program file protection |
|
||
| Licensing | RSA-SHA256 asymmetric | IMachineFingerprint + ILicenseValidator; wiring in Phase 08 |
|
||
| Testing | NUnit 3.13.3 + Moq 4.18.4 | .NET 4.7.2 test project |
|
||
|
||
---
|
||
*PROJECT.md — Updated when requirements or context change*
|
||
*Last updated: 2026-05-17 after Phase 7 (License Core)*
|