SSPC-Tester/SSPCTester.UI/Views/ExperimentConsoleView.xaml

420 lines
29 KiB
Plaintext
Raw Normal View History

<UserControl x:Class="SSPCTester.UI.Views.ExperimentConsoleView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:SSPCTester.UI.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance Type=vm:ExperimentConsoleViewModel}">
<UserControl.Resources>
<Style x:Key="ConsoleSection" TargetType="Border">
<Setter Property="Background" Value="{StaticResource BgSurfaceAltBrush}" />
<Setter Property="BorderBrush" Value="{StaticResource BorderSubtleBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="{StaticResource RadiusMd}" />
<Setter Property="Padding" Value="14" />
<Setter Property="Margin" Value="0,0,0,12" />
</Style>
<Style x:Key="MetricCard" TargetType="Border">
<Setter Property="Background" Value="{StaticResource BgSurfaceBrush}" />
<Setter Property="BorderBrush" Value="{StaticResource BorderSubtleBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="{StaticResource RadiusMd}" />
<Setter Property="Padding" Value="10" />
<Setter Property="MinHeight" Value="68" />
</Style>
<Style x:Key="MetricLabel" TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource TextSecondaryBrush}" />
<Setter Property="FontSize" Value="{StaticResource FsSmall}" />
</Style>
<Style x:Key="MetricValue" TargetType="TextBlock">
<Setter Property="FontFamily" Value="{StaticResource FontMono}" />
<Setter Property="FontSize" Value="20" />
<Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="Margin" Value="0,7,0,0" />
</Style>
</UserControl.Resources>
<Grid Margin="20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="1.28*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!-- 电源 -->
<Border Style="{StaticResource Card}" Padding="16" Margin="0,0,16,0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Margin="0,0,0,14">
<TextBlock Text="电源 UDP5080-100" FontSize="{StaticResource FsH2}" FontWeight="SemiBold" />
<Border HorizontalAlignment="Right"
Style="{StaticResource StatusBadge}"
Background="{Binding IsPowerConnected, Converter={StaticResource StatusToSoftBrush}}">
<TextBlock Text="{Binding PowerConnectionStatus}"
Foreground="{Binding IsPowerConnected, Converter={StaticResource StatusToBrush}}"
FontSize="{StaticResource FsSmall}"
FontWeight="SemiBold" />
</Border>
</Grid>
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
<StackPanel>
<Border Style="{StaticResource ConsoleSection}">
<StackPanel>
<TextBlock Style="{StaticResource CardTitle}" Text="参数设置" FontSize="{StaticResource FsBody}" />
<Grid Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="88" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="34" />
</Grid.ColumnDefinitions>
<TextBlock Style="{StaticResource FieldLabel}" Text="电压设定" />
<TextBox Grid.Column="1" Text="{Binding PowerVoltageSetpoint, UpdateSourceTrigger=PropertyChanged}" FontFamily="{StaticResource FontMono}" />
<TextBlock Grid.Column="2" Text="V" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="{StaticResource TextSecondaryBrush}" />
</Grid>
<Grid Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="88" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="34" />
</Grid.ColumnDefinitions>
<TextBlock Style="{StaticResource FieldLabel}" Text="电流限值" />
<TextBox Grid.Column="1" Text="{Binding PowerCurrentLimit, UpdateSourceTrigger=PropertyChanged}" FontFamily="{StaticResource FontMono}" />
<TextBlock Grid.Column="2" Text="A" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="{StaticResource TextSecondaryBrush}" />
</Grid>
<Grid Margin="0,0,0,12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="88" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Style="{StaticResource FieldLabel}" Text="预设方案" />
<ComboBox Grid.Column="1"
ItemsSource="{Binding PowerPresets}"
SelectedItem="{Binding SelectedPowerPreset}"
DisplayMemberPath="Name" />
</Grid>
<UniformGrid Columns="3">
<Button Style="{StaticResource PrimaryButton}" Content="应用设置" Margin="0,0,6,0" Command="{Binding ApplyPowerCommand}" />
<Button Content="保存" Margin="6,0" Command="{Binding SavePowerPresetCommand}" />
<Button Content="删除" Margin="6,0,0,0" Command="{Binding DeletePowerPresetCommand}" />
</UniformGrid>
</StackPanel>
</Border>
<Border Style="{StaticResource ConsoleSection}">
<StackPanel>
<TextBlock Style="{StaticResource CardTitle}" Text="输出控制" FontSize="{StaticResource FsBody}" />
<UniformGrid Columns="3">
<Button Style="{StaticResource ToggleOnButton}" Content="输出开" Margin="0,0,6,0" Command="{Binding PowerOutputOnCommand}" IsEnabled="{Binding CanTurnPowerOutputOn}" />
<Button Style="{StaticResource ToggleOffButton}" Content="输出关" Margin="6,0" Command="{Binding PowerOutputOffCommand}" IsEnabled="{Binding CanTurnPowerOutputOff}" />
<Button Style="{StaticResource DangerButton}" Content="安全复位" Margin="6,0,0,0" Command="{Binding PowerSafeResetCommand}" />
</UniformGrid>
</StackPanel>
</Border>
<Border Style="{StaticResource ConsoleSection}" Margin="0">
<StackPanel>
<TextBlock Style="{StaticResource CardTitle}" Text="实时读数" FontSize="{StaticResource FsBody}" />
<UniformGrid Columns="2" Margin="0,0,0,10">
<Border Style="{StaticResource MetricCard}" Margin="0,0,5,5">
<StackPanel>
<TextBlock Style="{StaticResource MetricLabel}" Text="实际电压" />
<TextBlock Style="{StaticResource MetricValue}">
<Run Text="{Binding PowerVoltage, Converter={StaticResource NumberOrDash}, ConverterParameter=F3}" />
<Run Text=" V" FontSize="{StaticResource FsSmall}" Foreground="{StaticResource TextSecondaryBrush}" />
</TextBlock>
</StackPanel>
</Border>
<Border Style="{StaticResource MetricCard}" Margin="5,0,0,5">
<StackPanel>
<TextBlock Style="{StaticResource MetricLabel}" Text="实际电流" />
<TextBlock Style="{StaticResource MetricValue}">
<Run Text="{Binding PowerCurrent, Converter={StaticResource NumberOrDash}, ConverterParameter=F3}" />
<Run Text=" A" FontSize="{StaticResource FsSmall}" Foreground="{StaticResource TextSecondaryBrush}" />
</TextBlock>
</StackPanel>
</Border>
<Border Style="{StaticResource MetricCard}" Margin="0,5,5,0">
<StackPanel>
<TextBlock Style="{StaticResource MetricLabel}" Text="实际功率" />
<TextBlock Style="{StaticResource MetricValue}">
<Run Text="{Binding PowerWatts, Converter={StaticResource NumberOrDash}, ConverterParameter=F3}" />
<Run Text=" W" FontSize="{StaticResource FsSmall}" Foreground="{StaticResource TextSecondaryBrush}" />
</TextBlock>
</StackPanel>
</Border>
<Border Style="{StaticResource MetricCard}" Margin="5,5,0,0">
<StackPanel>
<TextBlock Style="{StaticResource MetricLabel}" Text="工作模式" />
<TextBlock Style="{StaticResource MetricValue}" Text="{Binding PowerModeText}" />
</StackPanel>
</Border>
</UniformGrid>
<Grid Margin="0,2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Text="输出状态" Foreground="{StaticResource TextSecondaryBrush}" />
<Border Grid.Column="1" Style="{StaticResource StatusBadge}" Background="{StaticResource NeutralSoftBrush}">
<TextBlock Text="{Binding PowerOutputStateText}" FontWeight="SemiBold" FontSize="{StaticResource FsSmall}" />
</Border>
</Grid>
<Grid Margin="0,8,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Text="异常状态" Foreground="{StaticResource TextSecondaryBrush}" />
<Border Grid.Column="1" Style="{StaticResource StatusBadge}" Background="{StaticResource NeutralSoftBrush}">
<TextBlock Text="{Binding PowerProtectionStateText}" FontWeight="SemiBold" FontSize="{StaticResource FsSmall}" />
</Border>
</Grid>
</StackPanel>
</Border>
</StackPanel>
</ScrollViewer>
</Grid>
</Border>
<!-- 继电器 -->
<Border Grid.Column="1" Style="{StaticResource Card}" Padding="16" Margin="0,0,16,0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Margin="0,0,0,14">
<TextBlock Text="继电器 / 24路通道" FontSize="{StaticResource FsH2}" FontWeight="SemiBold" />
<Border HorizontalAlignment="Right"
Style="{StaticResource StatusBadge}"
Background="{Binding IsRelayConnected, Converter={StaticResource StatusToSoftBrush}}">
<TextBlock Text="{Binding RelayConnectionStatus}"
Foreground="{Binding IsRelayConnected, Converter={StaticResource StatusToBrush}}"
FontSize="{StaticResource FsSmall}"
FontWeight="SemiBold" />
</Border>
</Grid>
<Border Grid.Row="1" Style="{StaticResource ConsoleSection}">
<StackPanel>
<TextBlock Style="{StaticResource CardTitle}" Text="批量控制" FontSize="{StaticResource FsBody}" />
<UniformGrid Columns="3">
<Button Style="{StaticResource ToggleOnButton}" Content="全开" Margin="0,0,6,0" Command="{Binding RelayAllOnCommand}" />
<Button Style="{StaticResource ToggleOffButton}" Content="全关" Margin="6,0" Command="{Binding RelayAllOffCommand}" />
<Button Style="{StaticResource PrimaryButton}" Content="读取全部" Margin="6,0,0,0" Command="{Binding ReadRelayAllCommand}" />
</UniformGrid>
</StackPanel>
</Border>
<Grid Grid.Row="2" MinHeight="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Text="通道控制与读数" FontWeight="SemiBold" Margin="0,0,0,8" />
<DataGrid Grid.Row="1" ItemsSource="{Binding Channels}" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="通道" Binding="{Binding ChannelText}" Width="76">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="电压" Width="*">
<DataGridTextColumn.Binding>
<Binding Path="Voltage" Converter="{StaticResource NumberOrDash}" ConverterParameter="F3" StringFormat="{}{0} V" />
</DataGridTextColumn.Binding>
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock" BasedOn="{StaticResource MonoText}" />
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="电流" Width="*">
<DataGridTextColumn.Binding>
<Binding Path="Current" Converter="{StaticResource NumberOrDash}" ConverterParameter="F3" StringFormat="{}{0} A" />
</DataGridTextColumn.Binding>
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock" BasedOn="{StaticResource MonoText}" />
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTemplateColumn Header="开" Width="64">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Style="{StaticResource ToggleOnButton}"
Content="开"
Command="{Binding DataContext.TurnRelayOnCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="关" Width="64">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Style="{StaticResource ToggleOffButton}"
Content="关"
Command="{Binding DataContext.TurnRelayOffCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Grid>
</Border>
<!-- 负载 -->
<Border Grid.Column="2" Style="{StaticResource Card}" Padding="16">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Margin="0,0,0,14">
<TextBlock Text="负载 IT8702P" FontSize="{StaticResource FsH2}" FontWeight="SemiBold" />
<Border HorizontalAlignment="Right"
Style="{StaticResource StatusBadge}"
Background="{Binding IsLoadConnected, Converter={StaticResource StatusToSoftBrush}}">
<TextBlock Text="{Binding LoadConnectionStatus}"
Foreground="{Binding IsLoadConnected, Converter={StaticResource StatusToBrush}}"
FontSize="{StaticResource FsSmall}"
FontWeight="SemiBold" />
</Border>
</Grid>
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
<StackPanel>
<Border Style="{StaticResource ConsoleSection}">
<StackPanel>
<TextBlock Style="{StaticResource CardTitle}" Text="参数设置" FontSize="{StaticResource FsBody}" />
<Grid Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="88" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Style="{StaticResource FieldLabel}" Text="工作模式" />
<Border Grid.Column="1" Background="{StaticResource PrimarySoftBrush}" CornerRadius="{StaticResource RadiusMd}" Height="{StaticResource ControlHeight}">
<TextBlock Text="CC 恒流" VerticalAlignment="Center" Margin="10,0" Foreground="{StaticResource PrimaryBrush}" FontWeight="SemiBold" />
</Border>
</Grid>
<Grid Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="88" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="34" />
</Grid.ColumnDefinitions>
<TextBlock Style="{StaticResource FieldLabel}" Text="负载电流" />
<TextBox Grid.Column="1" Text="{Binding LoadCurrentSetpoint, UpdateSourceTrigger=PropertyChanged}" FontFamily="{StaticResource FontMono}" />
<TextBlock Grid.Column="2" Text="A" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="{StaticResource TextSecondaryBrush}" />
</Grid>
<Grid Margin="0,0,0,12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="88" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Style="{StaticResource FieldLabel}" Text="预设方案" />
<ComboBox Grid.Column="1"
ItemsSource="{Binding LoadPresets}"
SelectedItem="{Binding SelectedLoadPreset}"
DisplayMemberPath="Name" />
</Grid>
<UniformGrid Columns="3">
<Button Style="{StaticResource PrimaryButton}" Content="应用设置" Margin="0,0,6,0" Command="{Binding ApplyLoadCommand}" />
<Button Content="保存" Margin="6,0" Command="{Binding SaveLoadPresetCommand}" />
<Button Content="删除" Margin="6,0,0,0" Command="{Binding DeleteLoadPresetCommand}" />
</UniformGrid>
</StackPanel>
</Border>
<Border Style="{StaticResource ConsoleSection}">
<StackPanel>
<TextBlock Style="{StaticResource CardTitle}" Text="输入控制" FontSize="{StaticResource FsBody}" />
<UniformGrid Columns="3">
<Button Style="{StaticResource ToggleOnButton}" Content="输入开" Margin="0,0,6,0" Command="{Binding LoadInputOnCommand}" IsEnabled="{Binding CanTurnLoadInputOn}" />
<Button Style="{StaticResource ToggleOffButton}" Content="输入关" Margin="6,0" Command="{Binding LoadInputOffCommand}" IsEnabled="{Binding CanTurnLoadInputOff}" />
<Button Style="{StaticResource DangerButton}" Content="安全复位" Margin="6,0,0,0" Command="{Binding LoadSafeResetCommand}" />
</UniformGrid>
</StackPanel>
</Border>
<Border Style="{StaticResource ConsoleSection}" Margin="0">
<StackPanel>
<TextBlock Style="{StaticResource CardTitle}" Text="实时读数" FontSize="{StaticResource FsBody}" />
<UniformGrid Columns="2" Margin="0,0,0,10">
<Border Style="{StaticResource MetricCard}" Margin="0,0,5,5">
<StackPanel>
<TextBlock Style="{StaticResource MetricLabel}" Text="实际电压" />
<TextBlock Style="{StaticResource MetricValue}">
<Run Text="{Binding LoadVoltage, Converter={StaticResource NumberOrDash}, ConverterParameter=F3}" />
<Run Text=" V" FontSize="{StaticResource FsSmall}" Foreground="{StaticResource TextSecondaryBrush}" />
</TextBlock>
</StackPanel>
</Border>
<Border Style="{StaticResource MetricCard}" Margin="5,0,0,5">
<StackPanel>
<TextBlock Style="{StaticResource MetricLabel}" Text="实际电流" />
<TextBlock Style="{StaticResource MetricValue}">
<Run Text="{Binding LoadCurrent, Converter={StaticResource NumberOrDash}, ConverterParameter=F3}" />
<Run Text=" A" FontSize="{StaticResource FsSmall}" Foreground="{StaticResource TextSecondaryBrush}" />
</TextBlock>
</StackPanel>
</Border>
<Border Style="{StaticResource MetricCard}" Margin="0,5,5,0">
<StackPanel>
<TextBlock Style="{StaticResource MetricLabel}" Text="实际功率" />
<TextBlock Style="{StaticResource MetricValue}">
<Run Text="{Binding LoadWatts, Converter={StaticResource NumberOrDash}, ConverterParameter=F3}" />
<Run Text=" W" FontSize="{StaticResource FsSmall}" Foreground="{StaticResource TextSecondaryBrush}" />
</TextBlock>
</StackPanel>
</Border>
<Border Style="{StaticResource MetricCard}" Margin="5,5,0,0">
<StackPanel>
<TextBlock Style="{StaticResource MetricLabel}" Text="工作模式" />
<TextBlock Style="{StaticResource MetricValue}" Text="CC" />
</StackPanel>
</Border>
</UniformGrid>
<Grid Margin="0,2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Text="输入状态" Foreground="{StaticResource TextSecondaryBrush}" />
<Border Grid.Column="1" Style="{StaticResource StatusBadge}" Background="{StaticResource NeutralSoftBrush}">
<TextBlock Text="{Binding LoadInputStateText}" FontWeight="SemiBold" FontSize="{StaticResource FsSmall}" />
</Border>
</Grid>
<Grid Margin="0,8,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Text="异常状态" Foreground="{StaticResource TextSecondaryBrush}" />
<Border Grid.Column="1" Style="{StaticResource StatusBadge}" Background="{StaticResource NeutralSoftBrush}">
<TextBlock Text="{Binding LoadProtectionStateText}" FontWeight="SemiBold" FontSize="{StaticResource FsSmall}" />
</Border>
</Grid>
</StackPanel>
</Border>
</StackPanel>
</ScrollViewer>
</Grid>
</Border>
</Grid>
</UserControl>