-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIedConfigurationWizardWindow.xaml
More file actions
226 lines (214 loc) · 18.3 KB
/
Copy pathIedConfigurationWizardWindow.xaml
File metadata and controls
226 lines (214 loc) · 18.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
<Window x:Class="Ari61850Bridge.IedConfigurationWizardWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="IED Configuration Wizard" Height="800" Width="1240"
MinHeight="730" MinWidth="1120"
WindowStartupLocation="CenterOwner" Background="{StaticResource Bg}"
FontFamily="Aptos, Segoe UI Variable Text, Segoe UI, Calibri" Icon="Assets/app-icon.ico">
<Grid Margin="20">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="0,0,0,14">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Border Width="46" Height="46" CornerRadius="14" ClipToBounds="True" Margin="0,0,14,0">
<Image Source="Assets/app-icon.png" Width="46" Height="46" RenderOptions.BitmapScalingMode="HighQuality"/>
</Border>
<StackPanel Grid.Column="1" VerticalAlignment="Center">
<TextBlock Text="Configure IED" FontSize="25" FontWeight="SemiBold" Foreground="{StaticResource Ink}"/>
<TextBlock Text="Guided workflow: discover full IED model → manually select Explorer signals → review report/polling plan" FontSize="12.8" Foreground="{StaticResource Muted}" Margin="0,4,0,0"/>
</StackPanel>
<Button Grid.Column="2" Content="×" Width="42" Height="42" Style="{StaticResource SoftButton}" Click="Cancel_Click"/>
</Grid>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="220"/>
<ColumnDefinition Width="16"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- Selectable wizard navigation. These are real workflow steps, not decorative cards. -->
<Border Grid.Column="0" Style="{StaticResource Card}" Padding="10">
<StackPanel>
<Button Tag="0" Click="StepNav_Click" Style="{StaticResource SoftButton}" Margin="0,0,0,10" Padding="14,12">
<StackPanel HorizontalAlignment="Left">
<TextBlock Text="1 Select IEC Signals" FontSize="13.4" FontWeight="SemiBold"/>
<TextBlock Text="Choose SCADA-ready MMS objects. Raw attributes stay available for advanced use." TextWrapping="Wrap" Foreground="{StaticResource Muted}" FontSize="11.6" Margin="0,5,0,0"/>
</StackPanel>
</Button>
<Button Tag="1" Click="StepNav_Click" Style="{StaticResource SoftButton}" Margin="0,0,0,10" Padding="14,12">
<StackPanel HorizontalAlignment="Left">
<TextBlock Text="2 Auto Report Plan" FontSize="13.4" FontWeight="SemiBold"/>
<TextBlock Text="Engine maps signals to RCB/DataSet automatically; no report selection required." TextWrapping="Wrap" Foreground="{StaticResource Muted}" FontSize="11.6" Margin="0,5,0,0"/>
</StackPanel>
</Button>
<Button Tag="2" Click="StepNav_Click" Style="{StaticResource SoftButton}" Padding="14,12">
<StackPanel HorizontalAlignment="Left">
<TextBlock Text="3 Add to Explorer" FontSize="13.4" FontWeight="SemiBold"/>
<TextBlock Text="Save only the IEC Explorer selection. Modbus assignment is a separate workflow." TextWrapping="Wrap" Foreground="{StaticResource Muted}" FontSize="11.6" Margin="0,5,0,0"/>
</StackPanel>
</Button>
</StackPanel>
</Border>
<Border Grid.Column="2" Style="{StaticResource Card}" Padding="12">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="0,0,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Text="{Binding StepTitle}" FontSize="18" FontWeight="SemiBold" Foreground="{StaticResource Ink}"/>
<TextBlock Text="{Binding StepSubtitle}" FontSize="12.4" Foreground="{StaticResource Muted}" Margin="0,3,0,0"/>
</StackPanel>
<TextBlock Grid.Column="1" Text="{Binding VisibleSignalCountText}" Foreground="{StaticResource Muted}" FontSize="12.2" VerticalAlignment="Bottom"/>
</Grid>
<!-- STEP 1: IEC SIGNAL SELECTION -->
<Grid Grid.Row="1" Visibility="{Binding Step1Visibility}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="0,0,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Border MinWidth="390" MinHeight="38" Background="White" BorderBrush="{StaticResource Line}" BorderThickness="1" CornerRadius="16" Padding="12,0" Margin="0,0,12,0" VerticalAlignment="Center" ToolTip="Search by LN, signal name, IEC object reference, type, quality, report plan, or category.">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="🔍" FontSize="14" Foreground="{StaticResource Muted}" VerticalAlignment="Center" Margin="0,0,8,0"/>
<TextBlock Grid.Column="1" Text="Search signal, e.g. MMXU2 PhV, GGIO Ind15..." Foreground="{StaticResource Muted}" Opacity="0.72" FontSize="12.4" VerticalAlignment="Center" IsHitTestVisible="False" Visibility="{Binding SearchPlaceholderVisibility}"/>
<TextBox Grid.Column="1" Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}" BorderThickness="0" Background="Transparent" Padding="0,5" MinHeight="30" FontSize="12.6" ToolTip="Example: MMXU2 PhV, GGIO Ind15, good, Report, Polling"/>
<Button Grid.Column="2" Content="×" Style="{StaticResource MiniChipButton}" Padding="6,2" MinHeight="24" Margin="8,0,0,0" Click="ClearFilter_Click" ToolTip="Clear search" Visibility="{Binding SearchClearVisibility}"/>
</Grid>
</Border>
<WrapPanel Grid.Column="1" VerticalAlignment="Center">
<Button Content="⚡ Probe Selected" Style="{StaticResource MiniChipButton}" Click="ProbeSelected_Click" Margin="0,0,6,0"/>
<Button Content="× Clear Selection" Style="{StaticResource MiniChipButton}" Click="ClearSelection_Click" Margin="0,0,6,0"/>
<CheckBox Content="Advanced raw" IsChecked="{Binding ShowRaw}" VerticalAlignment="Center" Margin="5,0,10,0"/>
</WrapPanel>
</Grid>
<DataGrid x:Name="SignalsGrid" Grid.Row="1" ItemsSource="{Binding SignalsView}" SelectedItem="{Binding SelectedSignal, Mode=TwoWay}" SelectionMode="Extended" SelectionUnit="FullRow" Style="{StaticResource ModernDataGrid}" ToolTip="Click anywhere on a signal row to check/uncheck it. Right-click for IEC 61850 properties." PreviewMouseLeftButtonUp="SignalsGrid_PreviewMouseLeftButtonUp" PreviewMouseRightButtonDown="SignalsGrid_PreviewMouseRightButtonDown" KeyDown="SignalsGrid_KeyDown">
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="Signal Properties" Click="ShowSignalProperties_Click"/>
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.Columns>
<DataGridTemplateColumn Width="54">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<CheckBox ToolTip="Select/deselect all visible publishable signals" HorizontalAlignment="Center" Click="SignalUseHeaderCheckBox_Click"/>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
IsEnabled="{Binding CanPublishAsSignal}"
HorizontalAlignment="Center"
Click="SignalUseCheckBox_Click"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="IEC Signal" Binding="{Binding ObjectReference}" Width="360" MinWidth="280" IsReadOnly="True"/>
<DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="120" IsReadOnly="True"/>
<DataGridTextColumn Header="t Attribute" Binding="{Binding DeviceTimestamp}" Width="140" IsReadOnly="True"/>
<DataGridTextColumn Header="q Attribute" Binding="{Binding Quality}" Width="120" IsReadOnly="True"/>
<DataGridTextColumn Header="Probe" Binding="{Binding ProbeStatus}" Width="130" IsReadOnly="True"/>
<DataGridTextColumn Header="Type" Binding="{Binding DataType}" Width="85" IsReadOnly="True"/>
<DataGridTextColumn Header="RCB Plan" Binding="{Binding ReportPlan}" Width="150" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
<!-- STEP 2: AUTO REPORT PLAN REVIEW -->
<Grid Grid.Row="1" Visibility="{Binding StepReportVisibility}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Margin="0,0,0,10">
<TextBlock Text="Auto report planner maps every selected SCADA signal to the safest transport. Report is used when static DataSet/RCB coverage is known; MMS polling fallback is used when the IED exposes the signal but static reporting does not include it." Foreground="{StaticResource Muted}" FontSize="12.4" TextWrapping="Wrap"/>
<TextBlock Text="{Binding ReportPlanStatus}" Foreground="{StaticResource Accent}" FontSize="12.3" FontWeight="SemiBold" Margin="0,4,0,0" TextWrapping="Wrap"/>
</StackPanel>
<Border Grid.Row="1" Background="#F8FAFC" CornerRadius="16" Padding="10" BorderBrush="{StaticResource Line}" BorderThickness="1">
<DockPanel>
<StackPanel DockPanel.Dock="Top" Margin="0,0,0,8">
<TextBlock Text="Selected Signal Transport Plan" FontSize="14.5" FontWeight="SemiBold" Foreground="{StaticResource Ink}"/>
<TextBlock Text="This is a read-only review. User does not choose RCB/DataSet here; technical details are available from Signal Properties and Diagnostics." FontSize="11.8" Foreground="{StaticResource Muted}" TextWrapping="Wrap"/>
</StackPanel>
<DataGrid ItemsSource="{Binding AutoPlanSignalsView}" IsReadOnly="True" Style="{StaticResource ModernDataGrid}" ScrollViewer.HorizontalScrollBarVisibility="Auto">
<DataGrid.Columns>
<DataGridTextColumn Header="IEC Signal" Binding="{Binding ObjectReference}" Width="330*" MinWidth="300"/>
<DataGridTextColumn Header="Source" Binding="{Binding ReportPlan}" Width="150"/>
<DataGridTextColumn Header="Quality" Binding="{Binding Quality}" Width="90"/>
<DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="110"/>
<DataGridTextColumn Header="DataSet" Binding="{Binding DataSetReference}" Width="260*" MinWidth="210"/>
<DataGridTextColumn Header="RCB" Binding="{Binding ReportControlReference}" Width="260*" MinWidth="210"/>
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Border>
<Border Grid.Row="2" CornerRadius="14" Background="#EEF4FF" Padding="12,8" BorderBrush="#D7E3F7" BorderThickness="1" Margin="0,10,0,0">
<TextBlock Text="Safe default: ARServer does not create or rewrite IED DataSets. It enables useful static report lane(s), keeps polling fallback for uncovered signals, and records exact RCB/DataSet detail per signal for engineering audit." Foreground="{StaticResource Muted}" FontSize="12.2" TextWrapping="Wrap"/>
</Border>
</Grid>
<!-- STEP 3: REVIEW / ADD TO EXPLORER -->
<Grid Grid.Row="1" Visibility="{Binding Step3Visibility}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<UniformGrid Grid.Row="0" Columns="2" Margin="0,0,0,12">
<Border Background="#F8FAFC" CornerRadius="16" Padding="16" BorderBrush="{StaticResource Line}" BorderThickness="1" Margin="0,0,8,0">
<StackPanel>
<TextBlock Text="Selected IEC Signals" Foreground="{StaticResource Muted}" FontSize="12"/>
<TextBlock Text="{Binding SelectedSignalCount}" FontSize="25" FontWeight="SemiBold" Foreground="{StaticResource Ink}"/>
</StackPanel>
</Border>
<Border Background="#F8FAFC" CornerRadius="16" Padding="16" BorderBrush="{StaticResource Line}" BorderThickness="1" Margin="8,0,0,0">
<StackPanel>
<TextBlock Text="Modbus Assignment" Foreground="{StaticResource Muted}" FontSize="12"/>
<TextBlock Text="Separate workflow" FontSize="18" FontWeight="SemiBold" Foreground="{StaticResource Accent}" Margin="0,6,0,0"/>
</StackPanel>
</Border>
</UniformGrid>
<Border Grid.Row="1" Background="#F8FAFC" CornerRadius="18" Padding="18" BorderBrush="{StaticResource Line}" BorderThickness="1">
<StackPanel>
<TextBlock Text="Ready to add these signals to IEC 61850 Explorer" FontSize="18" FontWeight="SemiBold" Foreground="{StaticResource Ink}"/>
<TextBlock Text="Save updates only the IEC 61850 Explorer signal list. Use Assign Signal to Modbus in the Modbus Server tab when a signal also needs a Modbus route." TextWrapping="Wrap" Foreground="{StaticResource Muted}" FontSize="13" Margin="0,8,0,0"/>
<TextBlock Text="Tip: Only selected SCADA signals become runtime targets. ARServer auto-plans report lanes per signal and uses MMS polling fallback for static DataSets that do not contain the selected signal." TextWrapping="Wrap" Foreground="{StaticResource Muted}" FontSize="12.5" Margin="0,18,0,0"/>
</StackPanel>
</Border>
</Grid>
</Grid>
</Border>
</Grid>
<Grid Grid.Row="2" Margin="0,14,0,0">
<Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="{Binding StatusMessage}" Foreground="{StaticResource Accent}" FontWeight="SemiBold" FontSize="12.4"/>
<TextBlock Text="Viewing and editing are separated. This wizard changes configuration; Explorer and Modbus tabs stay lightweight runtime views." Foreground="{StaticResource Muted}" FontSize="12" Margin="0,3,0,0"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal">
<Button Content="‹ Back" Style="{StaticResource SoftButton}" Click="Back_Click" Margin="0,0,8,0"/>
<Button Content="Cancel" Style="{StaticResource SoftButton}" Click="Cancel_Click" Margin="0,0,8,0"/>
<Button Content="{Binding PrimaryActionText}" Style="{StaticResource PrimaryButton}" Click="NextOrSave_Click"/>
</StackPanel>
</Grid>
</Grid>
</Window>