406 lines
15 KiB
C#
406 lines
15 KiB
C#
using GenesisCordonelInterface.API;
|
|
using Newtonsoft.Json;
|
|
using NLog;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Windows.Forms;
|
|
using Xylem.Common.CommonCore.Consts;
|
|
using Xylem.Common.Hardware.Interfaces.Ports.PortCore;
|
|
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore;
|
|
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers;
|
|
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore;
|
|
using Xylem.Common.Utils.Logging;
|
|
|
|
namespace Xylem.Common.Ui.GenesisToolBox
|
|
{
|
|
public enum METROLOGYASST_PulseMode
|
|
{
|
|
OFF = 0, /* No pulse output */
|
|
FOR_REV_AB, /* Forward/reverse on A/B */
|
|
FOR_REV_BA, /* Forward/reverse on B/A */
|
|
PUL_DIR_AB, /* Pulse/direction on A/B */
|
|
PUL_DIR_BA, /* Pulse/direction on B/A */
|
|
PUL_BAL_A, /* Balanced pulse on A? */
|
|
PUL_BAL_B, /* Balanced pulse on B? */
|
|
TEST_PUL_DIR_AB, /* Test mode, pulse/direction on A/B */
|
|
};
|
|
|
|
public enum METROLOGYASST_PulseLength
|
|
{
|
|
L_1MS_NotSupported = 0, /* 1ms pulse <- not supported */
|
|
L_2MS_NotSupported, /* 2ms pulse <- not supported */
|
|
L_5MS, /* 5ms pulse */
|
|
L_10MS, /* 10ms pulse */
|
|
L_20MS, /* 20ms pulse */
|
|
L_50MS, /* 50ms pulse */
|
|
L_100MS_NotSupported, /* 100ms pulse <- not supported */
|
|
L_200MS, /* 200ms pulse */
|
|
L_500MS, /* 500ms pulse */
|
|
L_DYNAMIC, /* Dynamic pulse width */
|
|
L_1_5MS, /* 1.5ms pulse */
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public partial class FrmConfigurations : Form
|
|
{
|
|
private static readonly NLog.ILogger Logger = NLog.LogManager.GetLogger("GenesisCordonelInterface");
|
|
private readonly InterfaceToLaatzen interfaceToLaatzen = new InterfaceToLaatzen();
|
|
|
|
private GenesisMeter _currentGenesis;
|
|
private String _currentPcbId;
|
|
private MeterBatch _meterBatch = new MeterBatch();
|
|
|
|
public FrmConfigurations()
|
|
{
|
|
InitializeComponent();
|
|
|
|
cbxPulseLength.DataSource = Enum.GetValues(typeof(METROLOGYASST_PulseLength));
|
|
cbxPulseMode.DataSource = Enum.GetValues(typeof(METROLOGYASST_PulseMode));
|
|
_meterBatch = new MeterBatch();
|
|
|
|
var configfile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), nameof(Xylem.Common.Hardware.WaterMeter.Genesis), ProgramConfig.SerialConfigFileName);
|
|
|
|
if (!File.Exists(configfile))
|
|
{
|
|
throw new ApplicationException($"Configuration file {configfile} not found ");
|
|
}
|
|
var tr = new StreamReader(configfile);
|
|
var meterConfigList = JsonConvert.DeserializeObject<SlotConfig[]>(tr.ReadToEnd());
|
|
cbComSlot.Items.Clear();
|
|
var listSlots = new List<Int32>();
|
|
foreach (var item in meterConfigList)
|
|
{
|
|
cbComSlot.Items.Add(item.Slot);
|
|
listSlots.Add(item.Slot);
|
|
}
|
|
if (cbComSlot.Items.Count >= 1)
|
|
{
|
|
cbComSlot.SelectedItem = cbComSlot.Items[0];
|
|
}
|
|
|
|
//foreach (var info in typeof(Register).GetNestedTypes())
|
|
//{
|
|
// cbPreselection.Items.Add(info.Name);
|
|
//}
|
|
}
|
|
|
|
private void btnLogout_Click(Object sender, EventArgs e)
|
|
{
|
|
if (_currentGenesis != null && _currentGenesis.IsLoggedOn)
|
|
{
|
|
_currentGenesis.Logout();
|
|
}
|
|
|
|
_currentPcbId = "";
|
|
|
|
}
|
|
|
|
private void btnConnect_Click(Object sender, EventArgs e)
|
|
{
|
|
if (cbComSlot.SelectedItem != null) // && cbComSlot.SelectedValue is ListBoxItem)
|
|
{
|
|
Int32 slotNR = 0;
|
|
if (!string.IsNullOrEmpty(cbComSlot.SelectedItem.ToString()) &&
|
|
int.TryParse(cbComSlot.SelectedItem.ToString(), out slotNR))
|
|
{
|
|
conntect(slotNR);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void btnRead_Click(Object sender, EventArgs e)
|
|
{
|
|
if (_currentGenesis != null && _currentGenesis.IsLoggedOn)
|
|
{
|
|
Boolean TriggerTest = false;
|
|
Boolean PulseEvenDistributio = false;
|
|
Byte AdapterPresenceLimit;
|
|
Byte PulseSequence;
|
|
Int32 PulseLength;
|
|
Int32 PulseMode;
|
|
Byte PulseResolution = 0;
|
|
UInt32 PulseWeight;
|
|
|
|
|
|
TriggerTest = RegisterConverter.ByteArrayToValue<Boolean>(_currentGenesis.ReadRegister("GENESISFLOW_TriggerTest"));
|
|
|
|
try
|
|
{
|
|
PulseEvenDistributio = RegisterConverter.ByteArrayToValue<Boolean>(_currentGenesis.ReadRegister("METROLOGYASST_PulseEvenDistribution"));
|
|
PulseResolution = RegisterConverter.ByteArrayToValue<Byte>(_currentGenesis.ReadRegister("METROLOGYASST_PulseResolution"));
|
|
|
|
}
|
|
catch (Exception)
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
AdapterPresenceLimit = RegisterConverter.ByteArrayToValue<Byte>(_currentGenesis.ReadRegister("IRDA_AdapterPresenceLimit"));
|
|
PulseSequence = RegisterConverter.ByteArrayToValue<Byte>(_currentGenesis.ReadRegister("IRDA_PulseSequence"));
|
|
|
|
PulseLength = RegisterConverter.ByteArrayToValue<Int32>(_currentGenesis.ReadRegister("METROLOGYASST_PulseLength"));
|
|
|
|
PulseMode = RegisterConverter.ByteArrayToValue<Int32>(_currentGenesis.ReadRegister("METROLOGYASST_PulseMode"));
|
|
PulseWeight = RegisterConverter.ByteArrayToValue<UInt32>(_currentGenesis.ReadRegister("METROLOGYASST_PulseWeight"));
|
|
|
|
rbTestModeOn.Checked = false;
|
|
rbTestModeOff.Checked = true;
|
|
if (TriggerTest)
|
|
{
|
|
rbTestModeOff.Checked = false;
|
|
rbTestModeOn.Checked = true;
|
|
}
|
|
|
|
|
|
rbEvenDistOn.Checked = false;
|
|
rbEvenDistOff.Checked = true;
|
|
if (PulseEvenDistributio)
|
|
{
|
|
rbEvenDistOff.Checked = false;
|
|
rbEvenDistOn.Checked = true;
|
|
}
|
|
|
|
nudAdapterPresence.Value = AdapterPresenceLimit;
|
|
|
|
lblPulsesequence.Text = PulseSequence.ToString();
|
|
|
|
cbxPulseLength.SelectedItem = ((METROLOGYASST_PulseLength)PulseLength);
|
|
|
|
cbxPulseMode.SelectedItem = ((METROLOGYASST_PulseMode)PulseMode);
|
|
nudPulseResolution.Value = PulseResolution;
|
|
lblPulseWeightMl.Text = (PulseWeight * (Decimal)0.03125).ToString();
|
|
lblPulseWeightInternal.Text = PulseWeight.ToString();
|
|
cbPulseWiegth.SelectedText = getText(PulseWeight);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
private void btnWrite_Click(Object sender, EventArgs e)
|
|
{
|
|
if (_currentGenesis != null && _currentGenesis.IsLoggedOn)
|
|
{
|
|
Boolean TriggerTest = rbTestModeOn.Checked;
|
|
Boolean PulseEvenDistributio = rbEvenDistOn.Checked;
|
|
Byte AdapterPresenceLimit = (Byte)nudAdapterPresence.Value;
|
|
|
|
Int32 PulseLength = ((METROLOGYASST_PulseLength)cbxPulseLength.SelectedItem).GetHashCode();
|
|
Int32 PulseMode = ((METROLOGYASST_PulseMode)cbxPulseMode.SelectedItem).GetHashCode();
|
|
Byte PulseResolution = (Byte)nudPulseResolution.Value;
|
|
|
|
|
|
UInt32 PulseWeight = getValue(cbPulseWiegth.SelectedText);
|
|
|
|
actionResult = null;
|
|
|
|
|
|
|
|
try
|
|
{
|
|
setActionResult(_currentGenesis.WriteRegister("METROLOGYASST_PulseEvenDistribution", PulseEvenDistributio));
|
|
// setActionResult(_currentGenesis.WriteRegister("METROLOGYASST_PulseResolution", PulseResolution));
|
|
|
|
}
|
|
catch (Exception)
|
|
{
|
|
|
|
|
|
}
|
|
if (TriggerTest)
|
|
{
|
|
setActionResult(_currentGenesis.WriteRegister("GENESISFLOW_TriggerTest", 1));
|
|
}
|
|
else
|
|
{
|
|
setActionResult(_currentGenesis.WriteRegister("GENESISFLOW_TriggerActive", 1));
|
|
}
|
|
|
|
setActionResult(_currentGenesis.WriteRegister("IRDA_AdapterPresenceLimit", AdapterPresenceLimit));
|
|
setActionResult(_currentGenesis.WriteRegister("METROLOGYASST_PulseLength", PulseLength));
|
|
|
|
setActionResult(_currentGenesis.WriteRegister("METROLOGYASST_PulseMode", PulseMode));
|
|
setActionResult(_currentGenesis.WriteRegister("METROLOGYASST_PulseWeight", PulseWeight));
|
|
|
|
|
|
setActionResult(_currentGenesis.StoreAllConfigurations());
|
|
setActionResult(_currentGenesis.WriteRegister("SENSUSRADIO_SYSTEMSTATE", 0xFF, true, false));
|
|
|
|
|
|
}
|
|
}
|
|
|
|
private void tabPage1_Click(Object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
private void conntect(Int32 slotNR)
|
|
{
|
|
try
|
|
{
|
|
_meterBatch.RemoveAllMeters();
|
|
_currentGenesis = new GenesisMeter();
|
|
//_currentGenesis.IsDevelopmentUsage = true; //Make sure to set this before login
|
|
try
|
|
{
|
|
_currentGenesis.SetupFromConfigFile(slotNR);
|
|
_currentGenesis.EnableAutoLogon();
|
|
_meterBatch.AddMeter(_currentGenesis);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.Error(ex, $"Slot #{slotNR} failed: {ex.Message}");
|
|
}
|
|
_currentGenesis.Login();
|
|
_currentPcbId = _currentGenesis.PcbId;
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.Error(ex, ex.Message);
|
|
}
|
|
}
|
|
|
|
private void nudAdapterPresence_ValueChanged(Object sender, EventArgs e)
|
|
{
|
|
lblPrencesInMin.Text = (nudAdapterPresence.Value * 15).ToString();
|
|
}
|
|
|
|
private void nudPulseWeight_ValueChanged(Object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void btnDisplayDefault_Click(Object sender, EventArgs e)
|
|
{
|
|
|
|
if (_currentGenesis != null && _currentGenesis.IsLoggedOn)
|
|
{
|
|
actionResult = null;
|
|
setActionResult(_currentGenesis.WriteRegister("GENESISFLOW_SealDisplay", 0));
|
|
setActionResult(_currentGenesis.WriteRegister("CUSTOMER_Locale", 0));
|
|
setActionResult(_currentGenesis.WriteRegister("GENESISFLOW_DisplayPow10", 253));
|
|
setActionResult(_currentGenesis.WriteRegister("GENESISFLOW_DisplayUnits", 0));
|
|
setActionResult(_currentGenesis.WriteRegister("METROLOGYASST_FlowUnits", 1));
|
|
setActionResult(_currentGenesis.StoreAllConfigurations());
|
|
setActionResult(_currentGenesis.WriteRegister("SENSUSRADIO_SYSTEMSTATE", 0xFF, true, false));
|
|
}
|
|
}
|
|
|
|
private void setActionResult(Boolean v)
|
|
{
|
|
if (!actionResult.HasValue)
|
|
{
|
|
actionResult = v;
|
|
}
|
|
if (!v)
|
|
{
|
|
actionResult = false;
|
|
}
|
|
|
|
}
|
|
|
|
private Boolean? actionResult = null;
|
|
|
|
private void FrmConfigurations_FormClosing(Object sender, FormClosingEventArgs e)
|
|
{
|
|
_meterBatch.Dispose();
|
|
}
|
|
|
|
private void cbPulseWiegth_SelectedIndexChanged(Object sender, EventArgs e)
|
|
{
|
|
var PInternal = getValue(cbPulseWiegth.SelectedItem.ToString().Trim());
|
|
lblPulseWeightMl.Text = (PInternal * (Decimal)0.03125).ToString();
|
|
lblPulseWeightInternal.Text = (PInternal).ToString();
|
|
|
|
var PulseFQm3 = (PInternal * (Decimal)0.03125);
|
|
lblP2000PulseSetup.Text = (1000000 / PulseFQm3).ToString();
|
|
|
|
}
|
|
private String getText(UInt32 v)
|
|
{
|
|
|
|
String intHelper = "NA";
|
|
switch (v)
|
|
{
|
|
|
|
case 0x00007D00: intHelper = "1 l/Imp."; break;
|
|
case 0x0004E200: intHelper = "10 l/Imp."; break;
|
|
case 0x0030D400: intHelper = "100 l/Imp."; break;
|
|
case 0x01E84800: intHelper = "1.000 l/Imp."; break;
|
|
case 0x0001D92D: intHelper = "1 Gallons/Imp."; break;
|
|
case 0x00127BC3: intHelper = "10 Gallons/Imp."; break;
|
|
case 0x00B8D5A0: intHelper = "100 Gallons/Imp."; break;
|
|
case 0x07382500: intHelper = "1.000 Gallons/Imp."; break;
|
|
case 0x000DD399: intHelper = "1 Cub. Feet/Imp."; break;
|
|
case 0x008A4400: intHelper = "10 Cub. Feet/Imp."; break;
|
|
case 0x0566D000: intHelper = "100 Cub. Feet/Imp."; break;
|
|
case 0x36042000: intHelper = "1.000 Cub. Feet/Imp."; break;
|
|
case 0x004DA169: intHelper = "1 Barrel/Imp."; break;
|
|
case 0x03084E1E: intHelper = "10 Barrels/Imp."; break;
|
|
case 0x1E530D2F: intHelper = "100 Barrels/Imp."; break;
|
|
case 0xFFF0279D: intHelper = "1.000 Barrels/Imp."; break;
|
|
case 0x00000000: intHelper = "ohne"; break;
|
|
|
|
|
|
default: intHelper = "ohne"; break;
|
|
}
|
|
return intHelper;
|
|
|
|
}
|
|
private UInt32 getValue(String v)
|
|
{
|
|
|
|
UInt32 intHelper = 0;
|
|
switch (v.Replace(" ", ""))
|
|
{
|
|
case "1l/Imp.": intHelper = 0x00007D00; break;
|
|
case "10l/Imp.": intHelper = 0x0004E200; break;
|
|
case "100l/Imp.": intHelper = 0x0030D400; break;
|
|
case "1.000l/Imp.": intHelper = 0x01E84800; break;
|
|
case "1Gallons/Imp.": intHelper = 0x0001D92D; break;
|
|
case "10Gallons/Imp.": intHelper = 0x00127BC3; break;
|
|
case "100Gallons/Imp.": intHelper = 0x00B8D5A0; break;
|
|
case "1.000Gallons/Imp.": intHelper = 0x07382500; break;
|
|
case "1Cub.Feet/Imp.": intHelper = 0x000DD399; break;
|
|
case "10Cub.Feet/Imp.": intHelper = 0x008A4400; break;
|
|
case "100Cub.Feet/Imp.": intHelper = 0x0566D000; break;
|
|
case "1.000Cub.Feet/Imp.": intHelper = 0x36042000; break;
|
|
case "1Barrel/Imp.": intHelper = 0x004DA169; break;
|
|
case "10Barrels/Imp.": intHelper = 0x03084E1E; break;
|
|
case "100Barrels/Imp.": intHelper = 0x1E530D2F; break;
|
|
case "1.000Barrels/Imp.": intHelper = 0xFFF0279D; break;
|
|
case "ohne": intHelper = 0; break;
|
|
|
|
|
|
default: intHelper = 0; break;
|
|
}
|
|
return intHelper;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|