-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIedConfigurationWizardWindow.xaml
More file actions
276 lines (263 loc) · 23.4 KB
/
Copy pathIedConfigurationWizardWindow.xaml
File metadata and controls
276 lines (263 loc) · 23.4 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
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
<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 → select SCADA signals → auto-plan report/polling → build Modbus/MQTT runtime" 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 Modbus Binding" FontSize="13.4" FontWeight="SemiBold"/>
<TextBlock Text="Map selected signals into DI / IR / HR addresses without overlap." TextWrapping="Wrap" Foreground="{StaticResource Muted}" FontSize="11.6" Margin="0,5,0,0"/>
</StackPanel>
</Button>
<Button Tag="2" Click="StepNav_Click" Style="{StaticResource SoftButton}" Margin="0,0,0,10" Padding="14,12">
<StackPanel HorizontalAlignment="Left">
<TextBlock Text="3 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="3" Click="StepNav_Click" Style="{StaticResource SoftButton}" Padding="14,12">
<StackPanel HorizontalAlignment="Left">
<TextBlock Text="4 Add to Runtime" FontSize="13.4" FontWeight="SemiBold"/>
<TextBlock Text="Validate and save the IED configuration to Explorer, Modbus and MQTT." 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" MaxWidth="500" 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="⛓ Position" Tag="Pos stVal CSWI XCBR XSWI" Style="{StaticResource MiniChipButton}" Click="QuickFilter_Click" Margin="0,0,6,0"/>
<Button Content="🛡 Protection" Tag="PTOC PTRC PDIF PDIS Op general Tr general Str general" Style="{StaticResource MiniChipButton}" Click="QuickFilter_Click" Margin="0,0,6,0"/>
<Button Content="〽 MMXU cVal" Tag="MMXU cVal mag f" Style="{StaticResource MiniChipButton}" Click="QuickFilter_Click" Margin="0,0,6,0"/>
<Button Content="✓ Select Recommended" Style="{StaticResource MiniChipButton}" Click="SelectRecommended_Click" Margin="0,0,6,0"/>
<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"/>
<Button Content="⌫ Clear Filter" Style="{StaticResource MiniChipButton}" Click="ClearFilter_Click"/>
</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="Right-click a signal for IEC 61850 properties. Use Ctrl/Shift row selection, Ctrl+A, Space, header checkbox, or checkbox block-select to change many signals." 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: MODBUS BINDING -->
<Grid Grid.Row="1" Visibility="{Binding Step2Visibility}">
<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>
<TextBlock Text="Selected signals are converted to a clean Modbus map. Position first, protection second, measurement last." Foreground="{StaticResource Muted}" FontSize="12.4" VerticalAlignment="Center"/>
<WrapPanel Grid.Column="1">
<Button Content="↻ Rebuild Binding" Style="{StaticResource PrimaryButton}" Click="RebuildBinding_Click" Margin="0,0,8,0"/>
<Button Content="− Remove Binding" Style="{StaticResource SoftButton}" Click="RemoveBinding_Click" Margin="0,0,8,0"/>
<Button Content="✓ Validate" Style="{StaticResource SoftButton}" Click="Validate_Click"/>
</WrapPanel>
</Grid>
<DataGrid Grid.Row="1" ItemsSource="{Binding Bindings}" SelectedItem="{Binding SelectedBinding, Mode=TwoWay}" Style="{StaticResource ModernDataGrid}" ToolTip="Select a row and press Ctrl+C to copy it for debugging.">
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="On" Binding="{Binding IsEnabled, UpdateSourceTrigger=PropertyChanged}" Width="48"/>
<DataGridTextColumn Header="Signal" Binding="{Binding SignalName, UpdateSourceTrigger=PropertyChanged}" Width="190"/>
<DataGridTextColumn Header="IEC Reference" Binding="{Binding IecReference}" Width="360" MinWidth="280" IsReadOnly="True"/>
<DataGridTextColumn Header="Area" Binding="{Binding ModbusArea, UpdateSourceTrigger=PropertyChanged}" Width="120"/>
<DataGridTextColumn Header="Address" Binding="{Binding ModbusAddress, UpdateSourceTrigger=PropertyChanged}" Width="82"/>
<DataGridTextColumn Header="Type" Binding="{Binding ModbusDataType, UpdateSourceTrigger=PropertyChanged}" Width="85"/>
<DataGridTextColumn Header="Unit" Binding="{Binding Unit, UpdateSourceTrigger=PropertyChanged}" Width="70"/>
<DataGridTextColumn Header="Value" Binding="{Binding CurrentValue}" Width="110" IsReadOnly="True"/>
<DataGridTextColumn Header="Quality" Binding="{Binding Quality}" Width="82" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
<!-- STEP 3: 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 4: REVIEW / ADD TO RUNTIME -->
<Grid Grid.Row="1" Visibility="{Binding Step3Visibility}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<UniformGrid Grid.Row="0" Columns="3" 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="4,0">
<StackPanel>
<TextBlock Text="Modbus Bindings" Foreground="{StaticResource Muted}" FontSize="12"/>
<TextBlock Text="{Binding BindingCount}" 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="Validation" Foreground="{StaticResource Muted}" FontSize="12"/>
<TextBlock Text="{Binding ValidationState}" 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 this IED configuration to runtime workspace" FontSize="18" FontWeight="SemiBold" Foreground="{StaticResource Ink}"/>
<TextBlock Text="Save will update the IEC 61850 Explorer with the selected live signals and update the Modbus Server publish map. Runtime viewing stays clean; editing stays inside this wizard." 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>