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.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.ConvertTo(_currentGenesis.ReadRegister("GENESISFLOW_TriggerTest")); try { PulseEvenDistributio = RegisterConverter.ConvertTo(_currentGenesis.ReadRegister("METROLOGYASST_PulseEvenDistribution")); PulseResolution = RegisterConverter.ConvertTo(_currentGenesis.ReadRegister("METROLOGYASST_PulseResolution")); } catch (Exception) { } AdapterPresenceLimit = RegisterConverter.ConvertTo(_currentGenesis.ReadRegister("IRDA_AdapterPresenceLimit")); PulseSequence = RegisterConverter.ConvertTo(_currentGenesis.ReadRegister("IRDA_PulseSequence")); PulseLength = RegisterConverter.ConvertTo(_currentGenesis.ReadRegister("METROLOGYASST_PulseLength")); PulseMode = RegisterConverter.ConvertTo(_currentGenesis.ReadRegister("METROLOGYASST_PulseMode")); PulseWeight = RegisterConverter.ConvertTo(_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; nudPulseWeight.Value = PulseWeight * (Decimal)0.03125; } } 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 = (UInt32)(nudPulseWeight.Value / (Decimal)0.03125); 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.StoreAllApps()); 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) { lblPulseWeightInternal.Text = (nudPulseWeight.Value / (Decimal)0.03125).ToString(); } 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", 208)); setActionResult(_currentGenesis.WriteRegister("GENESISFLOW_DisplayPow10", 253)); setActionResult(_currentGenesis.WriteRegister("GENESISFLOW_DisplayUnits", 0)); setActionResult(_currentGenesis.WriteRegister("METROLOGYASST_FlowUnits", 4)); setActionResult(_currentGenesis.StoreAllApps()); 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(); } } }