Files
HC_APTBS/Views/UserControls/BenchRpmCommandCard.xaml
LucianoDev 827b811b39 feat: developer tools page, auto-test orchestrator, BIP display, tests redesign
Bundles several feature streams that have been iterating on the working tree:

- Developer Tools page (Debug-only via DEVELOPER_TOOLS symbol): hosts the
  identification card, manual KWP write + transaction log, ROM/EEPROM dump
  card with progress banner and completion message, persisted custom-commands
  library, persisted EEPROM passwords library. New service primitives:
  IKwpService.SendRawCustomAsync / ReadEepromAsync / ReadRomEepromAsync.
  Persistence mirrors the Clients XML pattern in two new files
  (custom_commands.xml, eeprom_passwords.xml).
- Auto-test orchestrator (IAutoTestOrchestrator + AutoTestState): linear
  K-Line read -> unlock -> bench-on -> test sequence with snackbar UI and
  progress dialog VM, gated on dashboard alarms.
- BIP-STATUS display: BipDisplayViewModel + BipDisplayView, RAM read at
  0x0106 via IKwpService.ReadBipStatusAsync; status definitions in
  BipStatusDefinition.
- Tests page redesign: TestSectionCard + PhaseTileView replacing the old
  TestPlanView/TestRunningView/TestDoneView/TestPreconditionsView/
  TestSectionView controls and their VMs.
- Pump command sliders: Fluent thick-track style with overhang thumb,
  click-anywhere-and-drag, mouse-wheel adjustment.
- Window startup: app.manifest declares PerMonitorV2 DPI awareness,
  MainWindow installs a WM_GETMINMAXINFO hook in OnSourceInitialized and
  maximizes there (after the hook is in place) so the app fits the work
  area exactly on any display configuration.
- Misc: PercentToPixelsConverter, seed_aliases.py one-shot pump-alias
  importer, tools/Import-BipStatus.ps1, kline_eeprom_spec.md and
  dump-functions reference docs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-07 13:59:50 +02:00

