FM2014TestBench: - initial setup to test multiple FM2014 - 3.Step

This commit is contained in:
Thomas Wiedebusch 2026-02-03 17:34:30 +01:00
parent 007681e95c
commit cb4c9a66b8
4 changed files with 387 additions and 179 deletions

View File

@ -21,11 +21,11 @@
</ItemsPanelTemplate>
</Menu.ItemsPanel>
<MenuItem x:Name="optionsMenu" HorizontalAlignment="Right" Height="26" Width="60" Header="_Options" >
<!-- <MenuItem x:Name="optionsMenuLogin" Header="_Login" HorizontalAlignment="Left" Click="OnLogin_Click"/>
<!-- <MenuItem x:Name="optionsMenuLogin" Header="_Login" HorizontalAlignment="Left" Click="OnLogin_Click"/>
<MenuItem x:Name="optionsMenuLogout" Header="L_ogout" HorizontalAlignment="Left" Click="OnLogout_Click"/>
<MenuItem x:Name="optionsMenuChangePassword" Header="Change Password" HorizontalAlignment="Left" Click="OnChangePassword_Click"/> -->
</MenuItem>
<!-- <Label Content="Slot: " Margin="2,2,2,2" Visibility="Hidden"/>
<!-- <Label Content="Slot: " Margin="2,2,2,2" Visibility="Hidden"/>
<ComboBox x:Name="cbxSlotBox" Margin="2,2,2,2" SelectionChanged="CbxSlotBox_SelectionChanged" Visibility="Hidden"/>
<Label x:Name="lblApprovalText" Margin="110,1,1,1" Content="SPECIAL APPROVAL - Id.Ver: 10.07" Foreground="#FFFB0808" FontSize="16" MouseDown="LblApprovalText_Click" HorizontalAlignment="Center"/> -->
<MenuItem x:Name="hlpMenu" HorizontalAlignment="Right" Height="26" Width="40" FontSize="12" Header="Help" Click="HlpMenu_Click" />
@ -129,19 +129,103 @@
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
</Grid.ColumnDefinitions>
</Grid.ColumnDefinitions>
<!-- User controls placeholder for devices-->
<StackPanel x:Name="spDevice1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="1" Grid.RowSpan="11" Grid.Column="4" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="1" Grid.RowSpan="11" Grid.Column="6" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="1" Grid.RowSpan="11" Grid.Column="8" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice4" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="1" Grid.RowSpan="11" Grid.Column="10" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="1" Grid.RowSpan="11" Grid.Column="12" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice6" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="1" Grid.RowSpan="11" Grid.Column="14" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice7" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="1" Grid.RowSpan="11" Grid.Column="16" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice8" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="1" Grid.RowSpan="11" Grid.Column="18" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice9" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="1" Grid.RowSpan="11" Grid.Column="20" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice10" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="1" Grid.RowSpan="11" Grid.Column="22" Grid.ColumnSpan="2" />
<GroupBox Header="FM2014" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="0" Grid.RowSpan="13" Grid.Column="0" Grid.ColumnSpan="24" >
<Grid Background="AliceBlue" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="2,2,2,2">
<Grid.RowDefinitions>
<RowDefinition Height="26"/>
<RowDefinition Height="26"/>
<RowDefinition Height="26"/>
<RowDefinition Height="26"/>
<RowDefinition Height="26"/>
<RowDefinition Height="26"/>
<RowDefinition Height="26"/>
<RowDefinition Height="26"/>
<RowDefinition Height="26"/>
<RowDefinition Height="26"/>
<RowDefinition Height="26"/>
<RowDefinition Height="26"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
</Grid.ColumnDefinitions>
<!-- Common labels for devices -->
<Label x:Name="lblConnectStatusText" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Content="Status:" />
<Label x:Name="lblMeasurement1Text" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Content="Measurement1:" />
<Label x:Name="lblMeasurement2Text" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" Content="Measurement2:" />
<Label x:Name="lblMeasurement3Text" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="3" Content="Measurement3:" />
<Label x:Name="lblMeasurement4Text" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="3" Content="Measurement4:" />
<Label x:Name="lblMeasurement5Text" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="3" Content="Measurement5:" />
<Label x:Name="lblMeasurement6Text" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="3" Content="Measurement6:" />
<Label x:Name="lblMeasurement7Text" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="3" Content="Measurement7:" />
<Label x:Name="lblFwVersionText" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="8" Grid.Column="0" Grid.ColumnSpan="3" Content="FW Version:" />
<Label x:Name="lblSerialNumberText" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="9" Grid.Column="0" Grid.ColumnSpan="3" Content="Serial Number:" />
<Label x:Name="lblLifeTimeText" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="10" Grid.Column="0" Grid.ColumnSpan="3" Content="Lifetime:" />
<Button HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="2,2,2,2" Grid.Row="11" Grid.Column="0" Grid.ColumnSpan="3" Content="Connect" Click="btnConnect_Click" />
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,-1,0,0" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,-1,0,0" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,-1,0,0" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="3" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,-1,0,0" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="3" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,-1,0,0" Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="3" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,-1,0,0" Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="3" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,-1,0,0" Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="3" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,-1,0,0" Grid.Row="8" Grid.Column="0" Grid.ColumnSpan="3" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,-1,0,0" Grid.Row="9" Grid.Column="0" Grid.ColumnSpan="3" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,-1,0,0" Grid.Row="10" Grid.Column="0" Grid.ColumnSpan="3" Stroke="LightGray"/>
<!--Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,-1,0,0" Grid.Row="11" Grid.Column="0" Grid.ColumnSpan="3" Stroke="LightGray"/-->
<!-- Stack panels for devices -->
<StackPanel x:Name="spDevice1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="3" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="5" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="7" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice4" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="9" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="11" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice6" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="13" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice7" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="15" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice8" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="17" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice9" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="19" Grid.ColumnSpan="2" />
<StackPanel x:Name="spDevice10" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="21" Grid.ColumnSpan="2" />
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="3" Grid.ColumnSpan="2" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="5" Grid.ColumnSpan="2" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="7" Grid.ColumnSpan="2" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="9" Grid.ColumnSpan="2" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="11" Grid.ColumnSpan="2" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="13" Grid.ColumnSpan="2" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="15" Grid.ColumnSpan="2" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="17" Grid.ColumnSpan="2" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="19" Grid.ColumnSpan="2" Stroke="LightGray"/>
<Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="-1,0,0,0" Grid.Row="0" Grid.RowSpan="11" Grid.Column="21" Grid.ColumnSpan="2" Stroke="LightGray"/>
</Grid>
</GroupBox>
<!--Pictures-->
<Border Grid.Row="0" Grid.RowSpan="2" Grid.Column="27" Grid.ColumnSpan="5" Margin="2,2,2,2" BorderThickness="1" BorderBrush="Black" >

