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.GenesisConfig; 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 GenesisMeter _currentGenesis; private String _currentPcbId; private MeterBatch _meterBatch = new MeterBatch(); private readonly ILogger logger = NLogHelper.CreateOrGetLogger("GenesisConfigurator"); 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(tr.ReadToEnd()); cbComSlot.Items.Clear(); var listSlots = new List(); 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(_currentGenesis.ReadRegister("GENESISFLOW_TriggerTest")); try { PulseEvenDistributio = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister("METROLOGYASST_PulseEvenDistribution")); PulseResolution = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister("METROLOGYASST_PulseResolution")); } catch (Exception) { } AdapterPresenceLimit = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister("IRDA_AdapterPresenceLimit")); PulseSequence = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister("IRDA_PulseSequence")); PulseLength = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister("METROLOGYASST_PulseLength")); PulseMode = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister("METROLOGYASST_PulseMode")); PulseWeight = RegisterConverter.ByteArrayToValue(_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; } } }