146 lines
9.2 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<UserControl x:Class="HC_APTBS.Views.UserControls.BenchRpmCommandCard"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
mc:Ignorable="d"
d:DesignHeight="440" d:DesignWidth="320">
<!--
RPM command card — inline numeric entry, 8 preset buttons, Start/Stop.
DataContext = BenchPageViewModel.
-->
<Border Style="{StaticResource PumpCard}">
<StackPanel>
<!-- ── Card header ─────────────────────────────────────────── -->
<DockPanel Margin="0,0,0,12">
<ui:SymbolIcon DockPanel.Dock="Left" Symbol="Gauge24" FontSize="16"
Foreground="{DynamicResource AccentTextFillColorPrimaryBrush}"
Margin="0,0,8,0" VerticalAlignment="Center"/>
<TextBlock Text="{DynamicResource Bench.RpmCommand.Title}"
Style="{StaticResource PumpCardHeader}" Margin="0"/>
</DockPanel>
<!-- ── Actual / Target mini readouts ───────────────────────── -->
<Grid Margin="0,0,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="8"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0"
Background="{DynamicResource ControlFillColorSecondaryBrush}"
BorderBrush="{DynamicResource ControlStrokeColorDefaultBrush}"
BorderThickness="1" CornerRadius="6" Padding="10,8">
<StackPanel>
<TextBlock Text="{DynamicResource Bench.RpmCommand.Actual}"
FontSize="11"
Foreground="{DynamicResource TextFillColorSecondaryBrush}"
Margin="0,0,0,4"/>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="{Binding Root.BenchRpm, StringFormat=F0}"
FontFamily="Consolas" FontSize="26" FontWeight="SemiBold"
Foreground="{DynamicResource TextFillColorPrimaryBrush}"/>
<TextBlock Text=" rpm" FontSize="11"
Foreground="{DynamicResource TextFillColorTertiaryBrush}"
VerticalAlignment="Bottom" Margin="0,0,0,3"/>
</StackPanel>
</StackPanel>
</Border>
<Border Grid.Column="2"
Background="{DynamicResource ControlFillColorSecondaryBrush}"
BorderBrush="{DynamicResource ControlStrokeColorDefaultBrush}"
BorderThickness="1" CornerRadius="6" Padding="10,8">
<StackPanel>
<TextBlock Text="{DynamicResource Bench.RpmCommand.Target}"
FontSize="11"
Foreground="{DynamicResource TextFillColorSecondaryBrush}"
Margin="0,0,0,4"/>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="{Binding BenchControl.TargetRpm, StringFormat=F0}"
FontFamily="Consolas" FontSize="26" FontWeight="SemiBold"
Foreground="{DynamicResource AccentTextFillColorPrimaryBrush}"/>
<TextBlock Text=" rpm" FontSize="11"
Foreground="{DynamicResource TextFillColorTertiaryBrush}"
VerticalAlignment="Bottom" Margin="0,0,0,3"/>
</StackPanel>
<TextBlock Text="{Binding BenchControl.CommandVoltage, StringFormat='F3\u202FV'}"
FontFamily="Consolas" FontSize="10"
Foreground="{DynamicResource TextFillColorSecondaryBrush}"/>
</StackPanel>
</Border>
</Grid>
<!-- ── Manual RPM input ─────────────────────────────────────── -->
<Grid Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0"
Text="{Binding BenchControl.RpmInputText, UpdateSourceTrigger=PropertyChanged}"
FontFamily="Consolas" FontSize="20" FontWeight="SemiBold"
Height="40" VerticalContentAlignment="Center"
HorizontalContentAlignment="Right" Padding="8,0"/>
<TextBlock Grid.Column="1" Text="rpm"
VerticalAlignment="Center"
Foreground="{DynamicResource TextFillColorSecondaryBrush}"
FontSize="12" Margin="6,0,0,0"/>
</Grid>
<!-- ── Preset RPM buttons 2×4 ──────────────────────────────── -->
<UniformGrid Rows="2" Columns="4" Margin="-2,0,-2,10">
<ui:Button Content="100" CommandParameter="100"
Command="{Binding BenchControl.SetQuickRpmCommand}"
Appearance="Secondary" Height="40" HorizontalAlignment="Stretch" Margin="2" FontSize="12"/>
<ui:Button Content="200" CommandParameter="200"
Command="{Binding BenchControl.SetQuickRpmCommand}"
Appearance="Secondary" Height="40" HorizontalAlignment="Stretch" Margin="2" FontSize="12"/>
<ui:Button Content="500" CommandParameter="500"
Command="{Binding BenchControl.SetQuickRpmCommand}"
Appearance="Secondary" Height="40" HorizontalAlignment="Stretch" Margin="2" FontSize="12"/>
<ui:Button Content="750" CommandParameter="750"
Command="{Binding BenchControl.SetQuickRpmCommand}"
Appearance="Secondary" Height="40" HorizontalAlignment="Stretch" Margin="2" FontSize="12"/>
<ui:Button Content="1000" CommandParameter="1000"
Command="{Binding BenchControl.SetQuickRpmCommand}"
Appearance="Secondary" Height="40" HorizontalAlignment="Stretch" Margin="2" FontSize="12"/>
<ui:Button Content="1250" CommandParameter="1250"
Command="{Binding BenchControl.SetQuickRpmCommand}"
Appearance="Secondary" Height="40" HorizontalAlignment="Stretch" Margin="2" FontSize="12"/>
<ui:Button Content="1500" CommandParameter="1500"
Command="{Binding BenchControl.SetQuickRpmCommand}"
Appearance="Secondary" Height="40" HorizontalAlignment="Stretch" Margin="2" FontSize="12"/>
<ui:Button Content="2000" CommandParameter="2000"
Command="{Binding BenchControl.SetQuickRpmCommand}"
Appearance="Secondary" Height="40" HorizontalAlignment="Stretch" Margin="2" FontSize="12"/>
</UniformGrid>
<!-- ── Start / Stop ─────────────────────────────────────────── -->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="8"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ui:Button Grid.Column="0"
Content="{DynamicResource Bench.Start}"
Command="{Binding BenchControl.StartBenchCommand}"
Appearance="Primary" Height="46" HorizontalAlignment="Stretch" FontWeight="Bold" FontSize="14">
<ui:Button.Icon><ui:SymbolIcon Symbol="Play24"/></ui:Button.Icon>
</ui:Button>
<ui:Button Grid.Column="2"
Content="{DynamicResource Bench.Stop}"
Command="{Binding BenchControl.StopBenchCommand}"
Appearance="Danger" Height="46" HorizontalAlignment="Stretch" FontWeight="Bold" FontSize="14">
<ui:Button.Icon><ui:SymbolIcon Symbol="Stop24"/></ui:Button.Icon>
</ui:Button>
</Grid>
</StackPanel>
</Border>
</UserControl>