View File

@ -42,8 +42,10 @@ using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;
using Sensus.Ui.FM2014TestBench.UserControls;
using Xylem.Common.CommonCore.Consts;
using Xylem.Common.Utils.ProcessExec.EventArguments;
using static Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Consts.FM2014CmdDef;
namespace Sensus.Ui.FM2014TestBench
{
@ -57,10 +59,22 @@ namespace Sensus.Ui.FM2014TestBench
private CancellationTokenSource _cancellationTokenSource;
private CancellationToken _cancellationToken;
private const Int32 MaxFm2014s = 10;
/// <summary>
/// The FM2014s served by this program
/// </summary>
private List<FM2014> Fm2014s { get; set; }
private readonly List<FM2014> Fm2014s = [];
/// <summary>
/// Stack panels for UcFM2014Device
/// </summary>
private readonly List<StackPanel> PanelsForUcFM2014s = [];
/// <summary>
/// User controls of FM2014Device
/// </summary>
private readonly List<UserControl> UcFM2014s = [];
/// <summary>
/// The start time is going to be used for time measurements of processes. It has to be set to
@ -136,6 +150,7 @@ namespace Sensus.Ui.FM2014TestBench
_cancellationTokenSource = new CancellationTokenSource();
_cancellationToken = _cancellationTokenSource.Token;
}
private void Window_Loaded(Object sender, RoutedEventArgs e)
@ -144,12 +159,6 @@ namespace Sensus.Ui.FM2014TestBench
// OnLogin_Click(this, null);
}
//TODO THW TEST FM2014 multiple objects
/// <summary>
/// The single FM2014 for this program
/// </summary>
private FM2014 Fm2014_TEST { get; set; }
private void Window_Initialized(Object sender, EventArgs e)
{
Init();
@ -162,18 +171,56 @@ namespace Sensus.Ui.FM2014TestBench
LogText(StrSeparator);
}
////btnFM2014Connect.Focus();
////TODO THW TEST FM2014 multiple objects
//Fm2014_TEST = new FM2014
//{
// Address = 1
//};
//Fm2014_TEST.OnRawRecordReceived += DataReceived_Handler;
//Fm2014_TEST.Connect("COM23");
//Fm2014_TEST.Login();
// Add user controls
// Initiate the stack panels
PanelsForUcFM2014s.Add(spDevice1);
PanelsForUcFM2014s.Add(spDevice2);
PanelsForUcFM2014s.Add(spDevice3);
PanelsForUcFM2014s.Add(spDevice4);
PanelsForUcFM2014s.Add(spDevice5);
PanelsForUcFM2014s.Add(spDevice6);
PanelsForUcFM2014s.Add(spDevice7);
PanelsForUcFM2014s.Add(spDevice8);
PanelsForUcFM2014s.Add(spDevice9);
PanelsForUcFM2014s.Add(spDevice10);
// Assign user controls
for (var ctr = 0; ctr < MaxFm2014s; ctr++)
{
var fm2014 = new FM2014
{
Address = ctr + 1
};
fm2014.OnRawRecordReceived += DataReceived_Handler;
Fm2014s.Add(fm2014);
UcFM2014s.Add(new UserControls.UcFM2014Device(Fm2014s[ctr]));
SetNewUserControl(PanelsForUcFM2014s[ctr], UcFM2014s[ctr]);
}
}
/// <summary>
/// Dispatch new user control to main screen
/// </summary>
/// <param name="sp"></param>
/// <param name="uc"></param>
private void SetNewUserControl(StackPanel sp, UserControl? uc)
{
sp.Dispatcher.Invoke(DispatcherPriority.Normal,
new Action(() =>
{
// remove last userControl
sp.Children.Clear();
if (uc != null)
{
sp.Children.Add(uc);
DockPanel.SetDock(uc, Dock.Top); // & Dock.Left);
}
}
));
}
private void Window_Closing(Object sender, System.ComponentModel.CancelEventArgs e)
{
_cancellationTokenSource.Cancel();
@ -490,123 +537,93 @@ namespace Sensus.Ui.FM2014TestBench
/// </remarks>
private void Connect()
{
//try
//{
// Init();
// if (string.IsNullOrEmpty(cbxFM2014ComPort?.SelectedItem?.ToString()) ||
// cbxFM2014ComPort.SelectedItem.ToString().Equals("?"))
// {
// var text = Resources.StrErrorMsgComPortNotAssigned;
// MessageBox.Show(text, Resources.StrError, MessageBoxButtons.OK, MessageBoxIcon.Error);
// LogText(text);
// return;
// }
try
{
Init();
//if (string.IsNullOrEmpty(cbxFM2014ComPort?.SelectedItem?.ToString()) ||
// cbxFM2014ComPort.SelectedItem.ToString().Equals("?"))
//{
// var text = Resources.StrErrorMsgComPortNotAssigned;
// MessageBox.Show(text, Resources.StrError, MessageBoxButtons.OK, MessageBoxIcon.Error);
// LogText(text);
// return;
//}
// StoreFM2014Settings();
StoreFM2014Settings();
// ActionControl(true);
ActionControl(true);
// if (Fm2014 != null)
// {
// Fm2014.OnRawRecordReceived -= DataReceived_Handler;
// Fm2014.Dispose();
// //dispose old meter
// Fm2014 = null;
// }
ResetCancellationToken();
FM2014.SharedCancellationToken = _cancellationToken;
//lblActualProcess.Text = Resources.StrMsgConnecting;
//Fm2014.Connect(cbxFM2014ComPort.SelectedItem.ToString());
// //assign new meter
// Fm2014 = new FM2014();
var comPort = "COM23";
// Fm2014.OnRawRecordReceived += DataReceived_Handler;
// ResetCancellationToken();
// FM2014.SharedCancellationToken = _cancellationToken;
// if (int.TryParse(cbxFM2014Address.SelectedItem.ToString(), out var address))
// {
// Fm2014.Address = address;
// }
// else
// {
// ActionControl(false);
// LogErrorText(Resources.StrErrorMsgFM2014AddressInvalid);
// }
// if (int.TryParse(cbxFM2014TolerancePercent.SelectedItem.ToString(), out var tolerancePercent)
// && (tolerancePercent == 3 || tolerancePercent == 5))
// {
// Fm2014.Tolerance_percent = tolerancePercent;
// }
// else
// {
// ActionControl(false);
// LogErrorText(Resources.StrErrorMsgFM2014ToleranceInvalid);
// }
Task.Factory.StartNew(() =>
{
for (var ctr = 0; ctr < MaxFm2014s; ctr++)
{
var ucFm2014Device = (UcFM2014Device)UcFM2014s[ctr];
var fm2014 = Fm2014s[ctr];
// lblActualProcess.Text = Resources.StrMsgConnecting;
// Fm2014.Connect(cbxFM2014ComPort.SelectedItem.ToString());
if (!fm2014.Connect(comPort))
{
ucFm2014Device.SetConnectionStatus(ConnectionStatusName.OFFLINE);
continue;
}
fm2014.Login();
// //TODO THW TEST FM2014 multiple objects
// if (cbxMultipleFm2014.Checked)
// {
// Fm2014_TEST = new FM2014
// {
// Address = 2
// };
// Fm2014_TEST.OnRawRecordReceived += DataReceived_Handler_TEST;
// Fm2014_TEST.Connect(cbxFM2014ComPort.SelectedItem.ToString());
// }
if (fm2014.IsLoggedOn)
{
ucFm2014Device.SetConnectionStatus(ConnectionStatusName.ONLINE);
}
else
{
ucFm2014Device.SetConnectionStatus(ConnectionStatusName.OFFLINE);
}
}
//if (!Fm2014.IsLoggedOn)
//{
// LogErrorText(Resources.StrErrorMsgFM2014AccessDenied);
// ActionControl(false);
// return;
//}
// Task.Factory.StartNew(() =>
// {
// Fm2014.Login();
//if (Fm2014.IsLoggedOn)
//{
// Invoke(new Action(() =>
// {
// lblConnectionStatus.Text = Resources.StrLblFM2014Connected;
// lblConnectionStatus.ForeColor = Color.Green;
// tbxFM2014ApplicationFwVersion.Text = Fm2014.FwVersion;
// tbxFM2014SerialNumber.Text = Fm2014.SerialNumber;
// //TODO THW TEST FM2014 multiple objects
// if (cbxMultipleFm2014.Checked)
// {
// Fm2014_TEST.Login();
// }
// // Logging to history window
// LogText("FM2014 ID: " + Fm2014.ConnectResponse);
// LogText("FM2014 Firmware Version: " + Fm2014.FwVersion);
// LogText($"FM2014 {Resources.StrLblFM2014SerialNumber} " + Fm2014.SerialNumber);
// LogText($"FW2014 {Resources.StrLblFM2014Address} " + Fm2014.Address);
// var dt = DateTime.UtcNow;
// var msg = $"{dt:yyyy-MM-dd HH:mm:ss} UTC";
// LogText($"{Resources.StrMsgPcDateTime} {msg}");
// LogText(StrSeparator);
// if (!Fm2014.IsLoggedOn)
// {
// LogErrorText(Resources.StrErrorMsgFM2014AccessDenied);
// Fm2014.Logout();
// ActionControl(false);
// return;
// }
// if (Fm2014.IsLoggedOn)
// {
// Invoke(new Action(() =>
// {
// lblConnectionStatus.Text = Resources.StrLblFM2014Connected;
// lblConnectionStatus.ForeColor = Color.Green;
// tbxFM2014ApplicationFwVersion.Text = Fm2014.FwVersion;
// tbxFM2014SerialNumber.Text = Fm2014.SerialNumber;
// // Logging to history window
// LogText("FM2014 ID: " + Fm2014.ConnectResponse);
// LogText("FM2014 Firmware Version: " + Fm2014.FwVersion);
// LogText($"FM2014 {Resources.StrLblFM2014SerialNumber} " + Fm2014.SerialNumber);
// LogText($"FW2014 {Resources.StrLblFM2014Address} " + Fm2014.Address);
// var dt = DateTime.UtcNow;
// var msg = $"{dt:yyyy-MM-dd HH:mm:ss} UTC";
// LogText($"{Resources.StrMsgPcDateTime} {msg}");
// LogText(StrSeparator);
// CheckUpdateEnabled();
// }));
// }
// }, _cancellationToken).ContinueWith(delegate
// {
// ActionControl(false);
// }, _cancellationToken);
//}
//catch (Exception ex)
//{
// ActionControl(false);
// MessageBox.Show(ex.Message, Resources.StrError, MessageBoxButtons.OK, MessageBoxIcon.Error);
// LogErrorText(ex.Message);
// Fm2014?.Dispose();
//}
// CheckUpdateEnabled();
// }));
//}
}, _cancellationToken).ContinueWith(delegate
{
ActionControl(false);
}, _cancellationToken);
}
catch (Exception ex)
{
ActionControl(false);
//MessageBox.Show(ex.Message, Resources.StrError, MessageBoxButtons.OK, MessageBoxIcon.Error);
LogErrorText(ex.Message);
//Fm2014?.Dispose();
}
}
#endregion BoardControls
@ -885,7 +902,7 @@ namespace Sensus.Ui.FM2014TestBench
private void btnConnect_Click(Object sender, EventArgs e)
{
_startTime = DateTimeOffset.UtcNow;
//Connect();
Connect();
}
/// <summary>
@ -1387,6 +1404,11 @@ namespace Sensus.Ui.FM2014TestBench
/// </remarks>
private void DataReceived_Handler(Object? sender, ProcessExecEventArgs e)
{
Int32 address = 0;
if (sender is FM2014 fm2014)
{
address = fm2014.Address;
}
// Progress info section
if (e.ActualProcessMessage != null)
{

View File

@ -8,45 +8,45 @@
<DockPanel Background="AliceBlue" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="0,0,0,0">
<Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="0,0,0,0">
<!-- Bordered Static Labels -->
<Border Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="Black" >
<Border Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="LightGray">
<Label Name="lblStatus" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,0,0,0" Content="OFFLINE" />
</Border>
<Border Grid.Row="8" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="Black" >
<Label Name="lblFirmwareVersion" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,0,0,0" Content="FW" />
<Border Grid.Row="8" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,-1,0,0" BorderThickness="1" BorderBrush="LightGray">
<Label Name="lblFirmwareVersion" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,0,0,0" Content="Firmware" />
</Border>
<Border Grid.Row="9" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="Black" >
<Label Name="lblSerialNumber" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,0,0,0" Content="#" />
<Border Grid.Row="9" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,-1,0,0" BorderThickness="1" BorderBrush="LightGray">
<Label Name="lblSerialNumber" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,0,0,0" Content="Serial No" />
</Border>
<Border Grid.Row="10" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="Black" >
<Label Name="lblLifetime_h" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,0,0,0" Content="?" />
<Border Grid.Row="10" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,-1,0,0" BorderThickness="1" BorderBrush="LightGray">
<Label Name="lblLifetime_h" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,0,0,0" Content="Lifetime" />
</Border>
<!-- Bordered Dynamic Labels -->
<Border x:Name="brdMeasurement1" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="Black" >
<Label Name="lblMeasurement1" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,0,0,0" Content="0" />
<Border x:Name="brdMeasurement1" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="LightGray" >
<Label Name="lblMeasurement1" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,-1,0,0" Content="0" />
</Border>
<Border x:Name="brdMeasurement2" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="Black" >
<Label Name="lblMeasurement2" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,0,0,0" Content="0" />
<Border x:Name="brdMeasurement2" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="LightGray" >
<Label Name="lblMeasurement2" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,-1,0,0" Content="0" />
</Border>
<Border x:Name="brdMeasurement3" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="Black" >
<Label Name="lblMeasurement3" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,0,0,0" Content="0" />
<Border x:Name="brdMeasurement3" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="LightGray" >
<Label Name="lblMeasurement3" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,-1,0,0" Content="0" />
</Border>
<Border x:Name="brdMeasurement4" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="Black" >
<Label Name="lblMeasurement4" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,0,0,0" Content="0" />
<Border x:Name="brdMeasurement4" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="LightGray" >
<Label Name="lblMeasurement4" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,-1,0,0" Content="0" />
</Border>
<Border x:Name="brdMeasurement5" Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="Black" >
<Label Name="lblMeasurement5" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,0,0,0" Content="0" />
<Border x:Name="brdMeasurement5" Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="LightGray" >
<Label Name="lblMeasurement5" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,-1,0,0" Content="0" />
</Border>
<Border x:Name="brdMeasurement6" Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="Black" >
<Label Name="lblMeasurement6" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,0,0,0" Content="0" />
<Border x:Name="brdMeasurement6" Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="LightGray" >
<Label Name="lblMeasurement6" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,-1,0,0" Content="0" />
</Border>
<Border x:Name="brdMeasurement7" Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="Black" >
<Label Name="lblMeasurement7" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,0,0,0" Content="0" />
<Border x:Name="brdMeasurement7" Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="LightGray" >
<Label Name="lblMeasurement7" HorizontalAlignment="Right" VerticalAlignment="Stretch" Margin="0,-1,0,0" Content="0" />
</Border>
<!-- Bordered Image -->
<Border x:Name="brdFM2014Pic" Grid.Row="1" Grid.RowSpan="7" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="Black" Visibility="Hidden">
<Image Name="picFM2014" HorizontalAlignment="Center" VerticalAlignment="Stretch" Margin="0,0,-1,-1" Source="/UserControls/FM2014 58x172.jpg" Stretch="Fill" />
<Border x:Name="brdFM2014Pic" Grid.Row="1" Grid.RowSpan="7" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0" BorderThickness="1" BorderBrush="LightGray" >
<Image Name="picFM2014" HorizontalAlignment="Center" VerticalAlignment="Stretch" Margin="0,0,-1,-1" Source="/UserControls/FM2014 58x172.jpg" Stretch="Fill" Opacity="0.5" />
</Border>
<!--Background Grid Design-->

View File

@ -30,9 +30,11 @@
*
*=======================================================================================\n
*/
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
using Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Consts;
using Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core;
using static Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Consts.FM2014CmdDef;
namespace Sensus.Ui.FM2014TestBench.UserControls
@ -43,25 +45,29 @@ namespace Sensus.Ui.FM2014TestBench.UserControls
public partial class UcFM2014Device : IUserControl
{
/// <summary>
/// Switches between picture or measurement fields
/// </summary>
private Boolean MeasurementIsActive { set; get; }
///// <summary>
///// Switches between picture or measurement fields
///// </summary>
//private Boolean MeasurementIsActive { set; get; }
private List<UIElement> MeasurementBorders;
private List<UIElement> MeasurementLabels;
private readonly List<UIElement> MeasurementBorders;
private readonly List<UIElement> MeasurementLabels;
private readonly FM2014 _fM2014;
/// <summary>
/// Ctor
/// </summary>
/// <param name="fm2014"></param>
/// <remarks date="2026-Feb-03" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
public UcFM2014Device()
public UcFM2014Device(FM2014 fm2014)
{
InitializeComponent();
MeasurementBorders = new List<UIElement>();
MeasurementLabels = new List<UIElement>();
_fM2014 = fm2014;
MeasurementBorders = [];
MeasurementLabels = [];
MeasurementBorders.Add(brdMeasurement1);
MeasurementBorders.Add(brdMeasurement2);
MeasurementBorders.Add(brdMeasurement3);
@ -83,9 +89,38 @@ namespace Sensus.Ui.FM2014TestBench.UserControls
public void Clear()
{
SetConnectionStatus(ConnectionStatusName.OFFLINE);
HideMeasurements();
}
/// <summary>
/// Set a value to a label
/// </summary>
/// <param name="labelNumber"></param>
/// <param name="valueStr"></param>
/// <returns></returns>
public Boolean SetValue(Int32 labelNumber, String valueStr)
{
var index = labelNumber - 1;
if (index < 0 || labelNumber > MeasurementLabels.Count ||
!MeasurementLabels[index].IsEnabled)
return false;
var label = (Label)MeasurementLabels[index];
UpdateValue(label, valueStr);
return true;
}
/// <summary>
/// Hide measurements and switch back to display the picture of FM2014
/// </summary>
/// <remarks date="2026-Feb-03" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
private void HideMeasurements()
{
UiElmEnable(brdFM2014Pic, true);
// Initially the device is NOT connected
UiElmEnable(picFM2014, false);
UiElmEnable(picFM2014, lblStatus.Content.Equals(ConnectionStatusName.ONLINE));
// Hide all measurement borders
foreach (var borders in MeasurementBorders)
{
@ -103,6 +138,9 @@ namespace Sensus.Ui.FM2014TestBench.UserControls
/// </summary>
/// <param name="numberOfMeasurementFields">1..7</param>
/// <returns></returns>
/// <remarks date="2026-Feb-03" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
public Boolean EnableMeasurements(UInt32 numberOfMeasurementFields)
{
// Check if device is connected and logged in
@ -110,6 +148,19 @@ namespace Sensus.Ui.FM2014TestBench.UserControls
numberOfMeasurementFields == 0)
return false;
//MeasurementIsActive = true;
// Hide the picture and the border of it
UiElmEnable(picFM2014, false, false);
UiElmEnable(brdFM2014Pic, false, false);
// Display the measurement fields
for (var ctr = 0; ctr < numberOfMeasurementFields; ctr++)
{
if (ctr > MeasurementBorders.Count)
break;
UiElmEnable(MeasurementBorders[ctr], true);
UiElmEnable(MeasurementLabels[ctr], true);
}
return true;
}
@ -117,6 +168,9 @@ namespace Sensus.Ui.FM2014TestBench.UserControls
/// Refresh connection status
/// </summary>
/// <param name="statusName"></param>
/// <remarks date="2026-Feb-03" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
public void SetConnectionStatus(ConnectionStatusName statusName)
{
var connectionStatusStr = GetConnectionStatusInfo(statusName);
@ -124,14 +178,63 @@ namespace Sensus.Ui.FM2014TestBench.UserControls
new Action(() =>
{
lblStatus.Content = connectionStatusStr;
var isEnabled = statusName.Equals(ConnectionStatusName.ONLINE);
UiElmEnable(picFM2014, isEnabled);
if (!statusName.Equals(ConnectionStatusName.ONLINE))
{
brdFM2014Pic.Visibility = Visibility.Visible;
picFM2014.Visibility = Visibility.Visible;
picFM2014.IsEnabled = false;
HideMeasurements();
}
else
{
lblLifetime_h.Content = _fM2014.Lifetime_h;
lblFirmwareVersion.Content = _fM2014.FwVersion;
lblSerialNumber.Content = _fM2014.SerialNumber;
}
}
));
));
}
/// <summary>
/// Output message to control without access violation.
/// </summary>
/// <returns></returns>
/// <remarks date="????" author="Roland Drabesch">
/// - Initial
/// </remarks>
/// <remarks date="2023-07-11" author="Thomas Wiedebusch">
/// - Introduced multi line text with center alignment.
/// </remarks>
private static void UpdateContentControl(ContentControl ctl, String text)
{
ctl.Dispatcher.Invoke(DispatcherPriority.Normal,
new Action(() =>
{
ctl.Content = new TextBlock()
{
Text = text,
TextWrapping = TextWrapping.Wrap,
TextAlignment = TextAlignment.Center
};
}
));
}
/// <summary>
/// Publish value to label
/// </summary>
/// <param name="label"></param>
/// <param name="valueStr"></param>
/// <remarks date="2026-Feb-03" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
private void UpdateValue(Label label, String valueStr)
{
Dispatcher.Invoke(DispatcherPriority.Normal,
new Action(() =>
{
label.Content = valueStr ;
}));
}
/// <summary>
@ -140,16 +243,15 @@ namespace Sensus.Ui.FM2014TestBench.UserControls
/// <param name="elm"></param>
/// <param name="isEnabled"></param>
/// <param name="isVisible"></param>
public void UiElmEnable(UIElement elm, Boolean isEnabled, Boolean isVisible = true)
private static void UiElmEnable(UIElement elm, Boolean isEnabled, Boolean isVisible = true)
{
elm.Dispatcher.Invoke(DispatcherPriority.Normal,
new Action(() =>
{
elm.Visibility = isVisible ? Visibility.Visible : Visibility.Hidden;
elm.IsEnabled = isEnabled;
elm.Opacity = isEnabled ? 1.0 : 0.2;
}));
}
}
}