feat: implement SavePump/SaveAlarms, fix config round-trip bugs, redesign PDF reports

Config system fixes:
- Implement SavePump() — full XML serialization with insert/update by pump ID
- Add CanBusParameter.ToPumpXml() for legacy P1-P6 pump param format
- Fix LastRotationDirection never loaded in LoadSettings()
- Add SaveAlarms() to ConfigurationService and IConfigurationService
- Remove dead fields AppSettings.Clients and AppSettings.PumpIds

PDF report redesign:
- Professional layout with charts, verdict badges, and tolerance bands
- Add ReportChartRenderer (SVG) and ReportTheme styling constants
- Embed default_logo.png as fallback report logo

Documentation:
- Add gap analysis docs (config validation, ford unlock, missing features)
- Update CLAUDE.md architecture, known gaps, and debt tracking

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-15 15:21:22 +02:00
parent 4891eb6812
commit c617854c09
15 changed files with 1495 additions and 141 deletions

View File

@@ -0,0 +1,85 @@
# Gap: Missing Dialogs and UI Components
## Priority-Ranked List
### CRITICAL — Safety Dialogs (prevent hardware damage)
#### 1. RPM Safety Warning (`WCareOnRpmOn`)
**Old behavior:** Shown when operator sets RPM > 0 but oil pump is not running. Three options: turn on oil pump + proceed, proceed without oil, cancel.
**Trigger:** RPM setpoint change in BenchControlViewModel
**MVVM:** Dialog returns enum (ProceedWithOil / ProceedWithout / Cancel)
**Why critical:** Running the pump motor without oil circulation can cause bearing damage.
#### 2. Oil Pump Confirmation (`WAcceptOilTurnOn`)
**Old behavior:** Confirmation dialog before activating oil pump. Ensures operator confirms oil level and connections are ready.
**Trigger:** Oil pump relay toggle in BenchControlViewModel
**MVVM:** Simple confirm/cancel dialog
#### 3. 27V Warning (`WAlert27v`)
**Old behavior:** Warning when pump requires 27V power supply (some Ford variants). Alerts operator to switch power supply before proceeding.
**Trigger:** Pump selection when pump definition indicates 27V requirement
**MVVM:** Informational dialog with acknowledge button
### HIGH — Functional Dialogs
#### 4. Ford Unlock Progress (`WUnlocker`)
See `gap-ford-unlock-ui.md` for full spec.
#### 5. COM Port / K-Line Selection (`KlineIDSelection`)
**Old behavior:** Dropdown listing available FTDI devices by serial number. User selects which adapter to use for K-Line communication.
**Current gap:** `KwpService.DetectKLinePort()` auto-detects the first FTDI device. No UI for manual selection when multiple adapters are connected.
**Trigger:** K-Line connection attempt, or settings panel
**MVVM:** ComboBox of detected FTDI serial numbers + Connect button
#### 6. User Management (`WUsersManage`)
**Old behavior:** Add/remove users, change passwords. User list displayed in a grid.
**Current state:** `UserCheckDialog` handles auth only. `ConfigurationService.UpdateUsers()` exists but no UI invokes it for CRUD.
**Trigger:** Admin menu or settings panel
**MVVM:** DataGrid with add/edit/remove buttons. Hash or encrypt passwords before storage (see gap-missing-features.md).
#### 7. Full Settings Panel (`WConfigPanel`)
**Old behavior:** Comprehensive dialog for all settings: PID tuning, refresh rates, safety limits, encoder resolution, motor calibration, company info, log retention, language selection.
**Current state:** `BenchParamConfigView` covers bench CAN parameter editing only. All other settings require hand-editing config.xml.
**Trigger:** Settings button in toolbar
**MVVM:** Tabbed dialog (General, Safety, PID, Company, Sensors, Language)
### MEDIUM — Utility Dialogs
#### 8. Generic Confirmation (`WAskQuestion`)
**Old behavior:** Reusable yes/no dialog with custom message.
**Alternative:** WPF's built-in `MessageBox.Show` with `MessageBoxButton.YesNo`. Can be used directly in ViewModels via a dialog service abstraction. No custom dialog needed unless the app's visual theme demands it.
#### 9. Generic Alert (`WGenericAlert`)
**Old behavior:** Reusable info/warning dialog with custom message + icon.
**Alternative:** Same as above — `MessageBox.Show` covers this. Implement a custom one only if visual consistency matters.
### MEDIUM — Missing Controls
#### 10. Test Timer/Countdown (`TimerDisplay`)
**Old behavior:** Visual countdown during conditioning and measurement phases. Shows remaining seconds in large digital font.
**Current gap:** Phase progress is communicated via `VerboseMessage` text events but no dedicated countdown UI.
**Implementation:** Either a UserControl with large text binding, or integrate into `TestDisplayView` with a progress ring.
#### 11. Bit-Level Status Display (`BitDisplay` / `SingleBit`)
**Old behavior:** Grid of toggleable bits showing pump status word state. Each bit shows label + green/red indicator based on PumpStatusDefinition.
**Current state:** `StatusDisplayView` exists but may not render individual bits as toggle indicators.
**Implementation:** ItemsControl with BitDisplay item template (colored circle + label per bit).
#### 12. Searchable ComboBox (`FilteredComboBox`)
**Old behavior:** Dropdown with text filtering for pump selection (100+ pumps).
**Alternative:** Extended.Wpf.Toolkit's `AutoFilteredComboBox` may cover this. Or implement as a standard ComboBox with `IsTextSearchEnabled="True"` and `IsEditable="True"`.
### LOW — Display Controls
#### 13. Temperature Display Widget (`TempDisplayer`)
**Current state:** Temperature values are shown inline in the main UI. A dedicated widget is nice-to-have but not functionally missing.
#### 14. Graphical Result Display (`GraphicResultDisplay` / `CustomChart`)
**Current state:** `FlowmeterChartView` + `ReportChartRenderer` partially cover this. LiveChartsCore handles real-time visualization. The old custom chart control is superseded.
## Implementation Pattern
All dialogs should follow the existing MVVM pattern:
- `Views/Dialogs/XxxDialog.xaml` — pure XAML, no code-behind logic
- `ViewModels/Dialogs/XxxViewModel.cs``[ObservableProperty]`, `[RelayCommand]`
- Opened from parent ViewModel via a dialog service or `Window.ShowDialog()`
- Results returned via ViewModel property, not code-behind event args