Replace the monolithic MainWindow with a SelectedPage-driven shell (Dashboard / Pump / Bench / Tests / Results / Settings). The Tests page gets the Plan -> Preconditions -> Running -> Done wizard from ui-structure.md \u00a74, backed by a 7-item precondition gate and shared sub-views (PhaseCardView / TestSectionView / GraphicIndicatorView) extracted from the now-deleted monolithic TestPanelView. New VMs / views: - Tests wizard: TestPreconditions, PhaseCard, GraphicIndicator, TestSection, TestPlan, TestRunning, TestDone - Dashboard panels: DashboardConnection, DashboardReadings, DashboardAlarms, InterlockBanner, ResultHistory - Pump / bench panels: PumpIdentificationPanel, PumpLiveData, UnlockPanel, BenchDriveControl, BenchReadings, RelayBank, TemperatureControl, DtcList, AuthGate - Dialogs: generic ConfirmDialog, UserManageDialog, UserPromptDialog Supporting changes: - IsOilPumpOn exposed on MainViewModel for precondition evaluation - RequiresAuth added to TestDefinition (XML round-trip) - BipStatusDefinition + CompletedTestRun models - ~35 new Test.* localization keys (en + es) - Settings moved from modal dialog to full page - Pause / Retry / Skip stubs in TestRunningView; full spec in docs/gap-test-running-controls.md for follow-up implementation - docs/ui-structure.md captures the wizard design Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
348 lines
14 KiB
Markdown
348 lines
14 KiB
Markdown
# HC_APTBS — UI Structure Reference
|
||
|
||
Defines the top-level page structure, operator intent, content scope, and design
|
||
guidelines for each page. Use this as the authoritative reference when designing
|
||
or implementing any page or UserControl.
|
||
|
||
---
|
||
|
||
## Guiding principles
|
||
|
||
- **Operator intent first.** Navigation reflects what the operator is trying to
|
||
accomplish, not which components exist or which service owns a feature.
|
||
- **Separation of concerns.** Bench hardware and ECU diagnostics are logically
|
||
different domains and live on different pages — never mix them.
|
||
- **Progressive disclosure.** Dashboard is read-first. Controls deepen as the
|
||
operator navigates inward. Settings are last and guarded.
|
||
- **State-driven flow.** The Test page is not a free-form panel — it guides the
|
||
operator through a linear sequence: Plan → Preconditions → Running → Done.
|
||
- **Safety is visible.** Alarms, interlocks, and precondition failures are
|
||
surfaced prominently, never hidden in status bars or tooltips.
|
||
|
||
---
|
||
|
||
## Navigation layout
|
||
|
||
```
|
||
┌──────┬─────────────────────────────────────────┐
|
||
│ │ │
|
||
│ ⌂ │ PAGE CONTENT │
|
||
│ ⚙B │ │
|
||
│ ⚡E │ │
|
||
│ ▶T │ │
|
||
│ ■R │ │
|
||
│ ── │ │
|
||
│ ⚙S │ │
|
||
└──────┴─────────────────────────────────────────┘
|
||
```
|
||
|
||
Left sidebar, icon + label, collapsed to icon-only below a width threshold.
|
||
Settings pinned to the bottom, separated by a divider.
|
||
|
||
Global status bar at the top of the content area (not the sidebar):
|
||
CAN heartbeat indicator · K-Line session indicator · alarm count badge ·
|
||
logged-in user · app version.
|
||
|
||
---
|
||
|
||
## Pages
|
||
|
||
### 1. Dashboard
|
||
|
||
**Intent:** Confirm the bench is ready before doing anything.
|
||
|
||
**Design tone:** Read-first. Dense information, minimal interaction. Should be
|
||
readable at a glance from across the workbench.
|
||
|
||
**Content:**
|
||
|
||
| Section | Detail |
|
||
|---------|--------|
|
||
| Bench state | RPM (live), T-in, T-out, T-tank, P1, P2, QDelivery |
|
||
| Connection status | CAN: last frame timestamp / "offline"; K-Line: session open / closed |
|
||
| Active alarms | List with criticality badge (critical / warning / info). Empty state = green banner. |
|
||
| Test summary | Active test name + current phase, or last completed test name + overall pass/fail |
|
||
| Quick actions | **Start Test** (→ Test page), **Stop**, **Emergency Stop** |
|
||
|
||
**Guidelines:**
|
||
- E-Stop is the only destructive control allowed here. Style it as red, always
|
||
visible, never hidden by scroll.
|
||
- No configuration inputs on this page.
|
||
- Alarm list shows the full description text, not just a bit number.
|
||
- Offline indicators use a distinct color (e.g. amber) separate from alarm red.
|
||
- Quick-action buttons are disabled with a tooltip when prerequisites are unmet
|
||
(e.g. Start Test disabled if no pump selected or CAN offline).
|
||
|
||
**Existing components to embed:** none — this page is new.
|
||
|
||
---
|
||
|
||
### 2. Bench
|
||
|
||
**Intent:** Manually drive the hardware. Feels like an HMI panel.
|
||
|
||
**Design tone:** Control-heavy, tactile. Large inputs, clear feedback, live
|
||
values always visible alongside their controls.
|
||
|
||
**Content:**
|
||
|
||
| Group | Controls / Displays |
|
||
|-------|---------------------|
|
||
| RPM / Drive | Target RPM input, ramp rate, Start/Stop drive, direction toggle |
|
||
| Temperature | T-in / T-out / T-tank live readings, cooler relay, heater relay, PID setpoint |
|
||
| Pressure / Flow | P1, P2 live gauges, QDelivery, QOver, oil pump relay |
|
||
| Encoder / Angle | PSG, INJ, Manual angle live displays, Lock Angle input |
|
||
| Relay outputs | DepositCooler, DepositHeater, Counter, Pulse4Signal, Flasher — toggle buttons with state indicator |
|
||
| Live plots | Flowmeter chart (QDelivery, QOver vs time), pressure trace — always rendering |
|
||
|
||
**Guidelines:**
|
||
- No ECU concepts on this page (no ME, FBKW, DFI, K-Line).
|
||
- Relay buttons must show current state (on/off) as well as the toggle action.
|
||
- Live plots persist while the operator adjusts controls — they are not
|
||
collapsible or tab-hidden.
|
||
- RPM input should warn (not block) if above configured safety limit
|
||
(`AppSettings.MaxRpm`).
|
||
- Oil pump interlock: if oil pump relay is off and RPM > threshold, show
|
||
a dismissible inline warning (not a blocking dialog).
|
||
|
||
**Existing components to embed:**
|
||
- `BenchControlView` (RPM, direction, oil pump)
|
||
- `BenchParamConfigView` (bench parameter live readings)
|
||
- `FlowmeterChartView` (always-on in manual context)
|
||
- `AngleDisplayView` (encoder monitoring)
|
||
|
||
---
|
||
|
||
### 3. ECU
|
||
|
||
**Intent:** Diagnose and interact with the pump's electronic control unit via
|
||
K-Line. Logically separate from the mechanical bench.
|
||
|
||
**Design tone:** Diagnostic tool. Tabular data, structured forms, raw values
|
||
accessible but not leading.
|
||
|
||
**Sub-sections (tabs or left sub-nav within the page):**
|
||
|
||
#### 3a. Identification
|
||
- Pump model search/select from database
|
||
- K-Line read: serial number, model reference, SW version
|
||
- BIP status
|
||
- "Read ECU" button — requires K-Line session open
|
||
|
||
#### 3b. DTCs
|
||
- Fault code list (code, description, freeze-frame if available)
|
||
- Read DTCs / Clear DTCs actions
|
||
- Error history log with timestamps
|
||
|
||
#### 3c. Live Data
|
||
- ECU variable table: ME, FBKW, Temp, Tein, Status word
|
||
- Status word bit grid (bit index, label, state, color-coded per
|
||
`PumpStatusDefinition`)
|
||
- Refresh rate selector
|
||
|
||
#### 3d. Adaptation
|
||
- ME / FBKW / PreIn sliders (manual ECU output control)
|
||
- DFI read / write / auto-adjust
|
||
- Requires user authentication before write actions
|
||
|
||
#### 3e. Unlock *(Ford VP44 only)*
|
||
- Unlock type selector (Type 1 / Type 2)
|
||
- Phase 1 countdown (600.5 s) with progress bar
|
||
- Phase 2 TestUnlock with live status
|
||
- Verification result display
|
||
- Full UI spec in `docs/gap-ford-unlock-ui.md`
|
||
|
||
**Guidelines:**
|
||
- K-Line session state (open / closed) is always shown at the top of this page.
|
||
If closed, write actions are disabled with a "Session not open" tooltip.
|
||
- Adaptation and Unlock sub-sections require authenticated user
|
||
(`UserCheckDialog`).
|
||
- Raw K-Line bytes are shown only in a collapsible "Engineering" panel — not
|
||
in the primary view.
|
||
- Pump selection (3a) is a prerequisite for everything else. If no pump is
|
||
selected, show a banner on all other sub-sections.
|
||
|
||
**Existing components to embed:**
|
||
- `PumpIdentificationView` → 3a
|
||
- `StatusDisplayView` → 3c
|
||
- `DfiManageView` → 3d
|
||
- `PumpControlView` (ME/FBKW/PreIn) → 3d
|
||
|
||
---
|
||
|
||
### 4. Test
|
||
|
||
**Intent:** Run the automated test procedure. Procedural and task-oriented.
|
||
|
||
**Design tone:** Wizard-like linear flow. The operator should always know where
|
||
they are in the sequence and what comes next.
|
||
|
||
**State machine — sub-sections are sequential, not freely navigable:**
|
||
|
||
```
|
||
[Plan] ──► [Preconditions] ──► [Running] ──► [Done]
|
||
(blocked if (blocked (summary,
|
||
checklist until all → Results)
|
||
fails) checks pass)
|
||
```
|
||
|
||
#### 4a. Plan
|
||
- Test suite dropdown (selects from pump's `TestDefinition` list)
|
||
- Phase list: enable/disable individual phases, view tolerance bands
|
||
- Estimated duration
|
||
- "Next: Check Preconditions" button
|
||
|
||
#### 4b. Preconditions
|
||
Enforced checklist before the sequence starts. Each item is checked
|
||
automatically where possible, or confirmed manually:
|
||
|
||
| Check | Source |
|
||
|-------|--------|
|
||
| Pump selected | ECU page — pump DB record loaded |
|
||
| CAN bus live | `PcanAdapter` heartbeat |
|
||
| K-Line session open | `KwpService` state |
|
||
| RPM = 0 | `BenchParameterNames.RPM` |
|
||
| Oil pump on | Relay state |
|
||
| No critical alarms | Alarm list |
|
||
| User authenticated | If test requires auth |
|
||
|
||
Start button is disabled until all required checks pass. Failed checks
|
||
show inline fix links (e.g. "Go to Bench → start oil pump").
|
||
|
||
#### 4c. Running
|
||
- Phase timeline: vertical step list, current phase highlighted
|
||
- Live measurement table: parameter, current value, tolerance band, pass/fail
|
||
- Embedded: `FlowmeterChartView` + `AngleDisplayView` (visible during run)
|
||
- Controls: **Pause**, **Abort**, **Retry current phase**, **Skip phase**
|
||
- Running timer (elapsed + estimated remaining)
|
||
|
||
#### 4d. Done
|
||
- Inline summary: overall pass/fail, phase-by-phase verdict
|
||
- "View Full Results" → navigates to Results page
|
||
- "Run Again" → back to 4a (Plan) with same configuration
|
||
|
||
**Guidelines:**
|
||
- Back-navigation within the state machine is allowed (Plan ↔ Preconditions)
|
||
but not once Running has started unless the test is aborted.
|
||
- Abort requires confirmation dialog.
|
||
- QOver zero-flow safety: if `QOver == 0` while RPM > 300 and oil pump is on,
|
||
trigger emergency stop and display a blocking alert (see Known gaps in
|
||
CLAUDE.md — HIGH priority).
|
||
- Pump parameters (ME/FBKW/PreIn) must be zeroed between phases
|
||
(see Known gaps — HIGH priority).
|
||
- Per-sample real-time UI callback must update the live measurement table
|
||
during Running (see Known gaps — HIGH priority).
|
||
|
||
**Existing components to embed:**
|
||
- `TestPanelView` → 4a (Plan)
|
||
- `TestDisplayView` → 4c (Running)
|
||
- `FlowmeterChartView` → 4c (Running, inline)
|
||
- `AngleDisplayView` → 4c (Running, inline)
|
||
- `ResultDisplayView` → 4d (Done, summary) + Results page (full)
|
||
|
||
---
|
||
|
||
### 5. Results
|
||
|
||
**Intent:** Review, compare, and document completed tests.
|
||
|
||
**Design tone:** Data-focused. Clean tables, exportable. No live hardware data.
|
||
|
||
**Content:**
|
||
|
||
| Section | Detail |
|
||
|---------|--------|
|
||
| History list | Completed tests: date, pump model, serial, overall pass/fail |
|
||
| Result detail | Selected test: per-phase table, per-parameter pass/fail, measured vs tolerance |
|
||
| Trend / comparison | Same pump over multiple runs — delta on key parameters (future) |
|
||
| Report preview | PDF rendered inline or in a preview pane |
|
||
| Export | PDF export, notes/observations field before export |
|
||
|
||
**Guidelines:**
|
||
- History is read-only. No controls that affect the bench or ECU.
|
||
- PDF export requires a report dialog (operator name, client, notes) before
|
||
generating. Reuse `ReportDialog` / `ReportViewModel`.
|
||
- Observations/notes field must be present before PDF generation
|
||
(see Known gaps in CLAUDE.md — MEDIUM priority).
|
||
- Empty state (no completed tests this session): show a prompt to run a test.
|
||
- Test history persistence across sessions requires a future storage layer
|
||
(not yet implemented — scope to session-only for now).
|
||
|
||
**Existing components to embed:**
|
||
- `ResultDisplayView` (full detail view)
|
||
- `ReportDialog` (triggered by Export action)
|
||
|
||
---
|
||
|
||
### 6. Settings
|
||
|
||
**Intent:** Infrequent configuration. Not for daily operators unless necessary.
|
||
|
||
**Design tone:** Form-based. Grouped, labeled, validated. No live hardware
|
||
data visible here.
|
||
|
||
**Sub-sections:**
|
||
|
||
| Section | Content |
|
||
|---------|---------|
|
||
| Machine | CAN bitrate, K-Line COM port, encoder mode, motor direction |
|
||
| Sensors | ADC calibration per channel (min/max voltage → engineering units) |
|
||
| Limits & Protection | Safety RPM max, alarm criticality reactions, PID tuning constants |
|
||
| Alarms | Alarm bit definitions, descriptions, criticality levels |
|
||
| Users | User list, roles, password management (future: hashed) |
|
||
| Report | Company name, logo, branding colors, default template |
|
||
| Storage | Config file paths, backup/restore |
|
||
|
||
**Guidelines:**
|
||
- Changes are not applied until "Save" is clicked — no live-apply side effects.
|
||
- Sensor calibration changes require confirmation (affects all future readings).
|
||
- User management (`UserManageDialog`) is accessible from here.
|
||
- Settings are not accessible while a test is Running (nav item disabled or
|
||
shows a "test in progress" tooltip).
|
||
- All inputs use `CultureInfo.InvariantCulture` for double parsing (see Rules
|
||
in CLAUDE.md).
|
||
|
||
**Existing components to embed:**
|
||
- `SettingsDialog` content (migrate from dialog to full page)
|
||
- `DfiManageView` is in ECU > Adaptation, not here
|
||
|
||
---
|
||
|
||
## Component placement summary
|
||
|
||
| UserControl / Dialog | Page | Sub-section |
|
||
|----------------------|------|-------------|
|
||
| `BenchControlView` | Bench | RPM / Drive + Relays |
|
||
| `BenchParamConfigView` | Bench | Pressure / Flow readings |
|
||
| `FlowmeterChartView` | Bench (manual) · Test (running) | Live plots · 4c Running |
|
||
| `AngleDisplayView` | Bench · Test (running) | Encoder group · 4c Running |
|
||
| `PumpIdentificationView` | ECU | 3a Identification |
|
||
| `StatusDisplayView` | ECU | 3c Live Data |
|
||
| `DfiManageView` | ECU | 3d Adaptation |
|
||
| `PumpControlView` | ECU | 3d Adaptation |
|
||
| `TestPanelView` | Test | 4a Plan |
|
||
| `TestDisplayView` | Test | 4c Running |
|
||
| `ResultDisplayView` | Test (summary) · Results (full) | 4d Done · detail view |
|
||
| `ReportDialog` | Results | Export action |
|
||
| `UserCheckDialog` | ECU (auth gate) · Test (auth gate) | on write actions |
|
||
| `UserManageDialog` | Settings | Users sub-section |
|
||
| `KlineErrorsDialog` | ECU | triggered on DTC read errors |
|
||
| `ProgressDialog` | ECU · Test | long K-Line operations, unlock phase |
|
||
| `UnlockProgressDialog` | ECU | 3e Unlock |
|
||
| `OilPumpConfirmDialog` | Bench · Test (preconditions) | oil pump interlock |
|
||
| `RpmSafetyWarningDialog` | Bench · Test | RPM limit breach |
|
||
| `VoltageWarningDialog` | Bench | analog sensor out of range |
|
||
|
||
---
|
||
|
||
## Pages to build (status)
|
||
|
||
| Page | Status | Notes |
|
||
|------|--------|-------|
|
||
| Dashboard | **Not started** | New page, new ViewModel |
|
||
| Bench | `BenchPage.xaml` exists | Expand with live plots, angle view |
|
||
| ECU | `PumpPage.xaml` exists | Rename, add sub-sections 3b–3e |
|
||
| Test | `TestsPage.xaml` exists | Add preconditions state machine |
|
||
| Results | **Not started** | New page, new ViewModel |
|
||
| Settings | Partial (`SettingsDialog`) | Migrate from dialog to full page |
|