diff --git a/.gitignore b/.gitignore index 7b3343068..8104bbca0 100644 --- a/.gitignore +++ b/.gitignore @@ -94,3 +94,9 @@ TBF.sln.DotSettings.user /ExternalProjects /GenesisCordonelTester /packages +/GenesisCordonelInterface/bin/Debug/GenesisCordonelInterfaceLogger.log +/GenesisCordonelInterface/bin/Debug/GenesisCordonelTesterLogger.log +/GenesisCordonelInterface/bin/Debug/SirtConfig.json +/GenesisCordonelInterface/bin/Release +/GenesisCordonelInterface/obj/Debug +/GenesisCordonelInterface/obj/Release diff --git a/GenesisCordonelInterface/API/InterfaceGCIToLaatzen.cs b/GenesisCordonelInterface/API/InterfaceGCIToLaatzen.cs new file mode 100644 index 000000000..36b702bac --- /dev/null +++ b/GenesisCordonelInterface/API/InterfaceGCIToLaatzen.cs @@ -0,0 +1,1055 @@ +using Logic.ProductionToProductMapper.Cordonel; +using Newtonsoft.Json; +using NLog; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Reflection; +using System.Security.Policy; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using Xylem.Common.CommonCore.Configuration; +using Xylem.Common.CommonCore.Consts; +using Xylem.Common.Hardware.Interfaces.Ports.PortCore; +using Xylem.Common.Hardware.WaterMeter.Genesis.Applications.Const; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.Consts; +using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; +using Xylem.Common.Hardware.WaterMeter.Genesis.Registers.DataTypes; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; +using Xylem.Common.Logic.ProductionOrderCore.TestResults; +using Xylem.Common.Logic.SoftwareAccessHelper; +using Xylem.Common.Utils.Logging; +using static Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.GenesisMeter; +using Access = Xylem.Common.Hardware.WaterMeter.Genesis.Registers.Access; +using Register = Xylem.Common.Hardware.WaterMeter.Genesis.Registers.Register; + +namespace GenesisCordonelInterface.API +{ + /// + /// Provides a public API for Genesis meter operations. + /// + /// This class exposes reusable functionality extracted from the original UI code + /// so it can be used from other projects within the solution. + /// + /// The API is intended to gradually consolidate meter-related operations such as: + /// - port detection + /// - PCB ID reading + /// - communication setup + /// - requests and commands + /// - additional service actions + /// + /// + /// This class should contain business logic only and should not depend on UI elements + /// such as forms, controls, MessageBox, or DataGridView. + /// + /// UI-specific code should remain outside this class and call this API instead. + /// + /// + /// + /// var api = new Api2(); + /// + /// var request = api.DetectRequestPort(3); + /// if (request.Success) + /// { + /// Console.WriteLine($"PCB ID: {request.PcbId}"); + /// } + /// + /// var streaming = api.DetectStreamingPort(3); + /// if (streaming.Success) + /// { + /// Console.WriteLine($"Streaming port: {streaming.PortName}"); + /// } + /// + /// + public class InterfaceGCIToLaatzen + { + #region Declaration region + private static readonly Lazy Logger = new Lazy(() => NLogHelper.CreateOrGetLogger("GenesisCordonelInterface")); + + public class regStore + { + public String PcbId; + public DateTimeOffset created; + public List keyValues; + } + + public class regDefValue + { + public RegisterDefinition def; + public String value; + } + + private GenesisMeter _currentGenesis; + private MeterBatch _meterBatch = new MeterBatch(); + private regStore _regsToStore; + private String _currentPcbId = ""; + + private Boolean IsBusy + { + get; + set; + } + + /// + /// Gets a value indicating whether the meter is connected and logged on. + /// + public bool IsConnected + { + get + { + return _currentGenesis != null && _currentGenesis.IsLoggedOn; + } + } + #endregion + + #region API - Port Detection region(extracted from FrmSetup:DgvConfig_CellContentClick) + + public class PortDetectionResult + { + /// + /// Indicates whether the detection was successful. + /// + public bool Success { get; set; } + + /// + /// Slot number used for the detection. + /// + public int Slot { get; set; } + + /// + /// Name of the detected communication port. + /// + public string PortName { get; set; } + + /// + /// PCB ID read from the device (available for request detection). + /// + public string PcbId { get; set; } + + /// + /// Error message describing why detection failed (if not successful). + /// + public string ErrorMessage { get; set; } + } + + /// + /// Slot number. + /// + /// Result containing success status and detected port name. + /// + /// + /// + /// var api = new Api2(); + /// var result = api.DetectStreamingPort(3); + /// + /// if (result.Success) + /// { + /// Console.WriteLine($"Port: {result.PortName}"); + /// } + /// else + /// { + /// Console.WriteLine("Streaming detection failed"); + /// } + /// + /// + public PortDetectionResult DetectStreamingPort(int slot) + { + if (slot <= 0) + throw new ArgumentOutOfRangeException(nameof(slot)); + + using (var mb = new MeterBatch()) + using (var meter = new GenesisMeter()) + { + //meter.SetupFromConfigFile(slot, false); + mb.AddMeter(meter); + + var rawData = new ConcurrentBag(); + + meter.StreamingPort.OnRawRecordReceived += (o, rawMsg) => + { + var data = (string)rawMsg.GetData(); + rawData.Add(data); + }; + + Thread.Sleep(500); + + var success = rawData.Any(); + var portName = meter.StreamingPort.GetPortName(); + + return new PortDetectionResult + { + Success = success, + Slot = slot, + PortName = portName, + ErrorMessage = success ? null : "No streaming data received." + }; + } + } + + /// + /// Detects the request port by attempting to read the PCB ID. + /// + /// Slot number. + /// + /// Result containing success status, port name, and PCB ID if successful. + /// + /// + /// + /// var api = new Api2(); + /// var result = api.DetectRequestPort(3); + /// + /// if (result.Success) + /// { + /// Console.WriteLine($"PCB ID: {result.PcbId}"); + /// } + /// else + /// { + /// Console.WriteLine("Detection failed"); + /// } + /// + /// + public PortDetectionResult DetectRequestPort(int slot) + { + if (slot <= 0) + throw new ArgumentOutOfRangeException(nameof(slot)); + + using (var mb = new MeterBatch()) + using (var meter = new GenesisMeter()) + { + //meter.SetupFromConfigFile(slot, false); + mb.AddMeter(meter); + + meter.Logout(); + + var pcbId = meter.GetPcbId(); + var success = !string.IsNullOrEmpty(pcbId); + var portName = meter.RequestPort.GetPortName(); + + return new PortDetectionResult + { + Success = success, + Slot = slot, + PortName = portName, + PcbId = pcbId, + ErrorMessage = success ? null : "PCB ID was empty." + }; + } + } + #endregion + + #region API - PCB ID region + + /// + /// Reads PCB ID for the specified slot. + /// + /// Slot number. + /// PCB ID read from the meter. + /// + /// + /// var api = new Api2(); + /// string pcbId = api.GetPcbId(3); + /// Console.WriteLine(pcbId); + /// + /// + public string GetPcbId(int slot) + { + if (slot <= 0) + throw new ArgumentOutOfRangeException(nameof(slot), "Slot number must be greater than zero."); + + using (var mb = new MeterBatch()) + using (var meter = new GenesisMeter()) + { + meter.SetupFromConfigFile(slot, false); + mb.AddMeter(meter); + + meter.Logout(); + + return meter.GetPcbId(); + } + } + + #endregion + + #region Password and Login + /// + /// Sets meter password. + /// + public bool SetMeterPassword(string password) + { + EnsureConnected(); + + if (string.IsNullOrWhiteSpace(password)) + throw new ArgumentException("Password cannot be null or empty.", nameof(password)); + + try + { + // Replace this with the real Genesis API call if available. + // Example: + // return _currentGenesis.SetMeterPassword(password); + + var result = WriteRegister("SECURITY_Password", password, true, true); + return result.Success; + } + catch (Exception ex) + { + Logger.Value.Error(ex, "SetMeterPassword failed."); + return false; + } + } + + /// + /// Performs login using provided password. + /// + public bool Login(string password) + { + if (_currentGenesis == null) + throw new InvalidOperationException("Genesis meter is not initialized. Call Connect first."); + + if (string.IsNullOrWhiteSpace(password)) + throw new ArgumentException("Password cannot be null or empty.", nameof(password)); + + try + { + // IMPORTANT: + // Replace with actual Genesis API method if available + + // Variant A – direct login method (preferred) + // return _currentGenesis.Login(password); + + // Variant B – if password must be set first + // _currentGenesis.Password = password; + // return _currentGenesis.Login(); + + // TEMP fallback (if no direct method known) + bool result = _currentGenesis.Login(); + + if (!result) + Logger.Value.Warn("Login failed."); + + return result; + } + catch (Exception ex) + { + Logger.Value.Error(ex, "Login failed."); + return false; + } + } + #endregion + + #region API - Connect + + public class InitResult + { + public bool Success { get; set; } + public int Slot { get; set; } + public string ErrorMessage { get; set; } + public string InterfaceVersion { get; set; } + public bool InterfaceSupportsFwVersion { get; set; } + } + + /// + /// Represents the result of a connect operation. + /// + public class ConnectResult + { + /// + /// Indicates whether the connect operation was successful. + /// + public bool Success { get; set; } + + /// + /// Slot number used for connect. + /// + public int Slot { get; set; } + + /// + /// Connected PCB ID. + /// + public string PcbId { get; set; } + + /// + /// Indicates whether the meter is logged on. + /// + public bool IsLoggedOn { get; set; } + + /// + /// Firmware version reported by the meter. + /// + public string FwVersion { get; set; } + + /// + /// Interface version from configuration. + /// + public string InterfaceVersion { get; set; } + + /// + /// Indicates whether the loaded configuration supports the detected firmware version. + /// + public bool InterfaceSupportsFwVersion { get; set; } + + /// + /// Registers available after successful connect. + /// + public List Registers { get; set; } = new List(); + + /// + /// Error message if connect failed. + /// + public string ErrorMessage { get; set; } + } + + /// + /// Represents one register returned after connect. + /// + public class RegisterSnapshot + { + public string Name { get; set; } + public string Type { get; set; } + public string RawValue { get; set; } + public string Min { get; set; } + public string Max { get; set; } + public string Description { get; set; } + public string Version { get; set; } + public string IsAvailable { get; set; } + public string Privilege { get; set; } + } + + + + public InitResult InitOneMeterFromExtern(Int32 slotNo, ConfigSource useConfigSource, PasswordSource usePasswordSource, PortConfig? requestPort, PortConfig? streamingPort) + { + try + { + if (slotNo <= 0) + throw new ArgumentOutOfRangeException(nameof(slotNo), "Slot number must be greater than zero."); + + //_meterBatch.RemoveMeter(slotNo); + _currentGenesis?.DisposeMeter(); + + _currentGenesis = new GenesisMeter(); + _currentGenesis.UseOfflinePasswords = usePasswordSource == PasswordSource.OfflineFile; + _currentGenesis.usePasswordSource = usePasswordSource; + _currentGenesis.useConfigSource = useConfigSource; + + _currentGenesis.SetupFromExternConfig( + slotNo, + requestPort, + streamingPort, + true); + + _meterBatch.AddMeter(_currentGenesis); + + return new InitResult + { + Success = true, + Slot = slotNo, + InterfaceVersion = _currentGenesis.InterfaceInfo?.InterfaceVersion, + InterfaceSupportsFwVersion = _currentGenesis.InterfaceSupportsFwVersion + }; + } + catch (Exception ex) + { + //_meterBatch.RemoveAllMeters(); + _currentGenesis?.DisposeMeter(); + _currentGenesis = null; + + return new InitResult + { + Success = false, + Slot = slotNo, + ErrorMessage = ex.Message + }; + } + } + + /// + /// Connects to a Genesis meter for the specified slot. + /// + /// Slot number. + /// Specifies whether offline passwords should be used. + /// + /// Connect operation result including PCB ID, firmware/configuration info, and register snapshots. + /// + /// + /// + /// var api = new GenesisAPI(); + /// var result = api.Connect(3, true); + /// + /// if (result.Success) + /// { + /// Console.WriteLine(result.PcbId); + /// Console.WriteLine(result.InterfaceVersion); + /// } + /// else + /// { + /// Console.WriteLine(result.ErrorMessage); + /// } + /// + /// + public ConnectResult ConnectOneMeter(int slotNo) + { + try + { + // Validate input + if (slotNo <= 0) + throw new ArgumentOutOfRangeException(nameof(slotNo), "Slot number must be greater than zero."); + + // Find meter in batch by slot + var meter = _meterBatch.ListOfMeters + .OfType() + .FirstOrDefault(m => m.Slot == slotNo); + + // Meter not initialized + if (meter == null) + { + return new ConnectResult + { + Success = false, + Slot = slotNo, + ErrorMessage = $"Meter for slot {slotNo} not found in batch." + }; + } + + // Set current working meter + _currentGenesis = meter; + + // Perform login for meters in batch + _meterBatch.MetersLogin(); + + // Validate connection result + if (!_currentGenesis.IsLoggedOn && string.IsNullOrEmpty(_currentGenesis.PcbId)) + { + return new ConnectResult + { + Success = false, + Slot = slotNo, + IsLoggedOn = false, + PcbId = _currentGenesis.PcbId, + ErrorMessage = "Cannot read out PcbId. Access to Cordonel denied." + }; + } + + // Build successful result + var result = new ConnectResult + { + Success = _currentGenesis.IsLoggedOn, + Slot = slotNo, + PcbId = _currentGenesis.PcbId, + IsLoggedOn = _currentGenesis.IsLoggedOn, + FwVersion = _currentGenesis.FwVersion, + InterfaceVersion = _currentGenesis.InterfaceInfo?.InterfaceVersion, + InterfaceSupportsFwVersion = _currentGenesis.InterfaceSupportsFwVersion + }; + + return result; + } + catch (Exception ex) + { + // Return failure result on exception + return new ConnectResult + { + Success = false, + Slot = slotNo, + ErrorMessage = ex.Message + }; + } + } + + /// + /// Connects to a Genesis meter for the specified slot. + /// + /// Slot number. + /// Specifies whether offline passwords should be used. + /// + /// Connect operation result including PCB ID, firmware/configuration info, and register snapshots. + /// + /// + /// + /// var api = new GenesisAPI(); + /// var result = api.Connect(3, true); + /// + /// if (result.Success) + /// { + /// Console.WriteLine(result.PcbId); + /// Console.WriteLine(result.InterfaceVersion); + /// } + /// else + /// { + /// Console.WriteLine(result.ErrorMessage); + /// } + /// + /// + public ConnectResult ConnectAllMeters(int slotNo) + { + /*try + { + if (slotNo <= 0) + throw new ArgumentOutOfRangeException(nameof(slotNo), "Slot number must be greater than zero."); + + _currentGenesis?.DisposeMeter(); + _meterBatch.RemoveAllMeters(); + _currentGenesis = null; + + _currentGenesis = new GenesisMeter(); + _currentGenesis.UseOfflinePasswords = usePasswordSource == PasswordSource.OfflineFile; + _currentGenesis.usePasswordSource = usePasswordSource; + _currentGenesis.useConfigSource = useConfigSource; + _currentGenesis.SetupFromConfigFile(slotNo);//...MF + _currentGenesis.SetupFromExternConfig(slotNo); + _meterBatch.AddMeter(_currentGenesis); + + _meterBatch.MetersLogin(); + + if (!_currentGenesis.IsLoggedOn && string.IsNullOrEmpty(_currentGenesis.PcbId)) + { + return new ConnectResult + { + Success = false, + Slot = slotNo, + IsLoggedOn = false, + PcbId = _currentGenesis.PcbId, + ErrorMessage = "Cannot read out PcbId. Access to Cordonel denied." + }; + } + + var result = new ConnectResult + { + Success = _currentGenesis.IsLoggedOn, + Slot = slotNo, + PcbId = _currentGenesis.PcbId, + IsLoggedOn = _currentGenesis.IsLoggedOn, + FwVersion = _currentGenesis.FwVersion, + InterfaceVersion = _currentGenesis.InterfaceInfo?.InterfaceVersion, + InterfaceSupportsFwVersion = _currentGenesis.InterfaceSupportsFwVersion + }; + + foreach (var item in _currentGenesis.GetRegistersDic()) + { + var from = item.Key.RegisterDetail.Version.First.HasValue + ? item.Key.RegisterDetail.Version.First.Value.ToString() + : "-"; + + var to = item.Key.RegisterDetail.Version.Last.HasValue + ? item.Key.RegisterDetail.Version.Last.Value.ToString() + : "-"; + + result.Registers.Add(new RegisterSnapshot + { + Name = item.Key.GetIdent(), + Type = item.Key.DataType.Name, + RawValue = BitConverter.ToString(item.Value).Replace("-", " "), + Min = item.Key.Minimum?.ToString(), + Max = item.Key.Maximum?.ToString(), + Description = item.Key.RegisterDetail.Description, + Version = $"from {from} to {to}", + IsAvailable = item.Key.IsAvailable.ToString(), + Privilege = item.Key.RegisterDetail.Privilege.Lvl8.ToString() + }); + } + + return result; + } + catch (Exception ex) + { + _meterBatch.RemoveAllMeters(); + _currentGenesis?.DisposeMeter(); + + return new ConnectResult + { + Success = false, + Slot = slotNo, + ErrorMessage = ex.Message + }; + }*/ + return null; + } + + #endregion + + #region Meter Registers + /// + /// Result of a register read operation. + /// + public class RegisterReadResult + { + /// + /// Indicates whether the read operation was successful. + /// + public bool Success { get; set; } + + /// + /// Name of the register. + /// + public string RegisterName { get; set; } + + /// + /// Raw bytes returned from the device. + /// + public byte[] RawBytes { get; set; } + + /// + /// Raw value formatted as hexadecimal string. + /// + public string RawHex { get; set; } + + /// + /// Converted value based on register data type (if possible). + /// + public object TypedValue { get; set; } + + /// + /// String representation of the converted value. + /// + public string TypedValueText { get; set; } + + /// + /// Data type of the register. + /// + public string DataType { get; set; } + + /// + /// Error message if operation failed. + /// + public string ErrorMessage { get; set; } + } + + /// + /// Result of a register write operation. + /// + public class RegisterWriteResult + { + /// + /// Indicates whether the write operation was successful. + /// + public bool Success { get; set; } + + /// + /// Name of the register. + /// + public string RegisterName { get; set; } + + /// + /// Value that was written to the register. + /// + public object WrittenValue { get; set; } + + /// + /// Indicates whether configuration was stored to the device. + /// + public bool StoreToDevice { get; set; } + + /// + /// Indicates whether system state refresh was triggered. + /// + public bool RefreshSystemState { get; set; } + + /// + /// Error message if operation failed. + /// + public string ErrorMessage { get; set; } + } + + //Helper methods + + /// + /// Ensures that the meter is connected and logged on. + /// + private void EnsureConnected() + { + if (_currentGenesis == null) + throw new InvalidOperationException("Genesis meter is not initialized. Call Connect first."); + + if (!_currentGenesis.IsLoggedOn) + throw new InvalidOperationException("Genesis meter is not logged on. Call Connect first."); + } + + /// + /// Finds register definition by name. + /// + private RegisterDefinition FindRegisterDefinition(string registerName) + { + if (string.IsNullOrWhiteSpace(registerName)) + throw new ArgumentException("Register name cannot be null or empty.", nameof(registerName)); + + var match = _currentGenesis + .GetRegistersDic() + .Keys + .FirstOrDefault(r => string.Equals(r.GetIdent(), registerName, StringComparison.OrdinalIgnoreCase)); + + if (match == null) + throw new KeyNotFoundException($"Register '{registerName}' was not found."); + + return match; + } + + /// + /// Converts byte array to hex string. + /// + private string ToHex(byte[] data) + { + if (data == null || data.Length == 0) + return string.Empty; + + return BitConverter.ToString(data).Replace("-", " "); + } + + //Read register + /// + /// Reads register value by register name. + /// + public RegisterReadResult ReadRegister(string registerName) + { + try + { + EnsureConnected(); + + var register = FindRegisterDefinition(registerName); + var raw = _currentGenesis.ReadRegister(registerName); + + object typedValue = null; + string typedValueText = null; + + try + { + typedValue = ConvertRegisterValue(register, raw); + typedValueText = typedValue?.ToString(); + } + catch + { + // Ignore conversion errors, raw value is still valid + } + + return new RegisterReadResult + { + Success = true, + RegisterName = registerName, + RawBytes = raw, + RawHex = ToHex(raw), + TypedValue = typedValue, + TypedValueText = typedValueText, + DataType = register.DataType?.Name + }; + } + catch (Exception ex) + { + Logger.Value.Error(ex, $"ReadRegister failed for '{registerName}'."); + + return new RegisterReadResult + { + Success = false, + RegisterName = registerName, + ErrorMessage = ex.Message + }; + } + } + + //Typed conversion + /// + /// Converts raw register value to a typed value based on register definition. + /// + private object ConvertRegisterValue(RegisterDefinition register, byte[] raw) + { + var typeName = register.DataType?.Name; + + switch (typeName) + { + case "Boolean": + return RegisterConverter.ByteArrayToValue(raw); + + case "Byte": + return RegisterConverter.ByteArrayToValue(raw); + + case "Int32": + return RegisterConverter.ByteArrayToValue(raw); + + case "UInt32": + return RegisterConverter.ByteArrayToValue(raw); + + case "Double": + return RegisterConverter.ByteArrayToValue(raw); + + case "Single": + return RegisterConverter.ByteArrayToValue(raw); + + case "String": + return Encoding.ASCII.GetString(raw).TrimEnd('\0'); + + default: + return ToHex(raw); + } + } + + //Generic login + + /// + /// Reads register and converts it directly to specified type. + /// + public T ReadRegisterValue(string registerName) + { + EnsureConnected(); + + var raw = _currentGenesis.ReadRegister(registerName); + return RegisterConverter.ByteArrayToValue(raw); + } + + //Write register + /// + /// Writes value to register. + /// + public RegisterWriteResult WriteRegister( + string registerName, + object value, + bool storeToDevice = false, + bool refreshSystemState = false) + { + try + { + EnsureConnected(); + + bool writeOk = _currentGenesis.WriteRegister(registerName, value); + + if (!writeOk) + { + return new RegisterWriteResult + { + Success = false, + RegisterName = registerName, + WrittenValue = value, + ErrorMessage = "Write operation failed." + }; + } + + if (storeToDevice) + { + if (!_currentGenesis.StoreAllConfigurations()) + { + return new RegisterWriteResult + { + Success = false, + RegisterName = registerName, + WrittenValue = value, + ErrorMessage = "StoreAllConfigurations failed." + }; + } + } + + if (refreshSystemState) + { + if (!_currentGenesis.WriteRegister("SENSUSRADIO_SYSTEMSTATE", 0xFF, true, false)) + { + return new RegisterWriteResult + { + Success = false, + RegisterName = registerName, + WrittenValue = value, + ErrorMessage = "System state refresh failed." + }; + } + } + + return new RegisterWriteResult + { + Success = true, + RegisterName = registerName, + WrittenValue = value, + StoreToDevice = storeToDevice, + RefreshSystemState = refreshSystemState + }; + } + catch (Exception ex) + { + Logger.Value.Error(ex, $"WriteRegister failed for '{registerName}'."); + + return new RegisterWriteResult + { + Success = false, + RegisterName = registerName, + WrittenValue = value, + ErrorMessage = ex.Message + }; + } + } + + //Bulk operations + + /// + /// Reads multiple registers. + /// + public List ReadRegisters(IEnumerable registerNames) + { + var result = new List(); + + foreach (var name in registerNames) + { + result.Add(ReadRegister(name)); + } + + return result; + } + + /// + /// Writes multiple registers. + /// + public List WriteRegisters( + Dictionary registerValues, + bool storeToDevice = false, + bool refreshSystemState = false) + { + var results = new List(); + + int index = 0; + int total = registerValues.Count; + + foreach (var pair in registerValues) + { + bool doStore = storeToDevice && index == total - 1; + bool doRefresh = refreshSystemState && index == total - 1; + + results.Add(WriteRegister(pair.Key, pair.Value, doStore, doRefresh)); + index++; + } + + return results; + } + + //Disconnect + + /// + /// Disconnects from the meter and releases resources. + /// + public void Disconnect() + { + try + { + if (_currentGenesis != null && _currentGenesis.IsLoggedOn) + { + _currentGenesis.Logout(); + } + } + catch (Exception ex) + { + Logger.Value.Error(ex, "Disconnect failed."); + } + finally + { + _meterBatch.RemoveAllMeters(); + _currentGenesis?.DisposeMeter(); + _currentGenesis = null; + _currentPcbId = string.Empty; + } + } + + #endregion + + } +} diff --git a/GenesisCordonelInterface/API/InterfaceOutsideToGCI.cs b/GenesisCordonelInterface/API/InterfaceOutsideToGCI.cs new file mode 100644 index 000000000..a1d948462 --- /dev/null +++ b/GenesisCordonelInterface/API/InterfaceOutsideToGCI.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using Xylem.Common.Hardware.Interfaces.Ports.PortCore; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; +using static Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.GenesisMeter; + +namespace GenesisCordonelInterface.API +{ + /// + /// Outside-facing facade for Genesis Cordonel Interface. + /// Exposes only selected operations intended for external callers. + /// + public class InterfaceOutsideToGCI + { + private readonly InterfaceGCIToLaatzen _innerMeterAPI; + + /// + /// Initializes a new instance of the class. + /// + public InterfaceOutsideToGCI() + { + _innerMeterAPI = new InterfaceGCIToLaatzen(); + } + + /// + /// Gets a value indicating whether the meter is currently connected and logged on. + /// + public bool IsConnected + { + get + { + return _innerMeterAPI.IsConnected; + } + } + + /// + /// Connects to the meter on the specified slot. + /// + /// Slot number. + /// Specifies whether offline passwords should be used. + /// Connect operation result. + public InterfaceGCIToLaatzen.InitResult InitOneMeterFromExtern(Int32 slotNo, ConfigSource useConfigSource, PasswordSource usePasswordSource, PortConfig? requestPort, PortConfig? streamingPort) + { + return _innerMeterAPI.InitOneMeterFromExtern(slotNo, useConfigSource, usePasswordSource, requestPort, streamingPort); + } + + /// + /// Connects to the meter on the specified slot. + /// + /// Slot number. + /// Specifies whether offline passwords should be used. + /// Connect operation result. + public InterfaceGCIToLaatzen.ConnectResult ConnectOneMeter(int slotNo) + { + return _innerMeterAPI.ConnectOneMeter(slotNo); + } + + /// + /// Connects to the meter on the specified slot. + /// + /// Slot number. + /// Specifies whether offline passwords should be used. + /// Connect operation result. + public InterfaceGCIToLaatzen.ConnectResult ConnectAllMeters(int slotNo) + { + return _innerMeterAPI.ConnectAllMeters(slotNo); + } + + /// + /// Disconnects from the currently connected meter. + /// + public void Disconnect() + { + _innerMeterAPI.Disconnect(); + } + + /// + /// Reads PCB ID from the specified slot. + /// + /// Slot number. + /// PCB ID string. + public string GetPcbId(int slot) + { + return _innerMeterAPI.GetPcbId(slot); + } + + /// + /// Reads a register by name. + /// + /// Register name. + /// Register read result. + public InterfaceGCIToLaatzen.RegisterReadResult ReadRegister(string registerName) + { + return _innerMeterAPI.ReadRegister(registerName); + } + + /// + /// Writes a value to a register. + /// + /// Register name. + /// Value to write. + /// Specifies whether configuration should be stored after write. + /// Specifies whether system state refresh should be triggered after write. + /// Register write result. + public InterfaceGCIToLaatzen.RegisterWriteResult WriteRegister( + string registerName, + object value, + bool storeToDevice = false, + bool refreshSystemState = false) + { + return _innerMeterAPI.WriteRegister(registerName, value, storeToDevice, refreshSystemState); + } + + /// + /// Sets meter password. + /// + /// Password value. + /// True if operation succeeded; otherwise false. + public bool SetMeterPassword(string password) + { + return _innerMeterAPI.SetMeterPassword(password); + } + } +} \ No newline at end of file diff --git a/GenesisCordonelInterface/App.config b/GenesisCordonelInterface/App.config new file mode 100644 index 000000000..36d3dd4fb --- /dev/null +++ b/GenesisCordonelInterface/App.config @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/GenesisCordonelInterface/Core/Logging/ImportantInstructions.txt b/GenesisCordonelInterface/Core/Logging/ImportantInstructions.txt new file mode 100644 index 000000000..bcd992898 --- /dev/null +++ b/GenesisCordonelInterface/Core/Logging/ImportantInstructions.txt @@ -0,0 +1,23 @@ +Navod na logovanie projektu Laatzen/Common/ pre Genesis Cordonel meradla: +1. Princip: + - logovanie je zabezpecene pomocou nastroja NLog, ktory pouziva Laatzen + - Laatzen vsak pouziva nad NLogom svoj wrapper NLogHelper.cs a teda sa na pracu pri ich projektoch konfiguruje NLog pomocou ich suboru Nlogconfig.xml, + no nakolko ja som nechcel zasahovat do ich konfiguracneho suboru NLogu, pouzil som svoj, ktory je definovany v mojom projekte GenesisCordonelInterface, + s nazvom nlog.config + - z dovodu, ze som teda nechcel zasahovat do ich konfiguracie a zaroven som musel NLog na svoje ucely (presmerovanie logov do mema v mojom projekte), + musel som teda konfigurovat svojim konfiguracnym suborom, a zaroven plati ze pouzivam raw NLog. + - btw ked som pouzil ich wrapper a zaroven moj konfiguracny subor NLogu, tak pri spusten appky ho aj nacitalo, no nasledne sa nacitali Laatzenacke projekty + a nacital sa aj ich konfigurak Nlogu, ci sa prepisal ten moj. Pouzil som ten raw Nlog a uz to bolo ok + - takto je mozne presmerovat pomocou nizsie uvedenej metody logy az do mema v mojom projekte a tiez aj do suboru, pricom vsetko definujem v nlog.config + mojho projektu a nie v projekte Laatzenu +2. prilozene subory UiLogBus.cs a UiTarget.cs musia byt nakopirovane do projektu v ramci Solution s nazvom Common od Laatzenu + - kopiruju sa do top adresara projektu + - musia obsahovat ""namespace Xylem.Common.Utils.Logging" + - v mieste kde chcem logovat, je potrebne: + - zadefinovat: + private readonly ILogger Logger = NLogHelper.CreateOrGetLogger("GenesisCordonelInterface"); + - pouzit log: + Logger.Error(ex, $"Slot #{slotNR} failed: {ex.Message}"); + Logger.Trace("CONFIG: Setup loaded."); + Logger.Info("CONFIG: Setup loaded."); + ...whatever \ No newline at end of file diff --git a/GenesisCordonelInterface/Core/Logging/UiLogBus.cs b/GenesisCordonelInterface/Core/Logging/UiLogBus.cs new file mode 100644 index 000000000..960e365f5 --- /dev/null +++ b/GenesisCordonelInterface/Core/Logging/UiLogBus.cs @@ -0,0 +1,18 @@ +using System; + +/*namespace Xylem.Common.Utils.Logging +{ + public static class UiLogBus + { + public static event Action MessageReceived; + + public static void Publish(string message) + { + var handler = MessageReceived; + if (handler != null) + { + handler(message); + } + } + } +}*/ \ No newline at end of file diff --git a/GenesisCordonelInterface/Core/Logging/UiTarget.cs b/GenesisCordonelInterface/Core/Logging/UiTarget.cs new file mode 100644 index 000000000..fce483193 --- /dev/null +++ b/GenesisCordonelInterface/Core/Logging/UiTarget.cs @@ -0,0 +1,15 @@ +using NLog; +using NLog.Targets; + +/*namespace Xylem.Common.Utils.Logging +{ + [Target("UiTarget")] + public class UiTarget : TargetWithLayout + { + protected override void Write(LogEventInfo logEvent) + { + string message = Layout.Render(logEvent); + UiLogBus.Publish(message); + } + } +}*/ \ No newline at end of file diff --git a/GenesisCordonelInterface/GenesisCordonelInterface.csproj b/GenesisCordonelInterface/GenesisCordonelInterface.csproj new file mode 100644 index 000000000..772a7dc8b --- /dev/null +++ b/GenesisCordonelInterface/GenesisCordonelInterface.csproj @@ -0,0 +1,225 @@ + + + + + Debug + AnyCPU + {C955D8AC-76B8-42D8-A83F-8AEB56CF2567} + WinExe + GenesisCordonelInterface + GenesisCordonelInterface + v4.8 + 7.3 + 512 + true + true + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + ..\packages\NLog.5.2.2\lib\net46\NLog.dll + + + + + + + + + + + + + + + + + + + + + + Form + + + FrmConfigurations.cs + + + Form + + + FrmCordonelPreadjustmentUI.cs + + + Form + + + FrmRegisterStore.cs + + + Form + + + FrmSetup.cs + + + Form + + + MainForm.cs + + + + + UserControl + + + PreAdjustmentControl.cs + + + Form + + + FrmGCIAPI.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + FrmSetup.cs + + + MainForm.cs + + + + PreserveNewest + + + PreAdjustmentControl.cs + + + FrmGCIAPI.cs + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + + + {c8939821-ba5c-4988-a3d0-bf53b74865c7} + Common + + + {9eb1f659-6f73-4f65-bcab-4114fd94f5fc} + CommonCore.Configuration + + + {1b02c79e-0b19-43e2-8f6b-71ef0c786c97} + CommonCore + + + {d0c8d887-ed52-40ab-a069-90bce0e801e2} + CordonelPreadjustmentUi + + + {2e139f63-b6fe-4ea9-a098-85364fe9b26c} + PortCore + + + {72037e89-4f63-4b3f-beff-4138e578ce99} + SerialPorts + + + {315e94b8-b82f-4b25-b5bd-297df3bc1d54} + Applications + + + {f013a56b-7be6-4852-9cd8-b971cd1add0c} + GenesisConfig + + + {04201e95-90a0-4b73-a72f-379739b2a3ae} + GenesisCore + + + {f4aaf7e6-7333-4284-b735-e32deb076c64} + Registers + + + {8203abb8-38e5-472e-a742-33f38b7a74a6} + WaterMeterCore + + + {26afcf1e-1287-48b8-a506-32b1e8a0dd0e} + WaterMeterRegisters + + + {d0c859d9-d55e-4e85-ac50-0ff31b1ce50d} + Logic.ProductionToProductMapper + + + {6d2777bb-7a88-466d-a49b-3266f9bf0160} + ProductionOrderCore + + + {a33e3c6d-eaae-4a20-a0ee-f9e6922fd029} + SoftwareAccessHelper + + + {95a50087-99ee-4349-9a17-c547290db42f} + GenesisToolBox + + + {4b88b0d3-e791-4774-9521-eabeacdc420e} + Logging + + + + \ No newline at end of file diff --git a/GenesisCordonelInterface/Program.cs b/GenesisCordonelInterface/Program.cs new file mode 100644 index 000000000..fa6c9cbd1 --- /dev/null +++ b/GenesisCordonelInterface/Program.cs @@ -0,0 +1,22 @@ +using GenesisCordonelInterface.UI; +using NLog; +using System; +using System.Windows.Forms; +using Xylem.Common.Utils.Logging; +using System.IO; + +namespace GenesisCordonelInterface +{ + static class Program + { + private static readonly ILogger Logger = NLogHelper.CreateOrGetLogger("GenesisCordonelInterface"); + + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + } +} \ No newline at end of file diff --git a/GenesisCordonelInterface/Properties/AssemblyInfo.cs b/GenesisCordonelInterface/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..ff8596f1e --- /dev/null +++ b/GenesisCordonelInterface/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("GenesisCordonelInterface")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Windows Org")] +[assembly: AssemblyProduct("GenesisCordonelInterface")] +[assembly: AssemblyCopyright("Copyright © Windows Org 2026")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c955d8ac-76b8-42d8-a83f-8aeb56cf2567")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/GenesisCordonelInterface/Properties/Resources.Designer.cs b/GenesisCordonelInterface/Properties/Resources.Designer.cs new file mode 100644 index 000000000..f3a80a5d3 --- /dev/null +++ b/GenesisCordonelInterface/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace GenesisCordonelInterface.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GenesisCordonelInterface.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/GenesisCordonelInterface/Properties/Resources.resx b/GenesisCordonelInterface/Properties/Resources.resx new file mode 100644 index 000000000..af7dbebba --- /dev/null +++ b/GenesisCordonelInterface/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/GenesisCordonelInterface/Properties/Settings.Designer.cs b/GenesisCordonelInterface/Properties/Settings.Designer.cs new file mode 100644 index 000000000..87a4fa6d2 --- /dev/null +++ b/GenesisCordonelInterface/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace GenesisCordonelInterface.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/GenesisCordonelInterface/Properties/Settings.settings b/GenesisCordonelInterface/Properties/Settings.settings new file mode 100644 index 000000000..39645652a --- /dev/null +++ b/GenesisCordonelInterface/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/GenesisCordonelInterface/UI/LaatzenAPI_CordonelPreadjustmentUI/FrmCordonelPreadjustmentUI.Designer.cs b/GenesisCordonelInterface/UI/LaatzenAPI_CordonelPreadjustmentUI/FrmCordonelPreadjustmentUI.Designer.cs new file mode 100644 index 000000000..bc764d41e --- /dev/null +++ b/GenesisCordonelInterface/UI/LaatzenAPI_CordonelPreadjustmentUI/FrmCordonelPreadjustmentUI.Designer.cs @@ -0,0 +1,1810 @@ +namespace GenesisCordonelInterface.UI.LaatzenAPI_CordonelPreadjustmentUI +{ + partial class FrmCordonelPreadjustmentUI + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.tab_Maintab = new System.Windows.Forms.TabControl(); + this.tab_Report = new System.Windows.Forms.TabPage(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.groupBox_report = new System.Windows.Forms.GroupBox(); + this.gB_ReportTitlepage = new System.Windows.Forms.GroupBox(); + this.rTB_ReportEnterSerialNumber = new System.Windows.Forms.RichTextBox(); + this.label_Report_EnterSerialNumber = new System.Windows.Forms.Label(); + this.l_ReportIntro = new System.Windows.Forms.Label(); + this.rtB_ReportTitlepageIntro = new System.Windows.Forms.RichTextBox(); + this.rTB_ReportEnterTitle = new System.Windows.Forms.RichTextBox(); + this.label_Report_EnterTitle = new System.Windows.Forms.Label(); + this.label_Report_EnterOperator = new System.Windows.Forms.Label(); + this.rTB_ReportEnterDate = new System.Windows.Forms.RichTextBox(); + this.rTB_ReportEnterOperator = new System.Windows.Forms.RichTextBox(); + this.label_Report_EnterDate = new System.Windows.Forms.Label(); + this.btn_Report_Generate = new System.Windows.Forms.Button(); + this.tab_Settings = new System.Windows.Forms.TabPage(); + this.cB_SinglePath = new System.Windows.Forms.CheckBox(); + this.lbLanguage = new System.Windows.Forms.ListBox(); + this.gB_ComportSetup = new System.Windows.Forms.GroupBox(); + this.BtnOpenSetup = new System.Windows.Forms.Button(); + this.gB_SettingsTempMonitor = new System.Windows.Forms.GroupBox(); + this.nUD_SettingsTempMonitorDeviation = new System.Windows.Forms.NumericUpDown(); + this.nUD_SettingsTempMonitorLowerValue = new System.Windows.Forms.NumericUpDown(); + this.nUD_SettingsTempMonitorUpperValue = new System.Windows.Forms.NumericUpDown(); + this.l_SettingsTempMonitorDeviation = new System.Windows.Forms.Label(); + this.l_SettingsTempMonitorLowerValue = new System.Windows.Forms.Label(); + this.l_SettingsTempMonitorUpperValue = new System.Windows.Forms.Label(); + this.gB_Settings_TemperatureCalibration = new System.Windows.Forms.GroupBox(); + this.cB_TempOnly = new System.Windows.Forms.CheckBox(); + this.cB_TempManualAcquisition = new System.Windows.Forms.CheckBox(); + this.lThermo2 = new System.Windows.Forms.Label(); + this.lPasswordThermo1 = new System.Windows.Forms.Label(); + this.tB_PasswordThermo2 = new System.Windows.Forms.TextBox(); + this.tB_PasswordThermo1 = new System.Windows.Forms.TextBox(); + this.gB_Passwords = new System.Windows.Forms.GroupBox(); + this.tB_PasswordMeter5 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter10 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter9 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter8 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter7 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter6 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter4 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter3 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter2 = new System.Windows.Forms.TextBox(); + this.tB_PasswordMeter1 = new System.Windows.Forms.TextBox(); + this.l_PasswordMeter10 = new System.Windows.Forms.Label(); + this.l_PasswordMeter9 = new System.Windows.Forms.Label(); + this.l_PasswordMeter8 = new System.Windows.Forms.Label(); + this.l_PasswordMeter7 = new System.Windows.Forms.Label(); + this.l_PasswordMeter6 = new System.Windows.Forms.Label(); + this.l_PasswordMeter5 = new System.Windows.Forms.Label(); + this.l_PasswordMeter4 = new System.Windows.Forms.Label(); + this.l_PasswordMeter3 = new System.Windows.Forms.Label(); + this.l_PasswordMeter2 = new System.Windows.Forms.Label(); + this.l_PasswordMeter1 = new System.Windows.Forms.Label(); + this.gB_Settings_Preparation = new System.Windows.Forms.GroupBox(); + this.nUD_Settings_Samplerate = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.nUD_Settings_Preparation_StabiTime = new System.Windows.Forms.NumericUpDown(); + this.l_Settings_Preparation_StabiTime = new System.Windows.Forms.Label(); + this.gB_Settings_ZeroflowOffsetTest = new System.Windows.Forms.GroupBox(); + this.cB_OffsetTestLogFiles = new System.Windows.Forms.CheckBox(); + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval = new System.Windows.Forms.NumericUpDown(); + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval = new System.Windows.Forms.Label(); + this.l_Settings_ZeroflowOffsetTestNumberOfLines = new System.Windows.Forms.Label(); + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines = new System.Windows.Forms.NumericUpDown(); + this.l_Settings_ZeroFlowTestSettlingTime = new System.Windows.Forms.Label(); + this.nUD_Settings_ZeroflowOffsetTestSettlingTime = new System.Windows.Forms.NumericUpDown(); + this.l_Settings_ZeroFlowTestOffsetLimit = new System.Windows.Forms.Label(); + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit = new System.Windows.Forms.NumericUpDown(); + this.l_Settings_ZeroflowOffsetTestLowerLimit = new System.Windows.Forms.Label(); + this.l_Settings_ZeroflowOffsetTestUpperLimit = new System.Windows.Forms.Label(); + this.nUD_Settings_ZeroflowOffsetTestLowerLimit = new System.Windows.Forms.NumericUpDown(); + this.nUD_Settings_ZeroflowOffsetTestUpperLimit = new System.Windows.Forms.NumericUpDown(); + this.gB_Settings_AmplitudeTest = new System.Windows.Forms.GroupBox(); + this.cB_AmpLogFiles = new System.Windows.Forms.CheckBox(); + this.nUD_Settings_AmplitudeActivityCheckInterval = new System.Windows.Forms.NumericUpDown(); + this.l_Settings_AmplitudeActivityCheckInterval = new System.Windows.Forms.Label(); + this.cB_MeanAmplitudeFiles = new System.Windows.Forms.CheckBox(); + this.nUD_PercentageStop = new System.Windows.Forms.NumericUpDown(); + this.l_PercentageStop = new System.Windows.Forms.Label(); + this.l_PercentageStart = new System.Windows.Forms.Label(); + this.nUD_PercentageStart = new System.Windows.Forms.NumericUpDown(); + this.l__Settings_AmplitudeTestMinDistance = new System.Windows.Forms.Label(); + this.nUD_Settings_AmplitudeTestMinDistance = new System.Windows.Forms.NumericUpDown(); + this.l_Settings_AmplitudeTestLowerLimit = new System.Windows.Forms.Label(); + this.l_Settings_AmplitudeTestUpperLimit = new System.Windows.Forms.Label(); + this.nUD_Settings_AmplitudeTestLowerLimit = new System.Windows.Forms.NumericUpDown(); + this.nUD_Settings_AmplitudeTestUpperLimit = new System.Windows.Forms.NumericUpDown(); + this.pB_Logo3 = new System.Windows.Forms.PictureBox(); + this.pB_AvailableImages = new System.Windows.Forms.PictureBox(); + this.tab_About = new System.Windows.Forms.TabPage(); + this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.l_BasedOn = new System.Windows.Forms.Label(); + this.l_Author = new System.Windows.Forms.Label(); + this.pB_DocumentVersion = new System.Windows.Forms.PictureBox(); + this.pB_Logo2 = new System.Windows.Forms.PictureBox(); + this.l_Version = new System.Windows.Forms.Label(); + this.l_About_Info = new System.Windows.Forms.Label(); + this.l_About_Author = new System.Windows.Forms.Label(); + this.l_About_Version = new System.Windows.Forms.Label(); + this.tab_ZeroFlowCal = new System.Windows.Forms.TabPage(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.richTextBox1 = new System.Windows.Forms.RichTextBox(); + this.button1 = new System.Windows.Forms.Button(); + this.gB_TempMeters = new System.Windows.Forms.GroupBox(); + this.nudTempSlot = new System.Windows.Forms.NumericUpDown(); + this.btnTempRaspi = new System.Windows.Forms.Button(); + this.btn_LoadTempe = new System.Windows.Forms.Button(); + this.tab_Maintab.SuspendLayout(); + this.tab_Report.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.groupBox_report.SuspendLayout(); + this.gB_ReportTitlepage.SuspendLayout(); + this.tab_Settings.SuspendLayout(); + this.gB_ComportSetup.SuspendLayout(); + this.gB_SettingsTempMonitor.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsTempMonitorDeviation)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsTempMonitorLowerValue)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsTempMonitorUpperValue)).BeginInit(); + this.gB_Settings_TemperatureCalibration.SuspendLayout(); + this.gB_Passwords.SuspendLayout(); + this.gB_Settings_Preparation.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_Samplerate)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_Preparation_StabiTime)).BeginInit(); + this.gB_Settings_ZeroflowOffsetTest.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestNumberOfLines)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestSettlingTime)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestOffsetLimit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestLowerLimit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestUpperLimit)).BeginInit(); + this.gB_Settings_AmplitudeTest.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeActivityCheckInterval)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_PercentageStop)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_PercentageStart)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeTestMinDistance)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeTestLowerLimit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeTestUpperLimit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Logo3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_AvailableImages)).BeginInit(); + this.tab_About.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_DocumentVersion)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Logo2)).BeginInit(); + this.tabPage1.SuspendLayout(); + this.gB_TempMeters.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nudTempSlot)).BeginInit(); + this.SuspendLayout(); + // + // tab_Maintab + // + this.tab_Maintab.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tab_Maintab.Controls.Add(this.tab_Report); + this.tab_Maintab.Controls.Add(this.tab_Settings); + this.tab_Maintab.Controls.Add(this.tab_About); + this.tab_Maintab.Controls.Add(this.tab_ZeroFlowCal); + this.tab_Maintab.Controls.Add(this.tabPage1); + this.tab_Maintab.Location = new System.Drawing.Point(11, 11); + this.tab_Maintab.Margin = new System.Windows.Forms.Padding(2); + this.tab_Maintab.Name = "tab_Maintab"; + this.tab_Maintab.SelectedIndex = 0; + this.tab_Maintab.Size = new System.Drawing.Size(1036, 678); + this.tab_Maintab.SizeMode = System.Windows.Forms.TabSizeMode.FillToRight; + this.tab_Maintab.TabIndex = 2; + this.tab_Maintab.Selected += new System.Windows.Forms.TabControlEventHandler(this.tab_Maintab_Selected); + // + // tab_Report + // + this.tab_Report.BackColor = System.Drawing.Color.Honeydew; + this.tab_Report.Controls.Add(this.pictureBox1); + this.tab_Report.Controls.Add(this.groupBox_report); + this.tab_Report.Location = new System.Drawing.Point(4, 22); + this.tab_Report.Margin = new System.Windows.Forms.Padding(2); + this.tab_Report.Name = "tab_Report"; + this.tab_Report.Padding = new System.Windows.Forms.Padding(2); + this.tab_Report.Size = new System.Drawing.Size(1028, 652); + this.tab_Report.TabIndex = 1; + this.tab_Report.Text = "Report"; + // + // pictureBox1 + // + this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBox1.BackColor = System.Drawing.Color.Transparent; + this.pictureBox1.ErrorImage = ((System.Drawing.Image)(resources.GetObject("pictureBox1.ErrorImage"))); + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.InitialImage = ((System.Drawing.Image)(resources.GetObject("pictureBox1.InitialImage"))); + this.pictureBox1.Location = new System.Drawing.Point(942, 35); + this.pictureBox1.Margin = new System.Windows.Forms.Padding(2); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(53, 40); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 27; + this.pictureBox1.TabStop = false; + // + // groupBox_report + // + this.groupBox_report.Anchor = System.Windows.Forms.AnchorStyles.None; + this.groupBox_report.Controls.Add(this.gB_ReportTitlepage); + this.groupBox_report.Controls.Add(this.btn_Report_Generate); + this.groupBox_report.Location = new System.Drawing.Point(274, 1); + this.groupBox_report.Margin = new System.Windows.Forms.Padding(2); + this.groupBox_report.Name = "groupBox_report"; + this.groupBox_report.Padding = new System.Windows.Forms.Padding(2); + this.groupBox_report.Size = new System.Drawing.Size(444, 654); + this.groupBox_report.TabIndex = 2; + this.groupBox_report.TabStop = false; + this.groupBox_report.Text = "Select Options"; + // + // gB_ReportTitlepage + // + this.gB_ReportTitlepage.Controls.Add(this.rTB_ReportEnterSerialNumber); + this.gB_ReportTitlepage.Controls.Add(this.label_Report_EnterSerialNumber); + this.gB_ReportTitlepage.Controls.Add(this.l_ReportIntro); + this.gB_ReportTitlepage.Controls.Add(this.rtB_ReportTitlepageIntro); + this.gB_ReportTitlepage.Controls.Add(this.rTB_ReportEnterTitle); + this.gB_ReportTitlepage.Controls.Add(this.label_Report_EnterTitle); + this.gB_ReportTitlepage.Controls.Add(this.label_Report_EnterOperator); + this.gB_ReportTitlepage.Controls.Add(this.rTB_ReportEnterDate); + this.gB_ReportTitlepage.Controls.Add(this.rTB_ReportEnterOperator); + this.gB_ReportTitlepage.Controls.Add(this.label_Report_EnterDate); + this.gB_ReportTitlepage.Location = new System.Drawing.Point(18, 16); + this.gB_ReportTitlepage.Margin = new System.Windows.Forms.Padding(2); + this.gB_ReportTitlepage.Name = "gB_ReportTitlepage"; + this.gB_ReportTitlepage.Padding = new System.Windows.Forms.Padding(2); + this.gB_ReportTitlepage.Size = new System.Drawing.Size(400, 378); + this.gB_ReportTitlepage.TabIndex = 16; + this.gB_ReportTitlepage.TabStop = false; + this.gB_ReportTitlepage.Text = "Titelpage"; + // + // rTB_ReportEnterSerialNumber + // + this.rTB_ReportEnterSerialNumber.Location = new System.Drawing.Point(181, 91); + this.rTB_ReportEnterSerialNumber.Margin = new System.Windows.Forms.Padding(2); + this.rTB_ReportEnterSerialNumber.Name = "rTB_ReportEnterSerialNumber"; + this.rTB_ReportEnterSerialNumber.Size = new System.Drawing.Size(177, 21); + this.rTB_ReportEnterSerialNumber.TabIndex = 18; + this.rTB_ReportEnterSerialNumber.Text = ""; + // + // label_Report_EnterSerialNumber + // + this.label_Report_EnterSerialNumber.AutoSize = true; + this.label_Report_EnterSerialNumber.Location = new System.Drawing.Point(27, 91); + this.label_Report_EnterSerialNumber.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label_Report_EnterSerialNumber.Name = "label_Report_EnterSerialNumber"; + this.label_Report_EnterSerialNumber.Size = new System.Drawing.Size(138, 13); + this.label_Report_EnterSerialNumber.TabIndex = 17; + this.label_Report_EnterSerialNumber.Text = "Please enter Serial Number:"; + // + // l_ReportIntro + // + this.l_ReportIntro.AutoSize = true; + this.l_ReportIntro.Location = new System.Drawing.Point(27, 116); + this.l_ReportIntro.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ReportIntro.Name = "l_ReportIntro"; + this.l_ReportIntro.Size = new System.Drawing.Size(82, 13); + this.l_ReportIntro.TabIndex = 16; + this.l_ReportIntro.Text = "Enter Comment:"; + // + // rtB_ReportTitlepageIntro + // + this.rtB_ReportTitlepageIntro.Location = new System.Drawing.Point(30, 132); + this.rtB_ReportTitlepageIntro.Margin = new System.Windows.Forms.Padding(2); + this.rtB_ReportTitlepageIntro.Name = "rtB_ReportTitlepageIntro"; + this.rtB_ReportTitlepageIntro.Size = new System.Drawing.Size(345, 224); + this.rtB_ReportTitlepageIntro.TabIndex = 15; + this.rtB_ReportTitlepageIntro.Text = resources.GetString("rtB_ReportTitlepageIntro.Text"); + // + // rTB_ReportEnterTitle + // + this.rTB_ReportEnterTitle.Location = new System.Drawing.Point(181, 23); + this.rTB_ReportEnterTitle.Margin = new System.Windows.Forms.Padding(2); + this.rTB_ReportEnterTitle.Name = "rTB_ReportEnterTitle"; + this.rTB_ReportEnterTitle.Size = new System.Drawing.Size(177, 21); + this.rTB_ReportEnterTitle.TabIndex = 10; + this.rTB_ReportEnterTitle.Text = "Zeroflow Calibration Report"; + // + // label_Report_EnterTitle + // + this.label_Report_EnterTitle.AutoSize = true; + this.label_Report_EnterTitle.Location = new System.Drawing.Point(27, 26); + this.label_Report_EnterTitle.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label_Report_EnterTitle.Name = "label_Report_EnterTitle"; + this.label_Report_EnterTitle.Size = new System.Drawing.Size(88, 13); + this.label_Report_EnterTitle.TabIndex = 9; + this.label_Report_EnterTitle.Text = "Please enter title:"; + // + // label_Report_EnterOperator + // + this.label_Report_EnterOperator.AutoSize = true; + this.label_Report_EnterOperator.Location = new System.Drawing.Point(27, 70); + this.label_Report_EnterOperator.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label_Report_EnterOperator.Name = "label_Report_EnterOperator"; + this.label_Report_EnterOperator.Size = new System.Drawing.Size(111, 13); + this.label_Report_EnterOperator.TabIndex = 14; + this.label_Report_EnterOperator.Text = "Please enter operator:"; + // + // rTB_ReportEnterDate + // + this.rTB_ReportEnterDate.Location = new System.Drawing.Point(181, 46); + this.rTB_ReportEnterDate.Margin = new System.Windows.Forms.Padding(2); + this.rTB_ReportEnterDate.Name = "rTB_ReportEnterDate"; + this.rTB_ReportEnterDate.Size = new System.Drawing.Size(177, 21); + this.rTB_ReportEnterDate.TabIndex = 12; + this.rTB_ReportEnterDate.Text = ""; + // + // rTB_ReportEnterOperator + // + this.rTB_ReportEnterOperator.Location = new System.Drawing.Point(181, 69); + this.rTB_ReportEnterOperator.Margin = new System.Windows.Forms.Padding(2); + this.rTB_ReportEnterOperator.Name = "rTB_ReportEnterOperator"; + this.rTB_ReportEnterOperator.Size = new System.Drawing.Size(177, 21); + this.rTB_ReportEnterOperator.TabIndex = 13; + this.rTB_ReportEnterOperator.Text = "[John Doe]"; + // + // label_Report_EnterDate + // + this.label_Report_EnterDate.AutoSize = true; + this.label_Report_EnterDate.Location = new System.Drawing.Point(27, 48); + this.label_Report_EnterDate.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label_Report_EnterDate.Name = "label_Report_EnterDate"; + this.label_Report_EnterDate.Size = new System.Drawing.Size(93, 13); + this.label_Report_EnterDate.TabIndex = 11; + this.label_Report_EnterDate.Text = "Please enter date:"; + // + // btn_Report_Generate + // + this.btn_Report_Generate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btn_Report_Generate.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_Report_Generate.Location = new System.Drawing.Point(144, 477); + this.btn_Report_Generate.Margin = new System.Windows.Forms.Padding(2); + this.btn_Report_Generate.Name = "btn_Report_Generate"; + this.btn_Report_Generate.Size = new System.Drawing.Size(168, 112); + this.btn_Report_Generate.TabIndex = 0; + this.btn_Report_Generate.Text = "Generate Report"; + this.btn_Report_Generate.UseVisualStyleBackColor = true; + // + // tab_Settings + // + this.tab_Settings.BackColor = System.Drawing.Color.Honeydew; + this.tab_Settings.Controls.Add(this.cB_SinglePath); + this.tab_Settings.Controls.Add(this.lbLanguage); + this.tab_Settings.Controls.Add(this.gB_ComportSetup); + this.tab_Settings.Controls.Add(this.gB_SettingsTempMonitor); + this.tab_Settings.Controls.Add(this.gB_Settings_TemperatureCalibration); + this.tab_Settings.Controls.Add(this.gB_Passwords); + this.tab_Settings.Controls.Add(this.gB_Settings_Preparation); + this.tab_Settings.Controls.Add(this.gB_Settings_ZeroflowOffsetTest); + this.tab_Settings.Controls.Add(this.gB_Settings_AmplitudeTest); + this.tab_Settings.Controls.Add(this.pB_Logo3); + this.tab_Settings.Controls.Add(this.pB_AvailableImages); + this.tab_Settings.Location = new System.Drawing.Point(4, 22); + this.tab_Settings.Margin = new System.Windows.Forms.Padding(2); + this.tab_Settings.Name = "tab_Settings"; + this.tab_Settings.Padding = new System.Windows.Forms.Padding(2); + this.tab_Settings.Size = new System.Drawing.Size(1028, 652); + this.tab_Settings.TabIndex = 8; + this.tab_Settings.Text = "Settings"; + // + // cB_SinglePath + // + this.cB_SinglePath.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cB_SinglePath.AutoSize = true; + this.cB_SinglePath.Location = new System.Drawing.Point(821, 268); + this.cB_SinglePath.Margin = new System.Windows.Forms.Padding(2); + this.cB_SinglePath.Name = "cB_SinglePath"; + this.cB_SinglePath.Size = new System.Drawing.Size(87, 17); + this.cB_SinglePath.TabIndex = 66; + this.cB_SinglePath.Text = "Single PATH"; + this.cB_SinglePath.UseVisualStyleBackColor = true; + // + // lbLanguage + // + this.lbLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.lbLanguage.FormattingEnabled = true; + this.lbLanguage.Items.AddRange(new object[] { + "Deutsch", + "English"}); + this.lbLanguage.Location = new System.Drawing.Point(709, 220); + this.lbLanguage.Margin = new System.Windows.Forms.Padding(2); + this.lbLanguage.Name = "lbLanguage"; + this.lbLanguage.Size = new System.Drawing.Size(97, 30); + this.lbLanguage.TabIndex = 65; + // + // gB_ComportSetup + // + this.gB_ComportSetup.Controls.Add(this.BtnOpenSetup); + this.gB_ComportSetup.Location = new System.Drawing.Point(336, 366); + this.gB_ComportSetup.Margin = new System.Windows.Forms.Padding(2); + this.gB_ComportSetup.Name = "gB_ComportSetup"; + this.gB_ComportSetup.Padding = new System.Windows.Forms.Padding(2); + this.gB_ComportSetup.Size = new System.Drawing.Size(272, 87); + this.gB_ComportSetup.TabIndex = 30; + this.gB_ComportSetup.TabStop = false; + this.gB_ComportSetup.Text = "COM Port Setup"; + // + // BtnOpenSetup + // + this.BtnOpenSetup.Location = new System.Drawing.Point(5, 29); + this.BtnOpenSetup.Name = "BtnOpenSetup"; + this.BtnOpenSetup.Size = new System.Drawing.Size(262, 37); + this.BtnOpenSetup.TabIndex = 0; + this.BtnOpenSetup.Text = "Open Setup"; + this.BtnOpenSetup.UseVisualStyleBackColor = true; + // + // gB_SettingsTempMonitor + // + this.gB_SettingsTempMonitor.Controls.Add(this.nUD_SettingsTempMonitorDeviation); + this.gB_SettingsTempMonitor.Controls.Add(this.nUD_SettingsTempMonitorLowerValue); + this.gB_SettingsTempMonitor.Controls.Add(this.nUD_SettingsTempMonitorUpperValue); + this.gB_SettingsTempMonitor.Controls.Add(this.l_SettingsTempMonitorDeviation); + this.gB_SettingsTempMonitor.Controls.Add(this.l_SettingsTempMonitorLowerValue); + this.gB_SettingsTempMonitor.Controls.Add(this.l_SettingsTempMonitorUpperValue); + this.gB_SettingsTempMonitor.Location = new System.Drawing.Point(336, 456); + this.gB_SettingsTempMonitor.Margin = new System.Windows.Forms.Padding(2); + this.gB_SettingsTempMonitor.Name = "gB_SettingsTempMonitor"; + this.gB_SettingsTempMonitor.Padding = new System.Windows.Forms.Padding(2); + this.gB_SettingsTempMonitor.Size = new System.Drawing.Size(274, 171); + this.gB_SettingsTempMonitor.TabIndex = 32; + this.gB_SettingsTempMonitor.TabStop = false; + this.gB_SettingsTempMonitor.Text = "Temperature Monitoring"; + // + // nUD_SettingsTempMonitorDeviation + // + this.nUD_SettingsTempMonitorDeviation.DecimalPlaces = 1; + this.nUD_SettingsTempMonitorDeviation.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_SettingsTempMonitorDeviation.Location = new System.Drawing.Point(130, 106); + this.nUD_SettingsTempMonitorDeviation.Margin = new System.Windows.Forms.Padding(2); + this.nUD_SettingsTempMonitorDeviation.Maximum = new decimal(new int[] { + 5, + 0, + 0, + 0}); + this.nUD_SettingsTempMonitorDeviation.Name = "nUD_SettingsTempMonitorDeviation"; + this.nUD_SettingsTempMonitorDeviation.Size = new System.Drawing.Size(96, 20); + this.nUD_SettingsTempMonitorDeviation.TabIndex = 5; + this.nUD_SettingsTempMonitorDeviation.Value = new decimal(new int[] { + 5, + 0, + 0, + 65536}); + // + // nUD_SettingsTempMonitorLowerValue + // + this.nUD_SettingsTempMonitorLowerValue.DecimalPlaces = 1; + this.nUD_SettingsTempMonitorLowerValue.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_SettingsTempMonitorLowerValue.Location = new System.Drawing.Point(130, 67); + this.nUD_SettingsTempMonitorLowerValue.Margin = new System.Windows.Forms.Padding(2); + this.nUD_SettingsTempMonitorLowerValue.Maximum = new decimal(new int[] { + 30, + 0, + 0, + 0}); + this.nUD_SettingsTempMonitorLowerValue.Name = "nUD_SettingsTempMonitorLowerValue"; + this.nUD_SettingsTempMonitorLowerValue.Size = new System.Drawing.Size(96, 20); + this.nUD_SettingsTempMonitorLowerValue.TabIndex = 4; + this.nUD_SettingsTempMonitorLowerValue.Value = new decimal(new int[] { + 10, + 0, + 0, + 0}); + // + // nUD_SettingsTempMonitorUpperValue + // + this.nUD_SettingsTempMonitorUpperValue.DecimalPlaces = 1; + this.nUD_SettingsTempMonitorUpperValue.Increment = new decimal(new int[] { + 1, + 0, + 0, + 65536}); + this.nUD_SettingsTempMonitorUpperValue.Location = new System.Drawing.Point(130, 34); + this.nUD_SettingsTempMonitorUpperValue.Margin = new System.Windows.Forms.Padding(2); + this.nUD_SettingsTempMonitorUpperValue.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_SettingsTempMonitorUpperValue.Name = "nUD_SettingsTempMonitorUpperValue"; + this.nUD_SettingsTempMonitorUpperValue.Size = new System.Drawing.Size(96, 20); + this.nUD_SettingsTempMonitorUpperValue.TabIndex = 3; + this.nUD_SettingsTempMonitorUpperValue.Value = new decimal(new int[] { + 35, + 0, + 0, + 0}); + // + // l_SettingsTempMonitorDeviation + // + this.l_SettingsTempMonitorDeviation.AutoSize = true; + this.l_SettingsTempMonitorDeviation.Location = new System.Drawing.Point(24, 106); + this.l_SettingsTempMonitorDeviation.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_SettingsTempMonitorDeviation.Name = "l_SettingsTempMonitorDeviation"; + this.l_SettingsTempMonitorDeviation.Size = new System.Drawing.Size(75, 13); + this.l_SettingsTempMonitorDeviation.TabIndex = 2; + this.l_SettingsTempMonitorDeviation.Text = "Deviation [°C]:"; + // + // l_SettingsTempMonitorLowerValue + // + this.l_SettingsTempMonitorLowerValue.AutoSize = true; + this.l_SettingsTempMonitorLowerValue.Location = new System.Drawing.Point(24, 67); + this.l_SettingsTempMonitorLowerValue.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_SettingsTempMonitorLowerValue.Name = "l_SettingsTempMonitorLowerValue"; + this.l_SettingsTempMonitorLowerValue.Size = new System.Drawing.Size(89, 13); + this.l_SettingsTempMonitorLowerValue.TabIndex = 1; + this.l_SettingsTempMonitorLowerValue.Text = "Lower Value [°C]:"; + // + // l_SettingsTempMonitorUpperValue + // + this.l_SettingsTempMonitorUpperValue.AutoSize = true; + this.l_SettingsTempMonitorUpperValue.Location = new System.Drawing.Point(24, 34); + this.l_SettingsTempMonitorUpperValue.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_SettingsTempMonitorUpperValue.Name = "l_SettingsTempMonitorUpperValue"; + this.l_SettingsTempMonitorUpperValue.Size = new System.Drawing.Size(89, 13); + this.l_SettingsTempMonitorUpperValue.TabIndex = 0; + this.l_SettingsTempMonitorUpperValue.Text = "Upper Value [°C]:"; + // + // gB_Settings_TemperatureCalibration + // + this.gB_Settings_TemperatureCalibration.Controls.Add(this.cB_TempOnly); + this.gB_Settings_TemperatureCalibration.Controls.Add(this.cB_TempManualAcquisition); + this.gB_Settings_TemperatureCalibration.Controls.Add(this.lThermo2); + this.gB_Settings_TemperatureCalibration.Controls.Add(this.lPasswordThermo1); + this.gB_Settings_TemperatureCalibration.Controls.Add(this.tB_PasswordThermo2); + this.gB_Settings_TemperatureCalibration.Controls.Add(this.tB_PasswordThermo1); + this.gB_Settings_TemperatureCalibration.Location = new System.Drawing.Point(624, 72); + this.gB_Settings_TemperatureCalibration.Margin = new System.Windows.Forms.Padding(2); + this.gB_Settings_TemperatureCalibration.Name = "gB_Settings_TemperatureCalibration"; + this.gB_Settings_TemperatureCalibration.Padding = new System.Windows.Forms.Padding(2); + this.gB_Settings_TemperatureCalibration.Size = new System.Drawing.Size(272, 144); + this.gB_Settings_TemperatureCalibration.TabIndex = 28; + this.gB_Settings_TemperatureCalibration.TabStop = false; + this.gB_Settings_TemperatureCalibration.Text = "Temperature Calibration"; + // + // cB_TempOnly + // + this.cB_TempOnly.AutoSize = true; + this.cB_TempOnly.Location = new System.Drawing.Point(42, 96); + this.cB_TempOnly.Margin = new System.Windows.Forms.Padding(2); + this.cB_TempOnly.Name = "cB_TempOnly"; + this.cB_TempOnly.Size = new System.Drawing.Size(126, 17); + this.cB_TempOnly.TabIndex = 18; + this.cB_TempOnly.Text = "Temp calibration only"; + this.cB_TempOnly.UseVisualStyleBackColor = true; + // + // cB_TempManualAcquisition + // + this.cB_TempManualAcquisition.AutoSize = true; + this.cB_TempManualAcquisition.Checked = true; + this.cB_TempManualAcquisition.CheckState = System.Windows.Forms.CheckState.Checked; + this.cB_TempManualAcquisition.Location = new System.Drawing.Point(42, 117); + this.cB_TempManualAcquisition.Margin = new System.Windows.Forms.Padding(2); + this.cB_TempManualAcquisition.Name = "cB_TempManualAcquisition"; + this.cB_TempManualAcquisition.Size = new System.Drawing.Size(178, 17); + this.cB_TempManualAcquisition.TabIndex = 17; + this.cB_TempManualAcquisition.Text = "Manual Temperature Acquisition"; + this.cB_TempManualAcquisition.UseVisualStyleBackColor = true; + // + // lThermo2 + // + this.lThermo2.AutoSize = true; + this.lThermo2.Location = new System.Drawing.Point(18, 69); + this.lThermo2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.lThermo2.Name = "lThermo2"; + this.lThermo2.Size = new System.Drawing.Size(52, 13); + this.lThermo2.TabIndex = 16; + this.lThermo2.Text = "Thermo2:"; + // + // lPasswordThermo1 + // + this.lPasswordThermo1.AutoSize = true; + this.lPasswordThermo1.Location = new System.Drawing.Point(18, 35); + this.lPasswordThermo1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.lPasswordThermo1.Name = "lPasswordThermo1"; + this.lPasswordThermo1.Size = new System.Drawing.Size(52, 13); + this.lPasswordThermo1.TabIndex = 15; + this.lPasswordThermo1.Text = "Thermo1:"; + // + // tB_PasswordThermo2 + // + this.tB_PasswordThermo2.Location = new System.Drawing.Point(90, 64); + this.tB_PasswordThermo2.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordThermo2.Name = "tB_PasswordThermo2"; + this.tB_PasswordThermo2.Size = new System.Drawing.Size(121, 20); + this.tB_PasswordThermo2.TabIndex = 14; + // + // tB_PasswordThermo1 + // + this.tB_PasswordThermo1.Location = new System.Drawing.Point(90, 35); + this.tB_PasswordThermo1.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordThermo1.Name = "tB_PasswordThermo1"; + this.tB_PasswordThermo1.Size = new System.Drawing.Size(121, 20); + this.tB_PasswordThermo1.TabIndex = 13; + // + // gB_Passwords + // + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter5); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter10); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter9); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter8); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter7); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter6); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter4); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter3); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter2); + this.gB_Passwords.Controls.Add(this.tB_PasswordMeter1); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter10); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter9); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter8); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter7); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter6); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter5); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter4); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter3); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter2); + this.gB_Passwords.Controls.Add(this.l_PasswordMeter1); + this.gB_Passwords.Location = new System.Drawing.Point(40, 352); + this.gB_Passwords.Margin = new System.Windows.Forms.Padding(2); + this.gB_Passwords.Name = "gB_Passwords"; + this.gB_Passwords.Padding = new System.Windows.Forms.Padding(2); + this.gB_Passwords.Size = new System.Drawing.Size(272, 288); + this.gB_Passwords.TabIndex = 30; + this.gB_Passwords.TabStop = false; + this.gB_Passwords.Text = "_externPasswords"; + // + // tB_PasswordMeter5 + // + this.tB_PasswordMeter5.Location = new System.Drawing.Point(106, 130); + this.tB_PasswordMeter5.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter5.Name = "tB_PasswordMeter5"; + this.tB_PasswordMeter5.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter5.TabIndex = 44; + // + // tB_PasswordMeter10 + // + this.tB_PasswordMeter10.Location = new System.Drawing.Point(106, 254); + this.tB_PasswordMeter10.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter10.Name = "tB_PasswordMeter10"; + this.tB_PasswordMeter10.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter10.TabIndex = 43; + // + // tB_PasswordMeter9 + // + this.tB_PasswordMeter9.Location = new System.Drawing.Point(106, 230); + this.tB_PasswordMeter9.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter9.Name = "tB_PasswordMeter9"; + this.tB_PasswordMeter9.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter9.TabIndex = 42; + // + // tB_PasswordMeter8 + // + this.tB_PasswordMeter8.Location = new System.Drawing.Point(106, 206); + this.tB_PasswordMeter8.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter8.Name = "tB_PasswordMeter8"; + this.tB_PasswordMeter8.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter8.TabIndex = 41; + // + // tB_PasswordMeter7 + // + this.tB_PasswordMeter7.Location = new System.Drawing.Point(106, 178); + this.tB_PasswordMeter7.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter7.Name = "tB_PasswordMeter7"; + this.tB_PasswordMeter7.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter7.TabIndex = 40; + // + // tB_PasswordMeter6 + // + this.tB_PasswordMeter6.Location = new System.Drawing.Point(106, 154); + this.tB_PasswordMeter6.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter6.Name = "tB_PasswordMeter6"; + this.tB_PasswordMeter6.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter6.TabIndex = 39; + // + // tB_PasswordMeter4 + // + this.tB_PasswordMeter4.Location = new System.Drawing.Point(106, 106); + this.tB_PasswordMeter4.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter4.Name = "tB_PasswordMeter4"; + this.tB_PasswordMeter4.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter4.TabIndex = 37; + // + // tB_PasswordMeter3 + // + this.tB_PasswordMeter3.Location = new System.Drawing.Point(106, 77); + this.tB_PasswordMeter3.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter3.Name = "tB_PasswordMeter3"; + this.tB_PasswordMeter3.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter3.TabIndex = 36; + // + // tB_PasswordMeter2 + // + this.tB_PasswordMeter2.Location = new System.Drawing.Point(106, 53); + this.tB_PasswordMeter2.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter2.Name = "tB_PasswordMeter2"; + this.tB_PasswordMeter2.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter2.TabIndex = 35; + // + // tB_PasswordMeter1 + // + this.tB_PasswordMeter1.Location = new System.Drawing.Point(106, 29); + this.tB_PasswordMeter1.Margin = new System.Windows.Forms.Padding(2); + this.tB_PasswordMeter1.Name = "tB_PasswordMeter1"; + this.tB_PasswordMeter1.Size = new System.Drawing.Size(130, 20); + this.tB_PasswordMeter1.TabIndex = 34; + // + // l_PasswordMeter10 + // + this.l_PasswordMeter10.AutoSize = true; + this.l_PasswordMeter10.Location = new System.Drawing.Point(28, 254); + this.l_PasswordMeter10.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter10.Name = "l_PasswordMeter10"; + this.l_PasswordMeter10.Size = new System.Drawing.Size(60, 13); + this.l_PasswordMeter10.TabIndex = 33; + this.l_PasswordMeter10.Text = "METER10:"; + // + // l_PasswordMeter9 + // + this.l_PasswordMeter9.AutoSize = true; + this.l_PasswordMeter9.Location = new System.Drawing.Point(28, 230); + this.l_PasswordMeter9.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter9.Name = "l_PasswordMeter9"; + this.l_PasswordMeter9.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter9.TabIndex = 32; + this.l_PasswordMeter9.Text = "METER9:"; + // + // l_PasswordMeter8 + // + this.l_PasswordMeter8.AutoSize = true; + this.l_PasswordMeter8.Location = new System.Drawing.Point(28, 205); + this.l_PasswordMeter8.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter8.Name = "l_PasswordMeter8"; + this.l_PasswordMeter8.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter8.TabIndex = 31; + this.l_PasswordMeter8.Text = "METER8:"; + // + // l_PasswordMeter7 + // + this.l_PasswordMeter7.AutoSize = true; + this.l_PasswordMeter7.Location = new System.Drawing.Point(28, 180); + this.l_PasswordMeter7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter7.Name = "l_PasswordMeter7"; + this.l_PasswordMeter7.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter7.TabIndex = 30; + this.l_PasswordMeter7.Text = "METER7:"; + // + // l_PasswordMeter6 + // + this.l_PasswordMeter6.AutoSize = true; + this.l_PasswordMeter6.Location = new System.Drawing.Point(28, 155); + this.l_PasswordMeter6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter6.Name = "l_PasswordMeter6"; + this.l_PasswordMeter6.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter6.TabIndex = 29; + this.l_PasswordMeter6.Text = "METER6:"; + // + // l_PasswordMeter5 + // + this.l_PasswordMeter5.AutoSize = true; + this.l_PasswordMeter5.Location = new System.Drawing.Point(28, 130); + this.l_PasswordMeter5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter5.Name = "l_PasswordMeter5"; + this.l_PasswordMeter5.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter5.TabIndex = 28; + this.l_PasswordMeter5.Text = "METER5:"; + // + // l_PasswordMeter4 + // + this.l_PasswordMeter4.AutoSize = true; + this.l_PasswordMeter4.Location = new System.Drawing.Point(28, 106); + this.l_PasswordMeter4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter4.Name = "l_PasswordMeter4"; + this.l_PasswordMeter4.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter4.TabIndex = 27; + this.l_PasswordMeter4.Text = "METER4:"; + // + // l_PasswordMeter3 + // + this.l_PasswordMeter3.AutoSize = true; + this.l_PasswordMeter3.Location = new System.Drawing.Point(28, 81); + this.l_PasswordMeter3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter3.Name = "l_PasswordMeter3"; + this.l_PasswordMeter3.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter3.TabIndex = 26; + this.l_PasswordMeter3.Text = "METER3:"; + // + // l_PasswordMeter2 + // + this.l_PasswordMeter2.AutoSize = true; + this.l_PasswordMeter2.Location = new System.Drawing.Point(28, 56); + this.l_PasswordMeter2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter2.Name = "l_PasswordMeter2"; + this.l_PasswordMeter2.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter2.TabIndex = 25; + this.l_PasswordMeter2.Text = "METER2:"; + // + // l_PasswordMeter1 + // + this.l_PasswordMeter1.AutoSize = true; + this.l_PasswordMeter1.Location = new System.Drawing.Point(28, 31); + this.l_PasswordMeter1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PasswordMeter1.Name = "l_PasswordMeter1"; + this.l_PasswordMeter1.Size = new System.Drawing.Size(54, 13); + this.l_PasswordMeter1.TabIndex = 24; + this.l_PasswordMeter1.Text = "METER1:"; + // + // gB_Settings_Preparation + // + this.gB_Settings_Preparation.Controls.Add(this.nUD_Settings_Samplerate); + this.gB_Settings_Preparation.Controls.Add(this.label1); + this.gB_Settings_Preparation.Controls.Add(this.nUD_Settings_Preparation_StabiTime); + this.gB_Settings_Preparation.Controls.Add(this.l_Settings_Preparation_StabiTime); + this.gB_Settings_Preparation.Location = new System.Drawing.Point(336, 270); + this.gB_Settings_Preparation.Margin = new System.Windows.Forms.Padding(2); + this.gB_Settings_Preparation.Name = "gB_Settings_Preparation"; + this.gB_Settings_Preparation.Padding = new System.Windows.Forms.Padding(2); + this.gB_Settings_Preparation.Size = new System.Drawing.Size(272, 87); + this.gB_Settings_Preparation.TabIndex = 29; + this.gB_Settings_Preparation.TabStop = false; + this.gB_Settings_Preparation.Text = "Preparation"; + // + // nUD_Settings_Samplerate + // + this.nUD_Settings_Samplerate.Location = new System.Drawing.Point(168, 46); + this.nUD_Settings_Samplerate.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_Samplerate.Maximum = new decimal(new int[] { + 25, + 0, + 0, + 0}); + this.nUD_Settings_Samplerate.Minimum = new decimal(new int[] { + 10, + 0, + 0, + 0}); + this.nUD_Settings_Samplerate.Name = "nUD_Settings_Samplerate"; + this.nUD_Settings_Samplerate.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_Samplerate.TabIndex = 19; + this.nUD_Settings_Samplerate.Value = new decimal(new int[] { + 10, + 0, + 0, + 0}); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(24, 48); + this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(71, 13); + this.label1.TabIndex = 20; + this.label1.Text = "Sample Rate:"; + // + // nUD_Settings_Preparation_StabiTime + // + this.nUD_Settings_Preparation_StabiTime.Location = new System.Drawing.Point(168, 22); + this.nUD_Settings_Preparation_StabiTime.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_Preparation_StabiTime.Maximum = new decimal(new int[] { + 2000, + 0, + 0, + 0}); + this.nUD_Settings_Preparation_StabiTime.Minimum = new decimal(new int[] { + 5, + 0, + 0, + 0}); + this.nUD_Settings_Preparation_StabiTime.Name = "nUD_Settings_Preparation_StabiTime"; + this.nUD_Settings_Preparation_StabiTime.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_Preparation_StabiTime.TabIndex = 18; + this.nUD_Settings_Preparation_StabiTime.Value = new decimal(new int[] { + 6, + 0, + 0, + 0}); + // + // l_Settings_Preparation_StabiTime + // + this.l_Settings_Preparation_StabiTime.AutoSize = true; + this.l_Settings_Preparation_StabiTime.Location = new System.Drawing.Point(24, 24); + this.l_Settings_Preparation_StabiTime.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_Preparation_StabiTime.Name = "l_Settings_Preparation_StabiTime"; + this.l_Settings_Preparation_StabiTime.Size = new System.Drawing.Size(106, 13); + this.l_Settings_Preparation_StabiTime.TabIndex = 18; + this.l_Settings_Preparation_StabiTime.Text = "Stabilization Time (s):"; + // + // gB_Settings_ZeroflowOffsetTest + // + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.cB_OffsetTestLogFiles); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.l_Settings_ZeroflowOffsetTestActivityCheckInterval); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.l_Settings_ZeroflowOffsetTestNumberOfLines); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.nUD_Settings_ZeroflowOffsetTestNumberOfLines); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.l_Settings_ZeroFlowTestSettlingTime); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.nUD_Settings_ZeroflowOffsetTestSettlingTime); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.l_Settings_ZeroFlowTestOffsetLimit); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.nUD_Settings_ZeroflowOffsetTestOffsetLimit); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.l_Settings_ZeroflowOffsetTestLowerLimit); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.l_Settings_ZeroflowOffsetTestUpperLimit); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.nUD_Settings_ZeroflowOffsetTestLowerLimit); + this.gB_Settings_ZeroflowOffsetTest.Controls.Add(this.nUD_Settings_ZeroflowOffsetTestUpperLimit); + this.gB_Settings_ZeroflowOffsetTest.Location = new System.Drawing.Point(332, 28); + this.gB_Settings_ZeroflowOffsetTest.Margin = new System.Windows.Forms.Padding(2); + this.gB_Settings_ZeroflowOffsetTest.Name = "gB_Settings_ZeroflowOffsetTest"; + this.gB_Settings_ZeroflowOffsetTest.Padding = new System.Windows.Forms.Padding(2); + this.gB_Settings_ZeroflowOffsetTest.Size = new System.Drawing.Size(272, 229); + this.gB_Settings_ZeroflowOffsetTest.TabIndex = 28; + this.gB_Settings_ZeroflowOffsetTest.TabStop = false; + this.gB_Settings_ZeroflowOffsetTest.Text = "Zeroflow Offset Test"; + // + // cB_OffsetTestLogFiles + // + this.cB_OffsetTestLogFiles.AutoSize = true; + this.cB_OffsetTestLogFiles.Checked = true; + this.cB_OffsetTestLogFiles.CheckState = System.Windows.Forms.CheckState.Checked; + this.cB_OffsetTestLogFiles.Location = new System.Drawing.Point(58, 31); + this.cB_OffsetTestLogFiles.Margin = new System.Windows.Forms.Padding(2); + this.cB_OffsetTestLogFiles.Name = "cB_OffsetTestLogFiles"; + this.cB_OffsetTestLogFiles.Size = new System.Drawing.Size(115, 17); + this.cB_OffsetTestLogFiles.TabIndex = 18; + this.cB_OffsetTestLogFiles.Text = "Generate Log Files"; + this.cB_OffsetTestLogFiles.UseVisualStyleBackColor = true; + // + // nUD_Settings_ZeroflowOffsetTestActivityCheckInterval + // + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Location = new System.Drawing.Point(168, 192); + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Maximum = new decimal(new int[] { + 15, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Name = "nUD_Settings_ZeroflowOffsetTestActivityCheckInterval"; + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.TabIndex = 19; + this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + // + // l_Settings_ZeroflowOffsetTestActivityCheckInterval + // + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval.AutoSize = true; + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval.Location = new System.Drawing.Point(25, 194); + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval.Name = "l_Settings_ZeroflowOffsetTestActivityCheckInterval"; + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval.Size = new System.Drawing.Size(130, 13); + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval.TabIndex = 18; + this.l_Settings_ZeroflowOffsetTestActivityCheckInterval.Text = "Activity Check Interval (s):"; + // + // l_Settings_ZeroflowOffsetTestNumberOfLines + // + this.l_Settings_ZeroflowOffsetTestNumberOfLines.AutoSize = true; + this.l_Settings_ZeroflowOffsetTestNumberOfLines.Location = new System.Drawing.Point(25, 170); + this.l_Settings_ZeroflowOffsetTestNumberOfLines.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_ZeroflowOffsetTestNumberOfLines.Name = "l_Settings_ZeroflowOffsetTestNumberOfLines"; + this.l_Settings_ZeroflowOffsetTestNumberOfLines.Size = new System.Drawing.Size(83, 13); + this.l_Settings_ZeroflowOffsetTestNumberOfLines.TabIndex = 17; + this.l_Settings_ZeroflowOffsetTestNumberOfLines.Text = "Number of lines:"; + // + // nUD_Settings_ZeroflowOffsetTestNumberOfLines + // + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.Location = new System.Drawing.Point(168, 168); + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.Maximum = new decimal(new int[] { + 50000, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.Name = "nUD_Settings_ZeroflowOffsetTestNumberOfLines"; + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.TabIndex = 16; + this.nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value = new decimal(new int[] { + 9000, + 0, + 0, + 0}); + // + // l_Settings_ZeroFlowTestSettlingTime + // + this.l_Settings_ZeroFlowTestSettlingTime.AutoSize = true; + this.l_Settings_ZeroFlowTestSettlingTime.Location = new System.Drawing.Point(25, 144); + this.l_Settings_ZeroFlowTestSettlingTime.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_ZeroFlowTestSettlingTime.Name = "l_Settings_ZeroFlowTestSettlingTime"; + this.l_Settings_ZeroFlowTestSettlingTime.Size = new System.Drawing.Size(81, 13); + this.l_Settings_ZeroFlowTestSettlingTime.TabIndex = 15; + this.l_Settings_ZeroFlowTestSettlingTime.Text = "Settling time (s):"; + // + // nUD_Settings_ZeroflowOffsetTestSettlingTime + // + this.nUD_Settings_ZeroflowOffsetTestSettlingTime.Location = new System.Drawing.Point(168, 142); + this.nUD_Settings_ZeroflowOffsetTestSettlingTime.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_ZeroflowOffsetTestSettlingTime.Maximum = new decimal(new int[] { + 2000, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestSettlingTime.Name = "nUD_Settings_ZeroflowOffsetTestSettlingTime"; + this.nUD_Settings_ZeroflowOffsetTestSettlingTime.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_ZeroflowOffsetTestSettlingTime.TabIndex = 14; + this.nUD_Settings_ZeroflowOffsetTestSettlingTime.Value = new decimal(new int[] { + 60, + 0, + 0, + 0}); + // + // l_Settings_ZeroFlowTestOffsetLimit + // + this.l_Settings_ZeroFlowTestOffsetLimit.AutoSize = true; + this.l_Settings_ZeroFlowTestOffsetLimit.Location = new System.Drawing.Point(25, 119); + this.l_Settings_ZeroFlowTestOffsetLimit.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_ZeroFlowTestOffsetLimit.Name = "l_Settings_ZeroFlowTestOffsetLimit"; + this.l_Settings_ZeroFlowTestOffsetLimit.Size = new System.Drawing.Size(82, 13); + this.l_Settings_ZeroFlowTestOffsetLimit.TabIndex = 13; + this.l_Settings_ZeroFlowTestOffsetLimit.Text = "Offset Limit (ps):"; + // + // nUD_Settings_ZeroflowOffsetTestOffsetLimit + // + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.Location = new System.Drawing.Point(168, 117); + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.Maximum = new decimal(new int[] { + 600, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.Minimum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.Name = "nUD_Settings_ZeroflowOffsetTestOffsetLimit"; + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.TabIndex = 12; + this.nUD_Settings_ZeroflowOffsetTestOffsetLimit.Value = new decimal(new int[] { + 300, + 0, + 0, + 0}); + // + // l_Settings_ZeroflowOffsetTestLowerLimit + // + this.l_Settings_ZeroflowOffsetTestLowerLimit.AutoSize = true; + this.l_Settings_ZeroflowOffsetTestLowerLimit.Location = new System.Drawing.Point(24, 95); + this.l_Settings_ZeroflowOffsetTestLowerLimit.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_ZeroflowOffsetTestLowerLimit.Name = "l_Settings_ZeroflowOffsetTestLowerLimit"; + this.l_Settings_ZeroflowOffsetTestLowerLimit.Size = new System.Drawing.Size(126, 13); + this.l_Settings_ZeroflowOffsetTestLowerLimit.TabIndex = 3; + this.l_Settings_ZeroflowOffsetTestLowerLimit.Text = "Lower Voltage Limit (mV):"; + // + // l_Settings_ZeroflowOffsetTestUpperLimit + // + this.l_Settings_ZeroflowOffsetTestUpperLimit.AutoSize = true; + this.l_Settings_ZeroflowOffsetTestUpperLimit.Location = new System.Drawing.Point(24, 67); + this.l_Settings_ZeroflowOffsetTestUpperLimit.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_ZeroflowOffsetTestUpperLimit.Name = "l_Settings_ZeroflowOffsetTestUpperLimit"; + this.l_Settings_ZeroflowOffsetTestUpperLimit.Size = new System.Drawing.Size(126, 13); + this.l_Settings_ZeroflowOffsetTestUpperLimit.TabIndex = 2; + this.l_Settings_ZeroflowOffsetTestUpperLimit.Text = "Upper Voltage Limit (mV):"; + // + // nUD_Settings_ZeroflowOffsetTestLowerLimit + // + this.nUD_Settings_ZeroflowOffsetTestLowerLimit.Location = new System.Drawing.Point(168, 91); + this.nUD_Settings_ZeroflowOffsetTestLowerLimit.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_ZeroflowOffsetTestLowerLimit.Maximum = new decimal(new int[] { + 600, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestLowerLimit.Name = "nUD_Settings_ZeroflowOffsetTestLowerLimit"; + this.nUD_Settings_ZeroflowOffsetTestLowerLimit.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_ZeroflowOffsetTestLowerLimit.TabIndex = 1; + this.nUD_Settings_ZeroflowOffsetTestLowerLimit.Value = new decimal(new int[] { + 200, + 0, + 0, + 0}); + // + // nUD_Settings_ZeroflowOffsetTestUpperLimit + // + this.nUD_Settings_ZeroflowOffsetTestUpperLimit.Location = new System.Drawing.Point(168, 67); + this.nUD_Settings_ZeroflowOffsetTestUpperLimit.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_ZeroflowOffsetTestUpperLimit.Maximum = new decimal(new int[] { + 3000, + 0, + 0, + 0}); + this.nUD_Settings_ZeroflowOffsetTestUpperLimit.Name = "nUD_Settings_ZeroflowOffsetTestUpperLimit"; + this.nUD_Settings_ZeroflowOffsetTestUpperLimit.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_ZeroflowOffsetTestUpperLimit.TabIndex = 0; + this.nUD_Settings_ZeroflowOffsetTestUpperLimit.Value = new decimal(new int[] { + 650, + 0, + 0, + 0}); + // + // gB_Settings_AmplitudeTest + // + this.gB_Settings_AmplitudeTest.Controls.Add(this.cB_AmpLogFiles); + this.gB_Settings_AmplitudeTest.Controls.Add(this.nUD_Settings_AmplitudeActivityCheckInterval); + this.gB_Settings_AmplitudeTest.Controls.Add(this.l_Settings_AmplitudeActivityCheckInterval); + this.gB_Settings_AmplitudeTest.Controls.Add(this.cB_MeanAmplitudeFiles); + this.gB_Settings_AmplitudeTest.Controls.Add(this.nUD_PercentageStop); + this.gB_Settings_AmplitudeTest.Controls.Add(this.l_PercentageStop); + this.gB_Settings_AmplitudeTest.Controls.Add(this.l_PercentageStart); + this.gB_Settings_AmplitudeTest.Controls.Add(this.nUD_PercentageStart); + this.gB_Settings_AmplitudeTest.Controls.Add(this.l__Settings_AmplitudeTestMinDistance); + this.gB_Settings_AmplitudeTest.Controls.Add(this.nUD_Settings_AmplitudeTestMinDistance); + this.gB_Settings_AmplitudeTest.Controls.Add(this.l_Settings_AmplitudeTestLowerLimit); + this.gB_Settings_AmplitudeTest.Controls.Add(this.l_Settings_AmplitudeTestUpperLimit); + this.gB_Settings_AmplitudeTest.Controls.Add(this.nUD_Settings_AmplitudeTestLowerLimit); + this.gB_Settings_AmplitudeTest.Controls.Add(this.nUD_Settings_AmplitudeTestUpperLimit); + this.gB_Settings_AmplitudeTest.Location = new System.Drawing.Point(40, 28); + this.gB_Settings_AmplitudeTest.Margin = new System.Windows.Forms.Padding(2); + this.gB_Settings_AmplitudeTest.Name = "gB_Settings_AmplitudeTest"; + this.gB_Settings_AmplitudeTest.Padding = new System.Windows.Forms.Padding(2); + this.gB_Settings_AmplitudeTest.Size = new System.Drawing.Size(272, 320); + this.gB_Settings_AmplitudeTest.TabIndex = 27; + this.gB_Settings_AmplitudeTest.TabStop = false; + this.gB_Settings_AmplitudeTest.Text = "Amplitude Test"; + // + // cB_AmpLogFiles + // + this.cB_AmpLogFiles.AutoSize = true; + this.cB_AmpLogFiles.Checked = true; + this.cB_AmpLogFiles.CheckState = System.Windows.Forms.CheckState.Checked; + this.cB_AmpLogFiles.Location = new System.Drawing.Point(42, 38); + this.cB_AmpLogFiles.Margin = new System.Windows.Forms.Padding(2); + this.cB_AmpLogFiles.Name = "cB_AmpLogFiles"; + this.cB_AmpLogFiles.Size = new System.Drawing.Size(115, 17); + this.cB_AmpLogFiles.TabIndex = 20; + this.cB_AmpLogFiles.Text = "Generate Log Files"; + this.cB_AmpLogFiles.UseVisualStyleBackColor = true; + // + // nUD_Settings_AmplitudeActivityCheckInterval + // + this.nUD_Settings_AmplitudeActivityCheckInterval.Location = new System.Drawing.Point(168, 283); + this.nUD_Settings_AmplitudeActivityCheckInterval.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_AmplitudeActivityCheckInterval.Maximum = new decimal(new int[] { + 15, + 0, + 0, + 0}); + this.nUD_Settings_AmplitudeActivityCheckInterval.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nUD_Settings_AmplitudeActivityCheckInterval.Name = "nUD_Settings_AmplitudeActivityCheckInterval"; + this.nUD_Settings_AmplitudeActivityCheckInterval.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_AmplitudeActivityCheckInterval.TabIndex = 20; + this.nUD_Settings_AmplitudeActivityCheckInterval.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + // + // l_Settings_AmplitudeActivityCheckInterval + // + this.l_Settings_AmplitudeActivityCheckInterval.AutoSize = true; + this.l_Settings_AmplitudeActivityCheckInterval.Location = new System.Drawing.Point(19, 283); + this.l_Settings_AmplitudeActivityCheckInterval.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_AmplitudeActivityCheckInterval.Name = "l_Settings_AmplitudeActivityCheckInterval"; + this.l_Settings_AmplitudeActivityCheckInterval.Size = new System.Drawing.Size(130, 13); + this.l_Settings_AmplitudeActivityCheckInterval.TabIndex = 20; + this.l_Settings_AmplitudeActivityCheckInterval.Text = "Activity Check Interval (s):"; + // + // cB_MeanAmplitudeFiles + // + this.cB_MeanAmplitudeFiles.AutoSize = true; + this.cB_MeanAmplitudeFiles.Checked = true; + this.cB_MeanAmplitudeFiles.CheckState = System.Windows.Forms.CheckState.Checked; + this.cB_MeanAmplitudeFiles.Location = new System.Drawing.Point(43, 67); + this.cB_MeanAmplitudeFiles.Margin = new System.Windows.Forms.Padding(2); + this.cB_MeanAmplitudeFiles.Name = "cB_MeanAmplitudeFiles"; + this.cB_MeanAmplitudeFiles.Size = new System.Drawing.Size(154, 17); + this.cB_MeanAmplitudeFiles.TabIndex = 10; + this.cB_MeanAmplitudeFiles.Text = "Generate Mean Value Files"; + this.cB_MeanAmplitudeFiles.UseVisualStyleBackColor = true; + // + // nUD_PercentageStop + // + this.nUD_PercentageStop.Location = new System.Drawing.Point(168, 250); + this.nUD_PercentageStop.Margin = new System.Windows.Forms.Padding(2); + this.nUD_PercentageStop.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nUD_PercentageStop.Minimum = new decimal(new int[] { + 30, + 0, + 0, + 0}); + this.nUD_PercentageStop.Name = "nUD_PercentageStop"; + this.nUD_PercentageStop.Size = new System.Drawing.Size(62, 20); + this.nUD_PercentageStop.TabIndex = 9; + this.nUD_PercentageStop.Value = new decimal(new int[] { + 35, + 0, + 0, + 0}); + // + // l_PercentageStop + // + this.l_PercentageStop.AutoSize = true; + this.l_PercentageStop.Location = new System.Drawing.Point(19, 250); + this.l_PercentageStop.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PercentageStop.Name = "l_PercentageStop"; + this.l_PercentageStop.Size = new System.Drawing.Size(120, 13); + this.l_PercentageStop.TabIndex = 8; + this.l_PercentageStop.Text = "Percentage Stop Value:"; + // + // l_PercentageStart + // + this.l_PercentageStart.AutoSize = true; + this.l_PercentageStart.Location = new System.Drawing.Point(19, 216); + this.l_PercentageStart.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_PercentageStart.Name = "l_PercentageStart"; + this.l_PercentageStart.Size = new System.Drawing.Size(120, 13); + this.l_PercentageStart.TabIndex = 7; + this.l_PercentageStart.Text = "Percentage Start Value:"; + // + // nUD_PercentageStart + // + this.nUD_PercentageStart.Location = new System.Drawing.Point(168, 216); + this.nUD_PercentageStart.Margin = new System.Windows.Forms.Padding(2); + this.nUD_PercentageStart.Maximum = new decimal(new int[] { + 20, + 0, + 0, + 0}); + this.nUD_PercentageStart.Name = "nUD_PercentageStart"; + this.nUD_PercentageStart.Size = new System.Drawing.Size(62, 20); + this.nUD_PercentageStart.TabIndex = 6; + this.nUD_PercentageStart.Value = new decimal(new int[] { + 5, + 0, + 0, + 0}); + // + // l__Settings_AmplitudeTestMinDistance + // + this.l__Settings_AmplitudeTestMinDistance.AutoSize = true; + this.l__Settings_AmplitudeTestMinDistance.Location = new System.Drawing.Point(19, 182); + this.l__Settings_AmplitudeTestMinDistance.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l__Settings_AmplitudeTestMinDistance.Name = "l__Settings_AmplitudeTestMinDistance"; + this.l__Settings_AmplitudeTestMinDistance.Size = new System.Drawing.Size(74, 13); + this.l__Settings_AmplitudeTestMinDistance.TabIndex = 5; + this.l__Settings_AmplitudeTestMinDistance.Text = "min. Distance:"; + // + // nUD_Settings_AmplitudeTestMinDistance + // + this.nUD_Settings_AmplitudeTestMinDistance.Location = new System.Drawing.Point(168, 182); + this.nUD_Settings_AmplitudeTestMinDistance.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_AmplitudeTestMinDistance.Maximum = new decimal(new int[] { + 10, + 0, + 0, + 0}); + this.nUD_Settings_AmplitudeTestMinDistance.Name = "nUD_Settings_AmplitudeTestMinDistance"; + this.nUD_Settings_AmplitudeTestMinDistance.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_AmplitudeTestMinDistance.TabIndex = 4; + this.nUD_Settings_AmplitudeTestMinDistance.Value = new decimal(new int[] { + 7, + 0, + 0, + 0}); + // + // l_Settings_AmplitudeTestLowerLimit + // + this.l_Settings_AmplitudeTestLowerLimit.AutoSize = true; + this.l_Settings_AmplitudeTestLowerLimit.Location = new System.Drawing.Point(19, 149); + this.l_Settings_AmplitudeTestLowerLimit.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_AmplitudeTestLowerLimit.Name = "l_Settings_AmplitudeTestLowerLimit"; + this.l_Settings_AmplitudeTestLowerLimit.Size = new System.Drawing.Size(128, 13); + this.l_Settings_AmplitudeTestLowerLimit.TabIndex = 3; + this.l_Settings_AmplitudeTestLowerLimit.Text = "Optimal Point Lower Limit:"; + // + // l_Settings_AmplitudeTestUpperLimit + // + this.l_Settings_AmplitudeTestUpperLimit.AutoSize = true; + this.l_Settings_AmplitudeTestUpperLimit.Location = new System.Drawing.Point(19, 115); + this.l_Settings_AmplitudeTestUpperLimit.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Settings_AmplitudeTestUpperLimit.Name = "l_Settings_AmplitudeTestUpperLimit"; + this.l_Settings_AmplitudeTestUpperLimit.Size = new System.Drawing.Size(128, 13); + this.l_Settings_AmplitudeTestUpperLimit.TabIndex = 2; + this.l_Settings_AmplitudeTestUpperLimit.Text = "Optimal Point Upper Limit:"; + // + // nUD_Settings_AmplitudeTestLowerLimit + // + this.nUD_Settings_AmplitudeTestLowerLimit.Location = new System.Drawing.Point(168, 149); + this.nUD_Settings_AmplitudeTestLowerLimit.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_AmplitudeTestLowerLimit.Maximum = new decimal(new int[] { + 30, + 0, + 0, + 0}); + this.nUD_Settings_AmplitudeTestLowerLimit.Name = "nUD_Settings_AmplitudeTestLowerLimit"; + this.nUD_Settings_AmplitudeTestLowerLimit.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_AmplitudeTestLowerLimit.TabIndex = 1; + this.nUD_Settings_AmplitudeTestLowerLimit.Value = new decimal(new int[] { + 12, + 0, + 0, + 0}); + // + // nUD_Settings_AmplitudeTestUpperLimit + // + this.nUD_Settings_AmplitudeTestUpperLimit.Location = new System.Drawing.Point(168, 115); + this.nUD_Settings_AmplitudeTestUpperLimit.Margin = new System.Windows.Forms.Padding(2); + this.nUD_Settings_AmplitudeTestUpperLimit.Maximum = new decimal(new int[] { + 40, + 0, + 0, + 0}); + this.nUD_Settings_AmplitudeTestUpperLimit.Name = "nUD_Settings_AmplitudeTestUpperLimit"; + this.nUD_Settings_AmplitudeTestUpperLimit.Size = new System.Drawing.Size(62, 20); + this.nUD_Settings_AmplitudeTestUpperLimit.TabIndex = 0; + this.nUD_Settings_AmplitudeTestUpperLimit.Value = new decimal(new int[] { + 32, + 0, + 0, + 0}); + // + // pB_Logo3 + // + this.pB_Logo3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pB_Logo3.Image = ((System.Drawing.Image)(resources.GetObject("pB_Logo3.Image"))); + this.pB_Logo3.InitialImage = null; + this.pB_Logo3.Location = new System.Drawing.Point(887, 21); + this.pB_Logo3.Margin = new System.Windows.Forms.Padding(2); + this.pB_Logo3.Name = "pB_Logo3"; + this.pB_Logo3.Size = new System.Drawing.Size(91, 38); + this.pB_Logo3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Logo3.TabIndex = 31; + this.pB_Logo3.TabStop = false; + // + // pB_AvailableImages + // + this.pB_AvailableImages.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pB_AvailableImages.BackColor = System.Drawing.Color.Transparent; + this.pB_AvailableImages.Image = ((System.Drawing.Image)(resources.GetObject("pB_AvailableImages.Image"))); + this.pB_AvailableImages.Location = new System.Drawing.Point(910, 82); + this.pB_AvailableImages.Margin = new System.Windows.Forms.Padding(2); + this.pB_AvailableImages.Name = "pB_AvailableImages"; + this.pB_AvailableImages.Size = new System.Drawing.Size(53, 40); + this.pB_AvailableImages.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_AvailableImages.TabIndex = 26; + this.pB_AvailableImages.TabStop = false; + // + // tab_About + // + this.tab_About.BackColor = System.Drawing.Color.Honeydew; + this.tab_About.Controls.Add(this.pictureBox3); + this.tab_About.Controls.Add(this.pictureBox2); + this.tab_About.Controls.Add(this.l_BasedOn); + this.tab_About.Controls.Add(this.l_Author); + this.tab_About.Controls.Add(this.pB_DocumentVersion); + this.tab_About.Controls.Add(this.pB_Logo2); + this.tab_About.Controls.Add(this.l_Version); + this.tab_About.Controls.Add(this.l_About_Info); + this.tab_About.Controls.Add(this.l_About_Author); + this.tab_About.Controls.Add(this.l_About_Version); + this.tab_About.Location = new System.Drawing.Point(4, 22); + this.tab_About.Margin = new System.Windows.Forms.Padding(2); + this.tab_About.Name = "tab_About"; + this.tab_About.Padding = new System.Windows.Forms.Padding(2); + this.tab_About.Size = new System.Drawing.Size(1028, 652); + this.tab_About.TabIndex = 7; + this.tab_About.Text = "About"; + // + // pictureBox3 + // + this.pictureBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBox3.BackColor = System.Drawing.Color.Transparent; + this.pictureBox3.ErrorImage = ((System.Drawing.Image)(resources.GetObject("pictureBox3.ErrorImage"))); + this.pictureBox3.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox3.Image"))); + this.pictureBox3.InitialImage = ((System.Drawing.Image)(resources.GetObject("pictureBox3.InitialImage"))); + this.pictureBox3.Location = new System.Drawing.Point(907, 83); + this.pictureBox3.Margin = new System.Windows.Forms.Padding(2); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.Size = new System.Drawing.Size(53, 40); + this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox3.TabIndex = 55; + this.pictureBox3.TabStop = false; + // + // pictureBox2 + // + this.pictureBox2.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox2.Image"))); + this.pictureBox2.Location = new System.Drawing.Point(564, 222); + this.pictureBox2.Margin = new System.Windows.Forms.Padding(2); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(340, 362); + this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox2.TabIndex = 54; + this.pictureBox2.TabStop = false; + // + // l_BasedOn + // + this.l_BasedOn.AutoSize = true; + this.l_BasedOn.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_BasedOn.Location = new System.Drawing.Point(150, 192); + this.l_BasedOn.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_BasedOn.Name = "l_BasedOn"; + this.l_BasedOn.Size = new System.Drawing.Size(81, 20); + this.l_BasedOn.TabIndex = 9; + this.l_BasedOn.Text = "Based on:"; + // + // l_Author + // + this.l_Author.AutoSize = true; + this.l_Author.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_Author.Location = new System.Drawing.Point(231, 133); + this.l_Author.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Author.Name = "l_Author"; + this.l_Author.Size = new System.Drawing.Size(0, 20); + this.l_Author.TabIndex = 7; + // + // pB_DocumentVersion + // + this.pB_DocumentVersion.Image = ((System.Drawing.Image)(resources.GetObject("pB_DocumentVersion.Image"))); + this.pB_DocumentVersion.Location = new System.Drawing.Point(84, 222); + this.pB_DocumentVersion.Margin = new System.Windows.Forms.Padding(2); + this.pB_DocumentVersion.Name = "pB_DocumentVersion"; + this.pB_DocumentVersion.Size = new System.Drawing.Size(449, 277); + this.pB_DocumentVersion.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_DocumentVersion.TabIndex = 6; + this.pB_DocumentVersion.TabStop = false; + // + // pB_Logo2 + // + this.pB_Logo2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pB_Logo2.Image = ((System.Drawing.Image)(resources.GetObject("pB_Logo2.Image"))); + this.pB_Logo2.InitialImage = null; + this.pB_Logo2.Location = new System.Drawing.Point(887, 21); + this.pB_Logo2.Margin = new System.Windows.Forms.Padding(2); + this.pB_Logo2.Name = "pB_Logo2"; + this.pB_Logo2.Size = new System.Drawing.Size(91, 38); + this.pB_Logo2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Logo2.TabIndex = 5; + this.pB_Logo2.TabStop = false; + // + // l_Version + // + this.l_Version.AutoSize = true; + this.l_Version.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_Version.Location = new System.Drawing.Point(168, 108); + this.l_Version.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_Version.Name = "l_Version"; + this.l_Version.Size = new System.Drawing.Size(188, 20); + this.l_Version.TabIndex = 4; + this.l_Version.Text = "Version 0.22/ 2019-02-08"; + // + // l_About_Info + // + this.l_About_Info.AutoSize = true; + this.l_About_Info.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_About_Info.Location = new System.Drawing.Point(150, 516); + this.l_About_Info.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_About_Info.Name = "l_About_Info"; + this.l_About_Info.Size = new System.Drawing.Size(295, 20); + this.l_About_Info.TabIndex = 3; + this.l_About_Info.Text = "Supports GENESIS protocol version \"h\""; + // + // l_About_Author + // + this.l_About_Author.AutoSize = true; + this.l_About_Author.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_About_Author.Location = new System.Drawing.Point(370, 246); + this.l_About_Author.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_About_Author.Name = "l_About_Author"; + this.l_About_Author.Size = new System.Drawing.Size(13, 20); + this.l_About_Author.TabIndex = 2; + this.l_About_Author.Text = " "; + // + // l_About_Version + // + this.l_About_Version.AutoSize = true; + this.l_About_Version.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_About_Version.Location = new System.Drawing.Point(162, 54); + this.l_About_Version.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_About_Version.Name = "l_About_Version"; + this.l_About_Version.Size = new System.Drawing.Size(540, 37); + this.l_About_Version.TabIndex = 1; + this.l_About_Version.Text = "GENESIS Zeroflow calibration tool"; + // + // tab_ZeroFlowCal + // + this.tab_ZeroFlowCal.AutoScroll = true; + this.tab_ZeroFlowCal.BackColor = System.Drawing.Color.Honeydew; + this.tab_ZeroFlowCal.Location = new System.Drawing.Point(4, 22); + this.tab_ZeroFlowCal.Margin = new System.Windows.Forms.Padding(10); + this.tab_ZeroFlowCal.Name = "tab_ZeroFlowCal"; + this.tab_ZeroFlowCal.Padding = new System.Windows.Forms.Padding(2); + this.tab_ZeroFlowCal.Size = new System.Drawing.Size(1028, 652); + this.tab_ZeroFlowCal.TabIndex = 15; + this.tab_ZeroFlowCal.Text = "Zero flow calibration"; + this.tab_ZeroFlowCal.Click += new System.EventHandler(this.tab_ZeroFlowCal_Click); + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.richTextBox1); + this.tabPage1.Controls.Add(this.button1); + this.tabPage1.Controls.Add(this.gB_TempMeters); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(1028, 652); + this.tabPage1.TabIndex = 16; + this.tabPage1.Text = "tabPage1"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // richTextBox1 + // + this.richTextBox1.Location = new System.Drawing.Point(6, 355); + this.richTextBox1.Name = "richTextBox1"; + this.richTextBox1.Size = new System.Drawing.Size(861, 272); + this.richTextBox1.TabIndex = 75; + this.richTextBox1.Text = ""; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(6, 309); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(861, 40); + this.button1.TabIndex = 74; + this.button1.Text = "GetLogs"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // gB_TempMeters + // + this.gB_TempMeters.Controls.Add(this.nudTempSlot); + this.gB_TempMeters.Controls.Add(this.btnTempRaspi); + this.gB_TempMeters.Controls.Add(this.btn_LoadTempe); + this.gB_TempMeters.Location = new System.Drawing.Point(4, 13); + this.gB_TempMeters.Margin = new System.Windows.Forms.Padding(10); + this.gB_TempMeters.Name = "gB_TempMeters"; + this.gB_TempMeters.Padding = new System.Windows.Forms.Padding(2); + this.gB_TempMeters.Size = new System.Drawing.Size(863, 274); + this.gB_TempMeters.TabIndex = 73; + this.gB_TempMeters.TabStop = false; + this.gB_TempMeters.Text = "Temp. Meters"; + // + // nudTempSlot + // + this.nudTempSlot.Location = new System.Drawing.Point(17, 214); + this.nudTempSlot.Name = "nudTempSlot"; + this.nudTempSlot.Size = new System.Drawing.Size(280, 20); + this.nudTempSlot.TabIndex = 97; + // + // btnTempRaspi + // + this.btnTempRaspi.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnTempRaspi.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnTempRaspi.Location = new System.Drawing.Point(159, 239); + this.btnTempRaspi.Margin = new System.Windows.Forms.Padding(2); + this.btnTempRaspi.Name = "btnTempRaspi"; + this.btnTempRaspi.Size = new System.Drawing.Size(138, 31); + this.btnTempRaspi.TabIndex = 96; + this.btnTempRaspi.Text = "loadTemp (TOF)"; + this.btnTempRaspi.UseVisualStyleBackColor = true; + this.btnTempRaspi.Click += new System.EventHandler(this.btnTempRaspi_Click); + // + // btn_LoadTempe + // + this.btn_LoadTempe.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btn_LoadTempe.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_LoadTempe.Location = new System.Drawing.Point(17, 239); + this.btn_LoadTempe.Margin = new System.Windows.Forms.Padding(2); + this.btn_LoadTempe.Name = "btn_LoadTempe"; + this.btn_LoadTempe.Size = new System.Drawing.Size(138, 31); + this.btn_LoadTempe.TabIndex = 95; + this.btn_LoadTempe.Text = "loadTemp (@H)"; + this.btn_LoadTempe.UseVisualStyleBackColor = true; + this.btn_LoadTempe.Click += new System.EventHandler(this.btn_LoadTempe_Click); + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1058, 688); + this.Controls.Add(this.tab_Maintab); + this.Name = "MainForm"; + this.Text = "Form1"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); + this.Load += new System.EventHandler(this.MainForm_Load); + this.tab_Maintab.ResumeLayout(false); + this.tab_Report.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.groupBox_report.ResumeLayout(false); + this.gB_ReportTitlepage.ResumeLayout(false); + this.gB_ReportTitlepage.PerformLayout(); + this.tab_Settings.ResumeLayout(false); + this.tab_Settings.PerformLayout(); + this.gB_ComportSetup.ResumeLayout(false); + this.gB_SettingsTempMonitor.ResumeLayout(false); + this.gB_SettingsTempMonitor.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsTempMonitorDeviation)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsTempMonitorLowerValue)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_SettingsTempMonitorUpperValue)).EndInit(); + this.gB_Settings_TemperatureCalibration.ResumeLayout(false); + this.gB_Settings_TemperatureCalibration.PerformLayout(); + this.gB_Passwords.ResumeLayout(false); + this.gB_Passwords.PerformLayout(); + this.gB_Settings_Preparation.ResumeLayout(false); + this.gB_Settings_Preparation.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_Samplerate)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_Preparation_StabiTime)).EndInit(); + this.gB_Settings_ZeroflowOffsetTest.ResumeLayout(false); + this.gB_Settings_ZeroflowOffsetTest.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestActivityCheckInterval)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestNumberOfLines)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestSettlingTime)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestOffsetLimit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestLowerLimit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_ZeroflowOffsetTestUpperLimit)).EndInit(); + this.gB_Settings_AmplitudeTest.ResumeLayout(false); + this.gB_Settings_AmplitudeTest.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeActivityCheckInterval)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_PercentageStop)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_PercentageStart)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeTestMinDistance)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeTestLowerLimit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nUD_Settings_AmplitudeTestUpperLimit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Logo3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_AvailableImages)).EndInit(); + this.tab_About.ResumeLayout(false); + this.tab_About.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_DocumentVersion)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Logo2)).EndInit(); + this.tabPage1.ResumeLayout(false); + this.gB_TempMeters.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.nudTempSlot)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TabControl tab_Maintab; + private System.Windows.Forms.TabPage tab_Report; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.GroupBox groupBox_report; + private System.Windows.Forms.GroupBox gB_ReportTitlepage; + private System.Windows.Forms.RichTextBox rTB_ReportEnterSerialNumber; + private System.Windows.Forms.Label label_Report_EnterSerialNumber; + private System.Windows.Forms.Label l_ReportIntro; + private System.Windows.Forms.RichTextBox rtB_ReportTitlepageIntro; + private System.Windows.Forms.RichTextBox rTB_ReportEnterTitle; + private System.Windows.Forms.Label label_Report_EnterTitle; + private System.Windows.Forms.Label label_Report_EnterOperator; + private System.Windows.Forms.RichTextBox rTB_ReportEnterDate; + private System.Windows.Forms.RichTextBox rTB_ReportEnterOperator; + private System.Windows.Forms.Label label_Report_EnterDate; + private System.Windows.Forms.Button btn_Report_Generate; + private System.Windows.Forms.TabPage tab_Settings; + private System.Windows.Forms.CheckBox cB_SinglePath; + private System.Windows.Forms.ListBox lbLanguage; + private System.Windows.Forms.GroupBox gB_ComportSetup; + private System.Windows.Forms.Button BtnOpenSetup; + private System.Windows.Forms.GroupBox gB_SettingsTempMonitor; + private System.Windows.Forms.NumericUpDown nUD_SettingsTempMonitorDeviation; + private System.Windows.Forms.NumericUpDown nUD_SettingsTempMonitorLowerValue; + private System.Windows.Forms.NumericUpDown nUD_SettingsTempMonitorUpperValue; + private System.Windows.Forms.Label l_SettingsTempMonitorDeviation; + private System.Windows.Forms.Label l_SettingsTempMonitorLowerValue; + private System.Windows.Forms.Label l_SettingsTempMonitorUpperValue; + private System.Windows.Forms.GroupBox gB_Settings_TemperatureCalibration; + private System.Windows.Forms.CheckBox cB_TempManualAcquisition; + private System.Windows.Forms.Label lThermo2; + private System.Windows.Forms.Label lPasswordThermo1; + private System.Windows.Forms.TextBox tB_PasswordThermo2; + private System.Windows.Forms.TextBox tB_PasswordThermo1; + private System.Windows.Forms.GroupBox gB_Passwords; + private System.Windows.Forms.TextBox tB_PasswordMeter5; + private System.Windows.Forms.TextBox tB_PasswordMeter10; + private System.Windows.Forms.TextBox tB_PasswordMeter9; + private System.Windows.Forms.TextBox tB_PasswordMeter8; + private System.Windows.Forms.TextBox tB_PasswordMeter7; + private System.Windows.Forms.TextBox tB_PasswordMeter6; + private System.Windows.Forms.TextBox tB_PasswordMeter4; + private System.Windows.Forms.TextBox tB_PasswordMeter3; + private System.Windows.Forms.TextBox tB_PasswordMeter2; + private System.Windows.Forms.TextBox tB_PasswordMeter1; + private System.Windows.Forms.Label l_PasswordMeter10; + private System.Windows.Forms.Label l_PasswordMeter9; + private System.Windows.Forms.Label l_PasswordMeter8; + private System.Windows.Forms.Label l_PasswordMeter7; + private System.Windows.Forms.Label l_PasswordMeter6; + private System.Windows.Forms.Label l_PasswordMeter5; + private System.Windows.Forms.Label l_PasswordMeter4; + private System.Windows.Forms.Label l_PasswordMeter3; + private System.Windows.Forms.Label l_PasswordMeter2; + private System.Windows.Forms.Label l_PasswordMeter1; + private System.Windows.Forms.GroupBox gB_Settings_Preparation; + private System.Windows.Forms.NumericUpDown nUD_Settings_Preparation_StabiTime; + private System.Windows.Forms.Label l_Settings_Preparation_StabiTime; + private System.Windows.Forms.GroupBox gB_Settings_ZeroflowOffsetTest; + private System.Windows.Forms.CheckBox cB_OffsetTestLogFiles; + private System.Windows.Forms.NumericUpDown nUD_Settings_ZeroflowOffsetTestActivityCheckInterval; + private System.Windows.Forms.Label l_Settings_ZeroflowOffsetTestActivityCheckInterval; + private System.Windows.Forms.Label l_Settings_ZeroflowOffsetTestNumberOfLines; + private System.Windows.Forms.NumericUpDown nUD_Settings_ZeroflowOffsetTestNumberOfLines; + private System.Windows.Forms.Label l_Settings_ZeroFlowTestSettlingTime; + private System.Windows.Forms.NumericUpDown nUD_Settings_ZeroflowOffsetTestSettlingTime; + private System.Windows.Forms.Label l_Settings_ZeroFlowTestOffsetLimit; + private System.Windows.Forms.NumericUpDown nUD_Settings_ZeroflowOffsetTestOffsetLimit; + private System.Windows.Forms.Label l_Settings_ZeroflowOffsetTestLowerLimit; + private System.Windows.Forms.Label l_Settings_ZeroflowOffsetTestUpperLimit; + private System.Windows.Forms.NumericUpDown nUD_Settings_ZeroflowOffsetTestLowerLimit; + private System.Windows.Forms.NumericUpDown nUD_Settings_ZeroflowOffsetTestUpperLimit; + private System.Windows.Forms.GroupBox gB_Settings_AmplitudeTest; + private System.Windows.Forms.CheckBox cB_AmpLogFiles; + private System.Windows.Forms.NumericUpDown nUD_Settings_AmplitudeActivityCheckInterval; + private System.Windows.Forms.Label l_Settings_AmplitudeActivityCheckInterval; + private System.Windows.Forms.CheckBox cB_MeanAmplitudeFiles; + private System.Windows.Forms.NumericUpDown nUD_PercentageStop; + private System.Windows.Forms.Label l_PercentageStop; + private System.Windows.Forms.Label l_PercentageStart; + private System.Windows.Forms.NumericUpDown nUD_PercentageStart; + private System.Windows.Forms.Label l__Settings_AmplitudeTestMinDistance; + private System.Windows.Forms.NumericUpDown nUD_Settings_AmplitudeTestMinDistance; + private System.Windows.Forms.Label l_Settings_AmplitudeTestLowerLimit; + private System.Windows.Forms.Label l_Settings_AmplitudeTestUpperLimit; + private System.Windows.Forms.NumericUpDown nUD_Settings_AmplitudeTestLowerLimit; + private System.Windows.Forms.NumericUpDown nUD_Settings_AmplitudeTestUpperLimit; + private System.Windows.Forms.PictureBox pB_Logo3; + private System.Windows.Forms.PictureBox pB_AvailableImages; + private System.Windows.Forms.TabPage tab_About; + private System.Windows.Forms.PictureBox pictureBox3; + private System.Windows.Forms.PictureBox pictureBox2; + private System.Windows.Forms.Label l_BasedOn; + private System.Windows.Forms.Label l_Author; + private System.Windows.Forms.PictureBox pB_DocumentVersion; + private System.Windows.Forms.PictureBox pB_Logo2; + private System.Windows.Forms.Label l_Version; + private System.Windows.Forms.Label l_About_Info; + private System.Windows.Forms.Label l_About_Author; + private System.Windows.Forms.Label l_About_Version; + private System.Windows.Forms.TabPage tab_ZeroFlowCal; + private System.Windows.Forms.CheckBox cB_TempOnly; + private System.Windows.Forms.NumericUpDown nUD_Settings_Samplerate; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.GroupBox gB_TempMeters; + private System.Windows.Forms.Button btn_LoadTempe; + private System.Windows.Forms.NumericUpDown nudTempSlot; + private System.Windows.Forms.Button btnTempRaspi; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.RichTextBox richTextBox1; + } +} + diff --git a/GenesisCordonelInterface/UI/LaatzenAPI_CordonelPreadjustmentUI/FrmCordonelPreadjustmentUI.cs b/GenesisCordonelInterface/UI/LaatzenAPI_CordonelPreadjustmentUI/FrmCordonelPreadjustmentUI.cs new file mode 100644 index 000000000..789fb9ae0 --- /dev/null +++ b/GenesisCordonelInterface/UI/LaatzenAPI_CordonelPreadjustmentUI/FrmCordonelPreadjustmentUI.cs @@ -0,0 +1,275 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +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.WaterMeterCore; +using Xylem.Common.Ui.CordonelPreadjustmentUi; +using CordonelPreadjustmentUi; + +namespace GenesisCordonelInterface.UI.LaatzenAPI_CordonelPreadjustmentUI +{ + public partial class FrmCordonelPreadjustmentUI : Form + { + private PreAdjustmentControl preadjustCtl; + private PreAdjustmentSettingsContainer mainSettings = new PreAdjustmentSettingsContainer(); + public FrmCordonelPreadjustmentUI() + { + InitializeComponent(); + } + + private void MainForm_Load(object sender, EventArgs e) + { + + + preadjustCtl = new PreAdjustmentControl(mainSettings); + tab_ZeroFlowCal.Controls.Add(preadjustCtl); + + + + + cB_SinglePath.Checked = mainSettings.NumberOfPaths == 1 ? true : false; + nUD_SettingsTempMonitorLowerValue.Value = (decimal)mainSettings.LowerTempLimit; + nUD_SettingsTempMonitorUpperValue.Value = (decimal)mainSettings.UpperTempLimit; + nUD_SettingsTempMonitorDeviation.Value = (decimal)mainSettings.TempDeviationLimit; + // nUD_SettingsPreparationMetersize.Value = mainSettings.MeterSize.GetHashCode(); + + + cB_OffsetTestLogFiles.Checked = mainSettings.OffsetTestGenerateLogfiles; + nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Value = mainSettings.OffsetTestActivityCheckInverval; + nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value = mainSettings.OffsetTestNumberOfLines; + nUD_Settings_ZeroflowOffsetTestSettlingTime.Value = mainSettings.OffsetTestSettlingTime; + nUD_Settings_ZeroflowOffsetTestOffsetLimit.Value = mainSettings.OffsetTestOffsetLimitPS; + nUD_Settings_ZeroflowOffsetTestLowerLimit.Value = mainSettings.OffsetTestLowerVoltageLimitMV; + nUD_Settings_ZeroflowOffsetTestUpperLimit.Value = mainSettings.OffsetTestUpperVoltageLimitMV; + + cB_AmpLogFiles.Checked = mainSettings.AmpTestGenerateLogfiles; + nUD_Settings_AmplitudeActivityCheckInterval.Value = mainSettings.AmpTestActivityCheckInverval; + cB_MeanAmplitudeFiles.Checked = mainSettings.AmpTestGenerateMeanValuesFile; + nUD_PercentageStop.Value = mainSettings.AmpTestPercentageStop; + nUD_PercentageStart.Value = mainSettings.AmpTestPercentageStart; + nUD_Settings_AmplitudeTestMinDistance.Value = mainSettings.AmpTestAmpTestDistance; + + nUD_Settings_AmplitudeTestLowerLimit.Value = mainSettings.AmpTestFirstHitLevelPropMin; + nUD_Settings_AmplitudeTestUpperLimit.Value = mainSettings.AmpTestFirstHitLevelPropMax; + + + nUD_Settings_Samplerate.Value = mainSettings.Samplerate; + + + + } + + private void tab_Maintab_Selected(object sender, TabControlEventArgs e) + { + if (e.TabPage.Name == tab_ZeroFlowCal.Name) + { + try + { + var _serialConfigFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Genesis", ProgramConfig.SerialConfigFileName); + + + SlotConfig[] meterConfigList; + using (var tr = new StreamReader(_serialConfigFile)) + { + var _fileString = tr.ReadToEnd(); + meterConfigList = JsonConvert.DeserializeObject(_fileString); + } + mainSettings.Meters = new List(); + mainSettings.TempMeters = new List(); + foreach (var item in meterConfigList) + { + if (item.Type != SlotType.TemperatureMeter) + { + mainSettings.Meters.Add(item.Slot); + } + else + { + mainSettings.TempMeters.Add(item.Slot); + } + } + } + catch (Exception ex) + { + MessageBox.Show($"use default meters because of {ex.Message}"); + } + + + + + + mainSettings.NumberOfPaths = cB_SinglePath.Checked ? 1 : 3; + mainSettings.LowerTempLimit = (double)nUD_SettingsTempMonitorLowerValue.Value; + mainSettings.UpperTempLimit = (double)nUD_SettingsTempMonitorUpperValue.Value; + mainSettings.TempDeviationLimit = (double)nUD_SettingsTempMonitorDeviation.Value; + //mainSettings.MeterSize = (Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.Consts.MeterSize)nUD_SettingsPreparationMetersize.Value; + mainSettings.TempOnly = cB_TempOnly.Checked; + + mainSettings.SetTempUseTempFlansh(true); + + if (cB_TempManualAcquisition.Checked) + { + mainSettings.SetTempUseManualInput(true); + mainSettings.SetTempUseTempFlansh(false); + } + else + { + mainSettings.SetTempUseTempFlansh(true); + mainSettings.SetTempUseManualInput(false); + } + + + mainSettings.OffsetTestGenerateLogfiles = cB_OffsetTestLogFiles.Checked; + mainSettings.OffsetTestActivityCheckInverval = (int)nUD_Settings_ZeroflowOffsetTestActivityCheckInterval.Value; + mainSettings.OffsetTestNumberOfLines = (int)nUD_Settings_ZeroflowOffsetTestNumberOfLines.Value; + mainSettings.OffsetTestSettlingTime = (int)nUD_Settings_ZeroflowOffsetTestSettlingTime.Value; + mainSettings.OffsetTestOffsetLimitPS = (int)nUD_Settings_ZeroflowOffsetTestOffsetLimit.Value; + mainSettings.OffsetTestLowerVoltageLimitMV = (int)nUD_Settings_ZeroflowOffsetTestLowerLimit.Value; + mainSettings.OffsetTestUpperVoltageLimitMV = (int)nUD_Settings_ZeroflowOffsetTestUpperLimit.Value; + + mainSettings.AmpTestGenerateLogfiles = cB_AmpLogFiles.Checked; + mainSettings.AmpTestActivityCheckInverval = (int)nUD_Settings_AmplitudeActivityCheckInterval.Value; + mainSettings.AmpTestGenerateMeanValuesFile = cB_MeanAmplitudeFiles.Checked; + mainSettings.AmpTestPercentageStop = (int)nUD_PercentageStop.Value; + mainSettings.AmpTestPercentageStart = (int)nUD_PercentageStart.Value; + mainSettings.AmpTestAmpTestDistance = (int)nUD_Settings_AmplitudeTestMinDistance.Value; + + + mainSettings.AmpTestFirstHitLevelPropMin = (int)nUD_Settings_AmplitudeTestLowerLimit.Value; + mainSettings.AmpTestFirstHitLevelPropMax = (int)nUD_Settings_AmplitudeTestUpperLimit.Value; + + mainSettings.Samplerate = (int)nUD_Settings_Samplerate.Value; + + preadjustCtl.SetSettings(mainSettings); + + + } + + + + } + + private void MainForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (preadjustCtl != null) + { + preadjustCtl.CloseConnections(); + preadjustCtl.Dispose(); + } + if (ThermoMeterBatch != null) + { + ThermoMeterBatch.Dispose(); + } + if (TempMeterStateCtls != null) + { + foreach (var item in TempMeterStateCtls) + { + item.Dispose(); + } + + } + + + } + private MeterBatch ThermoMeterBatch = new MeterBatch(); + private List TempMeterStateCtls = new List(); + private void tmpStart(int slot, bool RaspiMode = false) + { + var ctlZehn = new TempMeterStateControl(slot); + ctlZehn.Location = new Point(5 + ((TempMeterStateCtls.Count + 1) * ctlZehn.Width), 15); + TempMeterStateCtls.Add(ctlZehn); + gB_TempMeters.Controls.Add(ctlZehn); + ctlZehn.Enabled = true; + + + + + var currentMeter = new ZeroFlowGenesisMeter(ctlZehn.Slot, 3, !RaspiMode); + + currentMeter.LogOnEnable = true; + currentMeter.LoginFailed = false; + currentMeter.PreparationFailed = false; + currentMeter.AmplitudeFailed = false; + currentMeter.ZeroFlowOffsetFailed = false; + currentMeter.AmplitudeFailed = false; + currentMeter.CompletionFailed = false; + currentMeter.Ok = false; + currentMeter.EmptyPipeCheckEnable = false; + currentMeter.EmptyPipeCheckFailed = false; + + ThermoMeterBatch.AddMeter(currentMeter); + ctlZehn.IsEnabled = true; + + + ctlZehn.Meter = currentMeter; + ctlZehn.EnableOpening = true; + + ctlZehn.Ok = ctlZehn.Meter.CheckStreamingPort(); + + ctlZehn.SetUi(); + + ctlZehn.Meter.StartRecordData(); + ctlZehn.Meter.LogRawData(true); + if (RaspiMode) + + { + ctlZehn.StartTempWatch(MeterStateControl.TempMode.CalcTof); + + } + else + { + ctlZehn.StartTempWatch(MeterStateControl.TempMode.Meter); + } + ctlZehn.SetTemperature(0); + ctlZehn.DisableTemperatureinput(true); + ctlZehn.IsEnabled = true; + + + } + + + private void btn_LoadTempe_Click(object sender, EventArgs e) + { + + tmpStart((int)nudTempSlot.Value, false); + + + } + + private void btnTempRaspi_Click(object sender, EventArgs e) + { + tmpStart((int)nudTempSlot.Value, true); + } + + private void button1_Click(object sender, EventArgs e) + { + if (TempMeterStateCtls != null) + { + StringBuilder sb = new StringBuilder(); + + foreach (var item in TempMeterStateCtls) + { + sb.AppendLine(); + sb.AppendLine($"##########Meter{item.Slot}#############"); + sb.Append(item.GetLog()); + sb.AppendLine(); + } + richTextBox1.Text = sb.ToString(); + richTextBox1.ScrollToCaret(); + } + + } + + private void tab_ZeroFlowCal_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/GenesisCordonelInterface/UI/LaatzenAPI_CordonelPreadjustmentUI/PreAdjustmentControl.Designer.cs b/GenesisCordonelInterface/UI/LaatzenAPI_CordonelPreadjustmentUI/PreAdjustmentControl.Designer.cs new file mode 100644 index 000000000..c5c561137 --- /dev/null +++ b/GenesisCordonelInterface/UI/LaatzenAPI_CordonelPreadjustmentUI/PreAdjustmentControl.Designer.cs @@ -0,0 +1,673 @@ +using Xylem.Common.Ui.CordonelPreadjustmentUi; + +namespace GenesisCordonelInterface.UI +{ + partial class PreAdjustmentControl + { + /// + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Vom Komponenten-Designer generierter Code + + /// + /// Erforderliche Methode für die Designerunterstützung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PreAdjustmentControl)); + this.pB_Logo1 = new System.Windows.Forms.PictureBox(); + this.gB_Meters = new System.Windows.Forms.GroupBox(); + this.pB_Bubbles1 = new System.Windows.Forms.PictureBox(); + this.l_ZeroFlowCal_Status = new System.Windows.Forms.Label(); + this.gB_Progress = new System.Windows.Forms.GroupBox(); + this.p_ZeroFlowCal_Completion = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Completion = new System.Windows.Forms.Label(); + this.p_ZeroFlowCal_Offset = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Offset = new System.Windows.Forms.Label(); + this.cB_ZeroFlowOffsetTestEnable = new System.Windows.Forms.CheckBox(); + this.cB_AmplitudeTestEnable = new System.Windows.Forms.CheckBox(); + this.cB_TempCalEnable = new System.Windows.Forms.CheckBox(); + this.p_ZeroFlowCal_Detect = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Detect = new System.Windows.Forms.Label(); + this.p_ZeroFlowCal_TempCal = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_TempCal = new System.Windows.Forms.Label(); + this.p_ZeroFlowCal_Prepare = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Prepare = new System.Windows.Forms.Label(); + this.p_ZeroFlowCal_Amplitude = new System.Windows.Forms.Panel(); + this.l_ZeroFlowCal_Amplitude = new System.Windows.Forms.Label(); + this.gB_TempMeters = new System.Windows.Forms.GroupBox(); + this.btn_StoreTempe = new System.Windows.Forms.Button(); + this.pB_ZeroFlowCal_Progress = new System.Windows.Forms.ProgressBar(); + this.l_ZeroFlowCal_ResttimeDisplayValue = new System.Windows.Forms.Label(); + this.l_ZeroFlowCal_Resttime = new System.Windows.Forms.Label(); + this.btn_ZeroFlowCal_Abort = new System.Windows.Forms.Button(); + this.btn_ZeroFlowCal_Start = new System.Windows.Forms.Button(); + this.btn_ZeroFlowCal_Pdf = new System.Windows.Forms.Button(); + this.btn_ZeroFlowCal_Save = new System.Windows.Forms.Button(); + this.btn_ZeroFlowCal_Clear = new System.Windows.Forms.Button(); + this.btn_ZeroFlowCal_Detect = new System.Windows.Forms.Button(); + this.gB_MeterLog = new System.Windows.Forms.GroupBox(); + this.btn_ShowAll = new System.Windows.Forms.Button(); + this.rTB_ZeroFlowCalMeter = new System.Windows.Forms.RichTextBox(); + this.pB_ZeroFlowCal_SubProgress = new System.Windows.Forms.ProgressBar(); + this.l_ZeroFlowCal_SubResttimeDisplayValue = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.rTB_ZeroFlowCal = new System.Windows.Forms.RichTextBox(); + this.l_SettingsPreparationMetersize = new System.Windows.Forms.Label(); + this.cb_Metersize = new System.Windows.Forms.ComboBox(); + this.lblBuildDate = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Logo1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Bubbles1)).BeginInit(); + this.gB_Progress.SuspendLayout(); + this.p_ZeroFlowCal_Completion.SuspendLayout(); + this.p_ZeroFlowCal_Offset.SuspendLayout(); + this.p_ZeroFlowCal_Detect.SuspendLayout(); + this.p_ZeroFlowCal_TempCal.SuspendLayout(); + this.p_ZeroFlowCal_Prepare.SuspendLayout(); + this.p_ZeroFlowCal_Amplitude.SuspendLayout(); + this.gB_TempMeters.SuspendLayout(); + this.gB_MeterLog.SuspendLayout(); + this.SuspendLayout(); + // + // pB_Logo1 + // + this.pB_Logo1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pB_Logo1.BackColor = System.Drawing.SystemColors.Control; + this.pB_Logo1.Image = ((System.Drawing.Image)(resources.GetObject("pB_Logo1.Image"))); + this.pB_Logo1.InitialImage = null; + this.pB_Logo1.Location = new System.Drawing.Point(781, 0); + this.pB_Logo1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.pB_Logo1.Name = "pB_Logo1"; + this.pB_Logo1.Size = new System.Drawing.Size(158, 86); + this.pB_Logo1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pB_Logo1.TabIndex = 69; + this.pB_Logo1.TabStop = false; + // + // gB_Meters + // + this.gB_Meters.Location = new System.Drawing.Point(1, 98); + this.gB_Meters.Margin = new System.Windows.Forms.Padding(10, 10, 10, 10); + this.gB_Meters.Name = "gB_Meters"; + this.gB_Meters.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.gB_Meters.Size = new System.Drawing.Size(950, 174); + this.gB_Meters.TabIndex = 71; + this.gB_Meters.TabStop = false; + this.gB_Meters.Text = "Meters"; + // + // pB_Bubbles1 + // + this.pB_Bubbles1.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.pB_Bubbles1.Image = ((System.Drawing.Image)(resources.GetObject("pB_Bubbles1.Image"))); + this.pB_Bubbles1.Location = new System.Drawing.Point(20, 2); + this.pB_Bubbles1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.pB_Bubbles1.Name = "pB_Bubbles1"; + this.pB_Bubbles1.Size = new System.Drawing.Size(267, 93); + this.pB_Bubbles1.TabIndex = 70; + this.pB_Bubbles1.TabStop = false; + this.pB_Bubbles1.Visible = false; + // + // l_ZeroFlowCal_Status + // + this.l_ZeroFlowCal_Status.AutoSize = true; + this.l_ZeroFlowCal_Status.Font = new System.Drawing.Font("Microsoft Sans Serif", 22.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Status.Location = new System.Drawing.Point(10, 478); + this.l_ZeroFlowCal_Status.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Status.Name = "l_ZeroFlowCal_Status"; + this.l_ZeroFlowCal_Status.Size = new System.Drawing.Size(243, 36); + this.l_ZeroFlowCal_Status.TabIndex = 72; + this.l_ZeroFlowCal_Status.Text = "Press \'DETECT\'"; + // + // gB_Progress + // + this.gB_Progress.Controls.Add(this.p_ZeroFlowCal_Completion); + this.gB_Progress.Controls.Add(this.p_ZeroFlowCal_Offset); + this.gB_Progress.Controls.Add(this.p_ZeroFlowCal_Detect); + this.gB_Progress.Controls.Add(this.p_ZeroFlowCal_TempCal); + this.gB_Progress.Controls.Add(this.p_ZeroFlowCal_Prepare); + this.gB_Progress.Controls.Add(this.p_ZeroFlowCal_Amplitude); + this.gB_Progress.Location = new System.Drawing.Point(8, 517); + this.gB_Progress.Margin = new System.Windows.Forms.Padding(10, 10, 10, 10); + this.gB_Progress.Name = "gB_Progress"; + this.gB_Progress.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.gB_Progress.Size = new System.Drawing.Size(744, 89); + this.gB_Progress.TabIndex = 80; + this.gB_Progress.TabStop = false; + // + // p_ZeroFlowCal_Completion + // + this.p_ZeroFlowCal_Completion.BackColor = System.Drawing.Color.Gainsboro; + this.p_ZeroFlowCal_Completion.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Completion.Controls.Add(this.l_ZeroFlowCal_Completion); + this.p_ZeroFlowCal_Completion.Location = new System.Drawing.Point(607, 17); + this.p_ZeroFlowCal_Completion.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.p_ZeroFlowCal_Completion.Name = "p_ZeroFlowCal_Completion"; + this.p_ZeroFlowCal_Completion.Size = new System.Drawing.Size(117, 65); + this.p_ZeroFlowCal_Completion.TabIndex = 32; + // + // l_ZeroFlowCal_Completion + // + this.l_ZeroFlowCal_Completion.AutoSize = true; + this.l_ZeroFlowCal_Completion.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Completion.ForeColor = System.Drawing.Color.Gray; + this.l_ZeroFlowCal_Completion.Location = new System.Drawing.Point(0, 22); + this.l_ZeroFlowCal_Completion.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Completion.Name = "l_ZeroFlowCal_Completion"; + this.l_ZeroFlowCal_Completion.Size = new System.Drawing.Size(108, 17); + this.l_ZeroFlowCal_Completion.TabIndex = 40; + this.l_ZeroFlowCal_Completion.Text = "COMPLETION"; + this.l_ZeroFlowCal_Completion.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // p_ZeroFlowCal_Offset + // + this.p_ZeroFlowCal_Offset.BackColor = System.Drawing.Color.Gainsboro; + this.p_ZeroFlowCal_Offset.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Offset.Controls.Add(this.l_ZeroFlowCal_Offset); + this.p_ZeroFlowCal_Offset.Controls.Add(this.cB_ZeroFlowOffsetTestEnable); + this.p_ZeroFlowCal_Offset.Controls.Add(this.cB_AmplitudeTestEnable); + this.p_ZeroFlowCal_Offset.Controls.Add(this.cB_TempCalEnable); + this.p_ZeroFlowCal_Offset.Location = new System.Drawing.Point(486, 17); + this.p_ZeroFlowCal_Offset.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.p_ZeroFlowCal_Offset.Name = "p_ZeroFlowCal_Offset"; + this.p_ZeroFlowCal_Offset.Size = new System.Drawing.Size(121, 65); + this.p_ZeroFlowCal_Offset.TabIndex = 94; + // + // l_ZeroFlowCal_Offset + // + this.l_ZeroFlowCal_Offset.AutoSize = true; + this.l_ZeroFlowCal_Offset.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Offset.ForeColor = System.Drawing.Color.Gray; + this.l_ZeroFlowCal_Offset.Location = new System.Drawing.Point(24, 12); + this.l_ZeroFlowCal_Offset.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Offset.Name = "l_ZeroFlowCal_Offset"; + this.l_ZeroFlowCal_Offset.Size = new System.Drawing.Size(68, 34); + this.l_ZeroFlowCal_Offset.TabIndex = 40; + this.l_ZeroFlowCal_Offset.Text = "OFFSET\r\nTEST"; + this.l_ZeroFlowCal_Offset.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // cB_ZeroFlowOffsetTestEnable + // + this.cB_ZeroFlowOffsetTestEnable.AutoSize = true; + this.cB_ZeroFlowOffsetTestEnable.Checked = true; + this.cB_ZeroFlowOffsetTestEnable.CheckState = System.Windows.Forms.CheckState.Checked; + this.cB_ZeroFlowOffsetTestEnable.Enabled = false; + this.cB_ZeroFlowOffsetTestEnable.Location = new System.Drawing.Point(24, 15); + this.cB_ZeroFlowOffsetTestEnable.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.cB_ZeroFlowOffsetTestEnable.Name = "cB_ZeroFlowOffsetTestEnable"; + this.cB_ZeroFlowOffsetTestEnable.Size = new System.Drawing.Size(58, 17); + this.cB_ZeroFlowOffsetTestEnable.TabIndex = 90; + this.cB_ZeroFlowOffsetTestEnable.Text = "enable"; + this.cB_ZeroFlowOffsetTestEnable.UseVisualStyleBackColor = true; + this.cB_ZeroFlowOffsetTestEnable.Visible = false; + // + // cB_AmplitudeTestEnable + // + this.cB_AmplitudeTestEnable.AutoSize = true; + this.cB_AmplitudeTestEnable.Checked = true; + this.cB_AmplitudeTestEnable.CheckState = System.Windows.Forms.CheckState.Checked; + this.cB_AmplitudeTestEnable.Enabled = false; + this.cB_AmplitudeTestEnable.Location = new System.Drawing.Point(-216, 48); + this.cB_AmplitudeTestEnable.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.cB_AmplitudeTestEnable.Name = "cB_AmplitudeTestEnable"; + this.cB_AmplitudeTestEnable.Size = new System.Drawing.Size(58, 17); + this.cB_AmplitudeTestEnable.TabIndex = 92; + this.cB_AmplitudeTestEnable.Text = "enable"; + this.cB_AmplitudeTestEnable.UseVisualStyleBackColor = true; + // + // cB_TempCalEnable + // + this.cB_TempCalEnable.AutoSize = true; + this.cB_TempCalEnable.Checked = true; + this.cB_TempCalEnable.CheckState = System.Windows.Forms.CheckState.Checked; + this.cB_TempCalEnable.Enabled = false; + this.cB_TempCalEnable.Location = new System.Drawing.Point(-96, 48); + this.cB_TempCalEnable.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.cB_TempCalEnable.Name = "cB_TempCalEnable"; + this.cB_TempCalEnable.Size = new System.Drawing.Size(58, 17); + this.cB_TempCalEnable.TabIndex = 94; + this.cB_TempCalEnable.Text = "enable"; + this.cB_TempCalEnable.UseVisualStyleBackColor = true; + // + // p_ZeroFlowCal_Detect + // + this.p_ZeroFlowCal_Detect.BackColor = System.Drawing.Color.Gainsboro; + this.p_ZeroFlowCal_Detect.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Detect.Controls.Add(this.l_ZeroFlowCal_Detect); + this.p_ZeroFlowCal_Detect.Location = new System.Drawing.Point(4, 17); + this.p_ZeroFlowCal_Detect.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.p_ZeroFlowCal_Detect.Name = "p_ZeroFlowCal_Detect"; + this.p_ZeroFlowCal_Detect.Size = new System.Drawing.Size(121, 65); + this.p_ZeroFlowCal_Detect.TabIndex = 40; + // + // l_ZeroFlowCal_Detect + // + this.l_ZeroFlowCal_Detect.AutoSize = true; + this.l_ZeroFlowCal_Detect.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Detect.ForeColor = System.Drawing.Color.Gray; + this.l_ZeroFlowCal_Detect.Location = new System.Drawing.Point(24, 22); + this.l_ZeroFlowCal_Detect.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Detect.Name = "l_ZeroFlowCal_Detect"; + this.l_ZeroFlowCal_Detect.Size = new System.Drawing.Size(69, 17); + this.l_ZeroFlowCal_Detect.TabIndex = 39; + this.l_ZeroFlowCal_Detect.Text = "DETECT"; + // + // p_ZeroFlowCal_TempCal + // + this.p_ZeroFlowCal_TempCal.BackColor = System.Drawing.Color.Gainsboro; + this.p_ZeroFlowCal_TempCal.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_TempCal.Controls.Add(this.l_ZeroFlowCal_TempCal); + this.p_ZeroFlowCal_TempCal.Location = new System.Drawing.Point(365, 17); + this.p_ZeroFlowCal_TempCal.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.p_ZeroFlowCal_TempCal.Name = "p_ZeroFlowCal_TempCal"; + this.p_ZeroFlowCal_TempCal.Size = new System.Drawing.Size(121, 65); + this.p_ZeroFlowCal_TempCal.TabIndex = 41; + // + // l_ZeroFlowCal_TempCal + // + this.l_ZeroFlowCal_TempCal.AutoSize = true; + this.l_ZeroFlowCal_TempCal.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_TempCal.ForeColor = System.Drawing.Color.Gray; + this.l_ZeroFlowCal_TempCal.Location = new System.Drawing.Point(0, 12); + this.l_ZeroFlowCal_TempCal.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_TempCal.Name = "l_ZeroFlowCal_TempCal"; + this.l_ZeroFlowCal_TempCal.Size = new System.Drawing.Size(123, 34); + this.l_ZeroFlowCal_TempCal.TabIndex = 40; + this.l_ZeroFlowCal_TempCal.Text = "TEMPERATURE\r\nCALIBRATION"; + this.l_ZeroFlowCal_TempCal.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // p_ZeroFlowCal_Prepare + // + this.p_ZeroFlowCal_Prepare.BackColor = System.Drawing.Color.Gainsboro; + this.p_ZeroFlowCal_Prepare.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Prepare.Controls.Add(this.l_ZeroFlowCal_Prepare); + this.p_ZeroFlowCal_Prepare.Location = new System.Drawing.Point(124, 17); + this.p_ZeroFlowCal_Prepare.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.p_ZeroFlowCal_Prepare.Name = "p_ZeroFlowCal_Prepare"; + this.p_ZeroFlowCal_Prepare.Size = new System.Drawing.Size(121, 65); + this.p_ZeroFlowCal_Prepare.TabIndex = 31; + // + // l_ZeroFlowCal_Prepare + // + this.l_ZeroFlowCal_Prepare.AutoSize = true; + this.l_ZeroFlowCal_Prepare.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Prepare.ForeColor = System.Drawing.Color.Gray; + this.l_ZeroFlowCal_Prepare.Location = new System.Drawing.Point(18, 22); + this.l_ZeroFlowCal_Prepare.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Prepare.Name = "l_ZeroFlowCal_Prepare"; + this.l_ZeroFlowCal_Prepare.Size = new System.Drawing.Size(80, 17); + this.l_ZeroFlowCal_Prepare.TabIndex = 39; + this.l_ZeroFlowCal_Prepare.Text = "PREPARE"; + // + // p_ZeroFlowCal_Amplitude + // + this.p_ZeroFlowCal_Amplitude.BackColor = System.Drawing.Color.Gainsboro; + this.p_ZeroFlowCal_Amplitude.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.p_ZeroFlowCal_Amplitude.Controls.Add(this.l_ZeroFlowCal_Amplitude); + this.p_ZeroFlowCal_Amplitude.Location = new System.Drawing.Point(244, 17); + this.p_ZeroFlowCal_Amplitude.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.p_ZeroFlowCal_Amplitude.Name = "p_ZeroFlowCal_Amplitude"; + this.p_ZeroFlowCal_Amplitude.Size = new System.Drawing.Size(121, 65); + this.p_ZeroFlowCal_Amplitude.TabIndex = 32; + // + // l_ZeroFlowCal_Amplitude + // + this.l_ZeroFlowCal_Amplitude.AutoSize = true; + this.l_ZeroFlowCal_Amplitude.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.l_ZeroFlowCal_Amplitude.ForeColor = System.Drawing.Color.Gray; + this.l_ZeroFlowCal_Amplitude.Location = new System.Drawing.Point(12, 15); + this.l_ZeroFlowCal_Amplitude.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Amplitude.Name = "l_ZeroFlowCal_Amplitude"; + this.l_ZeroFlowCal_Amplitude.Size = new System.Drawing.Size(95, 34); + this.l_ZeroFlowCal_Amplitude.TabIndex = 39; + this.l_ZeroFlowCal_Amplitude.Text = "AMPLITUDE\r\nTEST"; + this.l_ZeroFlowCal_Amplitude.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // gB_TempMeters + // + this.gB_TempMeters.Controls.Add(this.btn_StoreTempe); + this.gB_TempMeters.Location = new System.Drawing.Point(8, 275); + this.gB_TempMeters.Margin = new System.Windows.Forms.Padding(10, 10, 10, 10); + this.gB_TempMeters.Name = "gB_TempMeters"; + this.gB_TempMeters.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.gB_TempMeters.Size = new System.Drawing.Size(403, 193); + this.gB_TempMeters.TabIndex = 72; + this.gB_TempMeters.TabStop = false; + this.gB_TempMeters.Text = "Temp. Meters"; + // + // btn_StoreTempe + // + this.btn_StoreTempe.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btn_StoreTempe.Enabled = false; + this.btn_StoreTempe.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_StoreTempe.Location = new System.Drawing.Point(4, 158); + this.btn_StoreTempe.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.btn_StoreTempe.Name = "btn_StoreTempe"; + this.btn_StoreTempe.Size = new System.Drawing.Size(395, 31); + this.btn_StoreTempe.TabIndex = 95; + this.btn_StoreTempe.Text = "SAVE TEMP"; + this.btn_StoreTempe.UseVisualStyleBackColor = true; + this.btn_StoreTempe.Click += new System.EventHandler(this.btn_StoreTempe_Click); + // + // pB_ZeroFlowCal_Progress + // + this.pB_ZeroFlowCal_Progress.Location = new System.Drawing.Point(8, 634); + this.pB_ZeroFlowCal_Progress.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.pB_ZeroFlowCal_Progress.Name = "pB_ZeroFlowCal_Progress"; + this.pB_ZeroFlowCal_Progress.Size = new System.Drawing.Size(724, 18); + this.pB_ZeroFlowCal_Progress.Step = 1; + this.pB_ZeroFlowCal_Progress.TabIndex = 35; + // + // l_ZeroFlowCal_ResttimeDisplayValue + // + this.l_ZeroFlowCal_ResttimeDisplayValue.AutoSize = true; + this.l_ZeroFlowCal_ResttimeDisplayValue.Location = new System.Drawing.Point(843, 634); + this.l_ZeroFlowCal_ResttimeDisplayValue.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_ResttimeDisplayValue.Name = "l_ZeroFlowCal_ResttimeDisplayValue"; + this.l_ZeroFlowCal_ResttimeDisplayValue.Size = new System.Drawing.Size(49, 13); + this.l_ZeroFlowCal_ResttimeDisplayValue.TabIndex = 37; + this.l_ZeroFlowCal_ResttimeDisplayValue.Text = "00:00:00"; + // + // l_ZeroFlowCal_Resttime + // + this.l_ZeroFlowCal_Resttime.AutoSize = true; + this.l_ZeroFlowCal_Resttime.Location = new System.Drawing.Point(736, 634); + this.l_ZeroFlowCal_Resttime.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_Resttime.Name = "l_ZeroFlowCal_Resttime"; + this.l_ZeroFlowCal_Resttime.Size = new System.Drawing.Size(54, 13); + this.l_ZeroFlowCal_Resttime.TabIndex = 36; + this.l_ZeroFlowCal_Resttime.Text = "Est. total: "; + // + // btn_ZeroFlowCal_Abort + // + this.btn_ZeroFlowCal_Abort.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btn_ZeroFlowCal_Abort.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_ZeroFlowCal_Abort.Location = new System.Drawing.Point(672, 44); + this.btn_ZeroFlowCal_Abort.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.btn_ZeroFlowCal_Abort.Name = "btn_ZeroFlowCal_Abort"; + this.btn_ZeroFlowCal_Abort.Size = new System.Drawing.Size(102, 52); + this.btn_ZeroFlowCal_Abort.TabIndex = 84; + this.btn_ZeroFlowCal_Abort.Text = "STOP"; + this.btn_ZeroFlowCal_Abort.UseVisualStyleBackColor = true; + this.btn_ZeroFlowCal_Abort.Click += new System.EventHandler(this.btn_ZeroFlowCal_Abort_Click); + // + // btn_ZeroFlowCal_Start + // + this.btn_ZeroFlowCal_Start.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btn_ZeroFlowCal_Start.Enabled = false; + this.btn_ZeroFlowCal_Start.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_ZeroFlowCal_Start.Location = new System.Drawing.Point(566, 44); + this.btn_ZeroFlowCal_Start.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.btn_ZeroFlowCal_Start.Name = "btn_ZeroFlowCal_Start"; + this.btn_ZeroFlowCal_Start.Size = new System.Drawing.Size(102, 51); + this.btn_ZeroFlowCal_Start.TabIndex = 83; + this.btn_ZeroFlowCal_Start.Text = "START"; + this.btn_ZeroFlowCal_Start.UseVisualStyleBackColor = true; + this.btn_ZeroFlowCal_Start.Click += new System.EventHandler(this.btn_ZeroFlowCal_Start_Click); + // + // btn_ZeroFlowCal_Pdf + // + this.btn_ZeroFlowCal_Pdf.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btn_ZeroFlowCal_Pdf.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_ZeroFlowCal_Pdf.Location = new System.Drawing.Point(846, 529); + this.btn_ZeroFlowCal_Pdf.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.btn_ZeroFlowCal_Pdf.Name = "btn_ZeroFlowCal_Pdf"; + this.btn_ZeroFlowCal_Pdf.Size = new System.Drawing.Size(63, 38); + this.btn_ZeroFlowCal_Pdf.TabIndex = 91; + this.btn_ZeroFlowCal_Pdf.Text = "PDF"; + this.btn_ZeroFlowCal_Pdf.UseVisualStyleBackColor = true; + // + // btn_ZeroFlowCal_Save + // + this.btn_ZeroFlowCal_Save.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btn_ZeroFlowCal_Save.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_ZeroFlowCal_Save.Location = new System.Drawing.Point(779, 529); + this.btn_ZeroFlowCal_Save.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.btn_ZeroFlowCal_Save.Name = "btn_ZeroFlowCal_Save"; + this.btn_ZeroFlowCal_Save.Size = new System.Drawing.Size(63, 38); + this.btn_ZeroFlowCal_Save.TabIndex = 90; + this.btn_ZeroFlowCal_Save.Text = "Save"; + this.btn_ZeroFlowCal_Save.UseVisualStyleBackColor = true; + // + // btn_ZeroFlowCal_Clear + // + this.btn_ZeroFlowCal_Clear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btn_ZeroFlowCal_Clear.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_ZeroFlowCal_Clear.Location = new System.Drawing.Point(779, 571); + this.btn_ZeroFlowCal_Clear.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.btn_ZeroFlowCal_Clear.Name = "btn_ZeroFlowCal_Clear"; + this.btn_ZeroFlowCal_Clear.Size = new System.Drawing.Size(130, 28); + this.btn_ZeroFlowCal_Clear.TabIndex = 89; + this.btn_ZeroFlowCal_Clear.Text = "Clear"; + this.btn_ZeroFlowCal_Clear.UseVisualStyleBackColor = true; + // + // btn_ZeroFlowCal_Detect + // + this.btn_ZeroFlowCal_Detect.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btn_ZeroFlowCal_Detect.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_ZeroFlowCal_Detect.Location = new System.Drawing.Point(291, 44); + this.btn_ZeroFlowCal_Detect.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.btn_ZeroFlowCal_Detect.Name = "btn_ZeroFlowCal_Detect"; + this.btn_ZeroFlowCal_Detect.Size = new System.Drawing.Size(102, 51); + this.btn_ZeroFlowCal_Detect.TabIndex = 82; + this.btn_ZeroFlowCal_Detect.Text = "DETECT"; + this.btn_ZeroFlowCal_Detect.UseVisualStyleBackColor = true; + this.btn_ZeroFlowCal_Detect.Click += new System.EventHandler(this.btn_ZeroFlowCal_Detect_Click); + // + // gB_MeterLog + // + this.gB_MeterLog.Controls.Add(this.btn_ShowAll); + this.gB_MeterLog.Controls.Add(this.rTB_ZeroFlowCalMeter); + this.gB_MeterLog.Location = new System.Drawing.Point(419, 275); + this.gB_MeterLog.Margin = new System.Windows.Forms.Padding(10, 10, 10, 10); + this.gB_MeterLog.Name = "gB_MeterLog"; + this.gB_MeterLog.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.gB_MeterLog.Size = new System.Drawing.Size(532, 193); + this.gB_MeterLog.TabIndex = 72; + this.gB_MeterLog.TabStop = false; + this.gB_MeterLog.Text = "Meters"; + this.gB_MeterLog.Visible = false; + // + // btn_ShowAll + // + this.btn_ShowAll.Location = new System.Drawing.Point(5, 14); + this.btn_ShowAll.Name = "btn_ShowAll"; + this.btn_ShowAll.Size = new System.Drawing.Size(123, 20); + this.btn_ShowAll.TabIndex = 97; + this.btn_ShowAll.Text = "ShowAll"; + this.btn_ShowAll.UseVisualStyleBackColor = true; + this.btn_ShowAll.Click += new System.EventHandler(this.btn_ShowAll_Click); + // + // rTB_ZeroFlowCalMeter + // + this.rTB_ZeroFlowCalMeter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.rTB_ZeroFlowCalMeter.Location = new System.Drawing.Point(4, 39); + this.rTB_ZeroFlowCalMeter.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.rTB_ZeroFlowCalMeter.Name = "rTB_ZeroFlowCalMeter"; + this.rTB_ZeroFlowCalMeter.ReadOnly = true; + this.rTB_ZeroFlowCalMeter.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.rTB_ZeroFlowCalMeter.Size = new System.Drawing.Size(516, 139); + this.rTB_ZeroFlowCalMeter.TabIndex = 96; + this.rTB_ZeroFlowCalMeter.Text = ""; + // + // pB_ZeroFlowCal_SubProgress + // + this.pB_ZeroFlowCal_SubProgress.Location = new System.Drawing.Point(8, 612); + this.pB_ZeroFlowCal_SubProgress.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.pB_ZeroFlowCal_SubProgress.Name = "pB_ZeroFlowCal_SubProgress"; + this.pB_ZeroFlowCal_SubProgress.Size = new System.Drawing.Size(724, 18); + this.pB_ZeroFlowCal_SubProgress.Step = 1; + this.pB_ZeroFlowCal_SubProgress.TabIndex = 92; + // + // l_ZeroFlowCal_SubResttimeDisplayValue + // + this.l_ZeroFlowCal_SubResttimeDisplayValue.AutoSize = true; + this.l_ZeroFlowCal_SubResttimeDisplayValue.Location = new System.Drawing.Point(845, 617); + this.l_ZeroFlowCal_SubResttimeDisplayValue.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_ZeroFlowCal_SubResttimeDisplayValue.Name = "l_ZeroFlowCal_SubResttimeDisplayValue"; + this.l_ZeroFlowCal_SubResttimeDisplayValue.Size = new System.Drawing.Size(49, 13); + this.l_ZeroFlowCal_SubResttimeDisplayValue.TabIndex = 94; + this.l_ZeroFlowCal_SubResttimeDisplayValue.Text = "00:00:00"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(736, 616); + this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(105, 13); + this.label2.TabIndex = 93; + this.label2.Text = "Est. finish Proccess: "; + // + // rTB_ZeroFlowCal + // + this.rTB_ZeroFlowCal.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.rTB_ZeroFlowCal.Location = new System.Drawing.Point(419, 280); + this.rTB_ZeroFlowCal.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.rTB_ZeroFlowCal.Name = "rTB_ZeroFlowCal"; + this.rTB_ZeroFlowCal.ReadOnly = true; + this.rTB_ZeroFlowCal.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.rTB_ZeroFlowCal.Size = new System.Drawing.Size(528, 193); + this.rTB_ZeroFlowCal.TabIndex = 101; + this.rTB_ZeroFlowCal.Text = ""; + // + // l_SettingsPreparationMetersize + // + this.l_SettingsPreparationMetersize.AutoSize = true; + this.l_SettingsPreparationMetersize.Location = new System.Drawing.Point(416, 72); + this.l_SettingsPreparationMetersize.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.l_SettingsPreparationMetersize.Name = "l_SettingsPreparationMetersize"; + this.l_SettingsPreparationMetersize.Size = new System.Drawing.Size(55, 13); + this.l_SettingsPreparationMetersize.TabIndex = 104; + this.l_SettingsPreparationMetersize.Text = "Metersize:"; + // + // cb_Metersize + // + this.cb_Metersize.FormattingEnabled = true; + this.cb_Metersize.Location = new System.Drawing.Point(476, 66); + this.cb_Metersize.Name = "cb_Metersize"; + this.cb_Metersize.Size = new System.Drawing.Size(73, 21); + this.cb_Metersize.TabIndex = 105; + // + // lblBuildDate + // + this.lblBuildDate.AutoSize = true; + this.lblBuildDate.Location = new System.Drawing.Point(779, 88); + this.lblBuildDate.Name = "lblBuildDate"; + this.lblBuildDate.Size = new System.Drawing.Size(10, 13); + this.lblBuildDate.TabIndex = 106; + this.lblBuildDate.Text = "-"; + // + // PreAdjustmentControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Window; + this.Controls.Add(this.lblBuildDate); + this.Controls.Add(this.cb_Metersize); + this.Controls.Add(this.l_SettingsPreparationMetersize); + this.Controls.Add(this.rTB_ZeroFlowCal); + this.Controls.Add(this.l_ZeroFlowCal_SubResttimeDisplayValue); + this.Controls.Add(this.label2); + this.Controls.Add(this.pB_ZeroFlowCal_SubProgress); + this.Controls.Add(this.gB_MeterLog); + this.Controls.Add(this.gB_TempMeters); + this.Controls.Add(this.btn_ZeroFlowCal_Pdf); + this.Controls.Add(this.btn_ZeroFlowCal_Save); + this.Controls.Add(this.btn_ZeroFlowCal_Clear); + this.Controls.Add(this.btn_ZeroFlowCal_Abort); + this.Controls.Add(this.l_ZeroFlowCal_ResttimeDisplayValue); + this.Controls.Add(this.pB_ZeroFlowCal_Progress); + this.Controls.Add(this.btn_ZeroFlowCal_Start); + this.Controls.Add(this.l_ZeroFlowCal_Resttime); + this.Controls.Add(this.btn_ZeroFlowCal_Detect); + this.Controls.Add(this.l_ZeroFlowCal_Status); + this.Controls.Add(this.gB_Progress); + this.Controls.Add(this.pB_Logo1); + this.Controls.Add(this.gB_Meters); + this.Controls.Add(this.pB_Bubbles1); + this.Name = "PreAdjustmentControl"; + this.Size = new System.Drawing.Size(970, 674); + this.Load += new System.EventHandler(this.PreAdjustmentControl_Load); + ((System.ComponentModel.ISupportInitialize)(this.pB_Logo1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pB_Bubbles1)).EndInit(); + this.gB_Progress.ResumeLayout(false); + this.p_ZeroFlowCal_Completion.ResumeLayout(false); + this.p_ZeroFlowCal_Completion.PerformLayout(); + this.p_ZeroFlowCal_Offset.ResumeLayout(false); + this.p_ZeroFlowCal_Offset.PerformLayout(); + this.p_ZeroFlowCal_Detect.ResumeLayout(false); + this.p_ZeroFlowCal_Detect.PerformLayout(); + this.p_ZeroFlowCal_TempCal.ResumeLayout(false); + this.p_ZeroFlowCal_TempCal.PerformLayout(); + this.p_ZeroFlowCal_Prepare.ResumeLayout(false); + this.p_ZeroFlowCal_Prepare.PerformLayout(); + this.p_ZeroFlowCal_Amplitude.ResumeLayout(false); + this.p_ZeroFlowCal_Amplitude.PerformLayout(); + this.gB_TempMeters.ResumeLayout(false); + this.gB_MeterLog.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.PictureBox pB_Logo1; + private System.Windows.Forms.GroupBox gB_Meters; + private System.Windows.Forms.PictureBox pB_Bubbles1; + private System.Windows.Forms.Label l_ZeroFlowCal_Status; + private System.Windows.Forms.GroupBox gB_Progress; + private System.Windows.Forms.Panel p_ZeroFlowCal_Completion; + private System.Windows.Forms.Label l_ZeroFlowCal_Completion; + private System.Windows.Forms.ProgressBar pB_ZeroFlowCal_Progress; + private System.Windows.Forms.Label l_ZeroFlowCal_ResttimeDisplayValue; + private System.Windows.Forms.Panel p_ZeroFlowCal_Offset; + private System.Windows.Forms.Label l_ZeroFlowCal_Offset; + private System.Windows.Forms.Label l_ZeroFlowCal_Resttime; + private System.Windows.Forms.Panel p_ZeroFlowCal_Detect; + private System.Windows.Forms.Label l_ZeroFlowCal_Detect; + private System.Windows.Forms.Panel p_ZeroFlowCal_TempCal; + private System.Windows.Forms.Label l_ZeroFlowCal_TempCal; + private System.Windows.Forms.Panel p_ZeroFlowCal_Prepare; + private System.Windows.Forms.Label l_ZeroFlowCal_Prepare; + private System.Windows.Forms.Panel p_ZeroFlowCal_Amplitude; + private System.Windows.Forms.Label l_ZeroFlowCal_Amplitude; + private System.Windows.Forms.Button btn_ZeroFlowCal_Abort; + private System.Windows.Forms.Button btn_ZeroFlowCal_Start; + private System.Windows.Forms.Button btn_ZeroFlowCal_Pdf; + private System.Windows.Forms.Button btn_ZeroFlowCal_Save; + private System.Windows.Forms.Button btn_ZeroFlowCal_Clear; + private System.Windows.Forms.Button btn_ZeroFlowCal_Detect; + private System.Windows.Forms.GroupBox gB_TempMeters; + private System.Windows.Forms.CheckBox cB_ZeroFlowOffsetTestEnable; + private System.Windows.Forms.CheckBox cB_TempCalEnable; + private System.Windows.Forms.CheckBox cB_AmplitudeTestEnable; + private System.Windows.Forms.Button btn_StoreTempe; + private System.Windows.Forms.GroupBox gB_MeterLog; + private System.Windows.Forms.RichTextBox rTB_ZeroFlowCalMeter; + private System.Windows.Forms.ProgressBar pB_ZeroFlowCal_SubProgress; + private System.Windows.Forms.Label l_ZeroFlowCal_SubResttimeDisplayValue; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button btn_ShowAll; + private System.Windows.Forms.RichTextBox rTB_ZeroFlowCal; + private System.Windows.Forms.Label l_SettingsPreparationMetersize; + private System.Windows.Forms.ComboBox cb_Metersize; + private System.Windows.Forms.Label lblBuildDate; + } +} diff --git a/GenesisCordonelInterface/UI/LaatzenAPI_CordonelPreadjustmentUI/PreAdjustmentControl.cs b/GenesisCordonelInterface/UI/LaatzenAPI_CordonelPreadjustmentUI/PreAdjustmentControl.cs new file mode 100644 index 000000000..bee46c25b --- /dev/null +++ b/GenesisCordonelInterface/UI/LaatzenAPI_CordonelPreadjustmentUI/PreAdjustmentControl.cs @@ -0,0 +1,2128 @@ +using CordonelPreadjustmentUi.Processes; +using CordonelPreadjustmentUi.Processes.Actions; +using CordonelPreadjustmentUi.Processes.Itinerary; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts; +using Xylem.Common.Logic.ProductionOrderCore.OrderData; +using Xylem.Common.Ui.CordonelPreadjustmentUi; +using Xylem.Common.Ui.CordonelPreadjustmentUi.Parameters; +using CordonelPreadjustmentUi; + +namespace GenesisCordonelInterface.UI +{ + public partial class PreAdjustmentControl : UserControl + { + private ProcessProgress pp = new ProcessProgress(); + private PreAdjustmentSettingsContainer settings = new PreAdjustmentSettingsContainer(); + + + private List MeterStateCtls = new List(); + private List TempMeterStateCtls = new List(); + + private List AllMeterStateCtrls() + { + var r = new List(); + r.AddRange(MeterStateCtls); + r.AddRange(TempMeterStateCtls); + return r; + } + + private MeterBatch GlobalMeterBatch = new MeterBatch(); + private MeterBatch ThermoMeterBatch = new MeterBatch(); + private Boolean abortIndicator = false; + public Boolean AbortIndicator { get { return abortIndicator; } set { abortIndicator = value; } } + public int TestRunNumber; + public PreAdjustmentControl(PreAdjustmentSettingsContainer Settings = null) + { + InitializeComponent(); + SetSettings(Settings); + rTB_ZeroFlowCal.AutoSize = true; + } + public void SetSettings(PreAdjustmentSettingsContainer Settings = null) + { + settings = Settings; + if (settings != null) + { + PreAdjustmentControl_Load(this, EventArgs.Empty); + } + + } + + private void PreAdjustmentControl_Load(object sender, System.EventArgs e) + { + + MeterStateCtls = new List(); + TempMeterStateCtls = new List(); + if (settings != null) + { + gB_Meters.Controls.Clear(); + gB_TempMeters.Controls.Clear(); + gB_TempMeters.Controls.Add(this.btn_StoreTempe); + var tmpI = 1; + foreach (var Meter in settings.Meters) + { + var ctl = new MeterStateControl(Meter); + ctl.Location = new Point(5 + ((tmpI - 1) * ctl.Width), 15); + MeterStateCtls.Add(ctl); + gB_Meters.Controls.Add(ctl); + ctl.OnRequestDetails += Ctl_MouseEnter; + tmpI = tmpI + 1; + } + + tmpI = 1; + if (settings.TempMeters.Any() && settings.GetTempUseTempFlansh()) + { + foreach (var tempMeter in settings.TempMeters) + { + var ctl = new TempMeterStateControl(tempMeter); + ctl.Location = new Point(5 + ((tmpI - 1) * ctl.Width), 15); + TempMeterStateCtls.Add(ctl); + gB_TempMeters.Controls.Add(ctl); + ctl.OnRequestDetails += Ctl_MouseEnter; + ctl.DoubleClick += Clt_ReConnect; + tmpI = tmpI + 1; + ctl.Enabled = true; + + } + } + else + { + var ctl = new TempMeterStateControl("Input"); + ctl.Location = new Point(5 + ((tmpI - 1) * ctl.Width), 15); + ctl.SetChecked(true); + TempMeterStateCtls.Add(ctl); + gB_TempMeters.Controls.Add(ctl); + //ctl.DoubleClick += Ctl_MouseEnter; + tmpI = tmpI + 1; + ctl.Enabled = true; + } + + + + cb_Metersize.Items.Clear(); + foreach (MeterSize size in (MeterSize[])Enum.GetValues(typeof(MeterSize))) + { + cb_Metersize.Items.Add(size); + } + var setM = MeterSize.DN50; + if (settings?.MeterSize != null) + { + setM = settings.MeterSize; + } + cb_Metersize.SelectedItem = setM; + + } + } + + private void Ctl_MouseLeave(object sender, EventArgs e) + { + + } + private void Ctl_MouseEnter(object sender, EventArgs e) + { + if (sender is MeterStateControl meterStateCtl) + { + if (this.InvokeRequired) + { + this.Invoke((Action)Ctl_MouseEnter, sender, e); + return; + } + + rTB_ZeroFlowCalMeter.Text = meterStateCtl.GetLog(); + gB_MeterLog.Text = $"Log for Meter {meterStateCtl.Slot}:"; + rTB_ZeroFlowCal.Visible = false; + gB_MeterLog.Visible = true; + rTB_ZeroFlowCalMeter.ScrollToCaret(); + } + + } + + private void Clt_ReConnect(object sender, EventArgs e) + { + if (sender is TempMeterStateControl meterStateCtl) + { + if (this.InvokeRequired) + { + this.Invoke((Action)Clt_ReConnect, sender, e); + return; + } + + meterStateCtl.StartTempWatch(meterStateCtl.MeterTempMode); + } + + + } + + public void SetTestBenchTemp(double temp) + { + if (pp != null) + { + pp.PushedTestBenchTemp = temp; + pp.TempretureSelected = true; + } + } + + + + public void SetFlushIsDone() + { + if (pp != null) + { + pp.FlushDone = true; + } + } + + //todo move out + #region move out + + private static class Formats + { + #region Format strings for display + #region Format strings for "Decoded Data"-display + public const String TofDispString = "000000.00000000"; + public const String HccCorrectionValue = "0.00000"; + public const String PwDispString = "0.00"; + public const String AmpDispUpString = "000.0"; + public const String AmpDispDownString = "-000.0"; + public const String TempDispString = "0.00"; + public const String Flow = "0.00"; + #endregion + #region Format strings for "Mean"-Display + public const String MeanDispString = "0.00"; + #endregion + #region Format strings for "Std-Deviation"-Display + public const String StdDevDispString = "0.00"; + #endregion + #endregion + #region Format strings for CSV-Logging + public const String TofLogString = "000000.00000000"; + public const String PwLogString = "0.00"; + public const String AmpLogString = "000.0"; + public const String TempLogString = "0.00"; + public const String CsvDateTimeLogString = "HH:mm:ss:fff;yyyy.MM.dd;"; + public const String ErrorLogString = "HH:mm:ss:fff;yyyy.MM.dd;"; + public const String RawDataDateTimeLogString = "yyyy-MM-dd HH:mm:ss:ff "; + public const String CsvIndexLogString = "{0:D8}"; + public const String CsvFileDateTimeString = "yyyyMMdd_HHmmss_"; + public const String TxtFileDateTimeString = "yyyyMMdd_HHmmss_"; + public const String LogFileDateTimeString = "yyyyMMdd_HHmmss"; + public const String HeaderFileDateTimeString = "yyyy-MM-dd HH:mm:ss"; + public const String StatusDateTimeString = "HH:mm:ss"; + #endregion + #region Date/ Time for raw file naming + public const String RawFileDateTimeString = "yyyyMMdd_HHmmss_"; + #endregion + #region Date/ Time for image files naming + public const String ImageFileDateTimeString = "yyyyMMdd_HHmmss_"; + #endregion + #region Date/ Time for reports + public const String ReportDateTimeTitleString = "yyyy-MM-dd"; + public const String PdfDateTimeString = "yyyyMMdd_HHmmss_"; + #endregion + #region Format for GP30 first hit level adjustments + public const String FirstHitLevelVoltage = "000.00"; + #endregion + + + + } + + public bool GetMeterIsDone(int slot) + { + var meter = AllMeterStateCtrls().First(m => m.Slot == slot); + if (meter != null) + { + return !meter.Failed; + } + return false; + } + + public void CloseConnections() + { + GlobalMeterBatch?.RemoveAllMeters(); + ThermoMeterBatch?.RemoveAllMeters(); + GlobalMeterBatch?.Dispose(); + ThermoMeterBatch?.Dispose(); + } + + public void EnableMeter(int slot, bool enabled, string srn) + { + var meter = AllMeterStateCtrls().First(m => m.Slot == slot); + if (meter != null) + { + meter.SetChecked(enabled); + meter.Srn = srn; + } + } + public StringBuilder proccessLog = new StringBuilder(); + + public void DebugMessage(Exception exception, int? slot = null, String source = "APP", String PcbId = "") + { + + DebugMessage($"Exception at full process: { exception.Message}\t{Environment.NewLine}", slot, source, PcbId); + + + var stringBuilder = new StringBuilder(); + + while (exception != null) + { + stringBuilder.Append(exception.ToString()); + stringBuilder.AppendLine(); + exception = exception.InnerException; + } + DebugMessage(stringBuilder.ToString(), slot, source, PcbId); + + } + public void DebugMessage(String text = "", int? slot = null, String source = "APP", String PcbId = "") + { + // Add line and scroll to caret + if (!String.IsNullOrEmpty(text)) + { + if (this.InvokeRequired) + { + this.Invoke((Action)DebugMessage, text, slot, source, PcbId); + return; + } + + string mainMsg = ""; + string Timestamp = DateTime.Now.ToString(Formats.StatusDateTimeString, settings.Culture); + mainMsg = $"\t {source} \t{text}"; + if (slot.HasValue) + { + mainMsg = $"{mainMsg} at Meter {slot.Value}"; + if (!string.IsNullOrEmpty(PcbId)) + { + mainMsg = $"{mainMsg} ({PcbId})"; + } + AllMeterStateCtrls()?.Where(e => e.Enabled && e.Slot == slot.Value).ToList().ForEach(l => l.Log($"{ Timestamp} { mainMsg}")); + } + else + { + AllMeterStateCtrls()?.Where(e => e.Enabled).ToList().ForEach(l => l.Log($"{ Timestamp} { mainMsg}")); + } + + + proccessLog?.AppendLine($"{Timestamp} {mainMsg}"); + + rTB_ZeroFlowCal?.AppendText($"{Timestamp} {mainMsg} {Environment.NewLine}"); + rTB_ZeroFlowCal?.ScrollToCaret(); + + + //log + + + } + } + + //public void DebugMessage(String text) + //{ + // // Add line and scroll to caret + // if (!String.IsNullOrEmpty(text)) + // { + // if (this.InvokeRequired) + // { + // this.Invoke((Action)DebugMessage, text); + // return; + // } + + // String Timestamp = DateTime.Now.ToString(Formats.RawDataDateTimeLogString, settings.Culture); + // rTB_ZeroFlowCal.AppendText($"{Timestamp}\t{text}"); + // rTB_ZeroFlowCal.ScrollToCaret(); + // } + //} + public void SetBusy(bool isBusy) + { + if (this.InvokeRequired) + { + Invoke((Action)SetBusy, isBusy); + + return; + } + + pB_Bubbles1.Visible = isBusy; + + } + + private void AbortButtonEnabled(bool v) + { + if (this.InvokeRequired) + { + Invoke((Action)AbortButtonEnabled, v); + + return; + } + btn_ZeroFlowCal_Abort.Enabled = v; + } + + public void ZeroFlowCalDetectSetBackColor(Color color) + { + this.p_ZeroFlowCal_Detect.BackColor = color; + } + public void ZeroFlowCalAmplitudeSetBackColor(Color color) + { + this.p_ZeroFlowCal_Amplitude.BackColor = color; + } + public void ZeroFlowCalPrepareSetBackColor(Color color) + { + this.p_ZeroFlowCal_Prepare.BackColor = color; + } + public void ZeroFlowCalOffsetSetBackColor(Color color) + { + this.p_ZeroFlowCal_Offset.BackColor = color; + } + public void ZeroFlowCalCompletionSetBackColor(Color color) + { + this.p_ZeroFlowCal_Completion.BackColor = color; + } + public void ZeroFlowCalTempCalSetBackColor(Color color) + { + this.p_ZeroFlowCal_TempCal.BackColor = color; + } + public void ZeroFlowCalDetectSetLabelColor(Color color) + { + this.l_ZeroFlowCal_Detect.ForeColor = color; + } + public void ZeroFlowCalAmplitudeSetLabelColor(Color color) + { + this.l_ZeroFlowCal_Amplitude.ForeColor = color; + } + public void ZeroFlowCalPrepareSetLabelColor(Color color) + { + this.l_ZeroFlowCal_Prepare.ForeColor = color; + } + public void ZeroFlowCalOffsetSetLabelColor(Color color) + { + this.l_ZeroFlowCal_Offset.ForeColor = color; + } + public void ZeroFlowCalCompletionSetLabelColor(Color color) + { + this.l_ZeroFlowCal_Completion.ForeColor = color; + } + public void ZeroFlowCalTempCalSetLabelColor(Color color) + { + this.l_ZeroFlowCal_TempCal.ForeColor = color; + } + + public enum StatusPanelItems + { + None = 0, + Detect = 1, + Prepare = 2, + Amplitude = 3, + Offset = 4, + Completion = 5, + TempCal = 6, + } + + public void SetProgressPanel(StatusPanelItems item) + { + if (this.InvokeRequired) + { + this.Invoke((Action)SetProgressPanel, item); + return; + } + + switch (item) + { + case StatusPanelItems.None: + this.ZeroFlowCalDetectSetBackColor(Color.Gainsboro); + this.ZeroFlowCalPrepareSetBackColor(Color.Gainsboro); + this.ZeroFlowCalAmplitudeSetBackColor(Color.Gainsboro); + this.ZeroFlowCalOffsetSetBackColor(Color.Gainsboro); + this.ZeroFlowCalCompletionSetBackColor(Color.Gainsboro); + this.ZeroFlowCalTempCalSetBackColor(Color.Gainsboro); + this.ZeroFlowCalDetectSetLabelColor(Color.Gray); + this.ZeroFlowCalPrepareSetLabelColor(Color.Gray); + this.ZeroFlowCalAmplitudeSetLabelColor(Color.Gray); + this.ZeroFlowCalOffsetSetLabelColor(Color.Gray); + this.ZeroFlowCalCompletionSetLabelColor(Color.Gray); + this.ZeroFlowCalTempCalSetLabelColor(Color.Gray); + break; + + case StatusPanelItems.Detect: + this.ZeroFlowCalDetectSetBackColor(Color.LightGreen); + this.ZeroFlowCalPrepareSetBackColor(Color.Gainsboro); + this.ZeroFlowCalAmplitudeSetBackColor(Color.Gainsboro); + this.ZeroFlowCalOffsetSetBackColor(Color.Gainsboro); + this.ZeroFlowCalCompletionSetBackColor(Color.Gainsboro); + this.ZeroFlowCalTempCalSetBackColor(Color.Gainsboro); + this.ZeroFlowCalDetectSetLabelColor(Color.Black); + this.ZeroFlowCalPrepareSetLabelColor(Color.Gray); + this.ZeroFlowCalAmplitudeSetLabelColor(Color.Gray); + this.ZeroFlowCalOffsetSetLabelColor(Color.Gray); + this.ZeroFlowCalCompletionSetLabelColor(Color.Gray); + this.ZeroFlowCalTempCalSetLabelColor(Color.Gray); + break; + + case StatusPanelItems.Prepare: + this.ZeroFlowCalDetectSetBackColor(Color.LightGreen); + this.ZeroFlowCalPrepareSetBackColor(Color.LightGreen); + this.ZeroFlowCalAmplitudeSetBackColor(Color.Gainsboro); + this.ZeroFlowCalOffsetSetBackColor(Color.Gainsboro); + this.ZeroFlowCalCompletionSetBackColor(Color.Gainsboro); + this.ZeroFlowCalTempCalSetBackColor(Color.Gainsboro); + this.ZeroFlowCalDetectSetLabelColor(Color.Gray); + this.ZeroFlowCalPrepareSetLabelColor(Color.Black); + this.ZeroFlowCalAmplitudeSetLabelColor(Color.Gray); + this.ZeroFlowCalOffsetSetLabelColor(Color.Gray); + this.ZeroFlowCalCompletionSetLabelColor(Color.Gray); + this.ZeroFlowCalTempCalSetLabelColor(Color.Gray); + break; + + case StatusPanelItems.Amplitude: + this.ZeroFlowCalDetectSetBackColor(Color.LightGreen); + this.ZeroFlowCalPrepareSetBackColor(Color.LightGreen); + this.ZeroFlowCalAmplitudeSetBackColor(Color.LightGreen); + this.ZeroFlowCalOffsetSetBackColor(Color.Gainsboro); + this.ZeroFlowCalTempCalSetBackColor(Color.Gainsboro); + this.ZeroFlowCalCompletionSetBackColor(Color.Gainsboro); + this.ZeroFlowCalDetectSetLabelColor(Color.Gray); + this.ZeroFlowCalPrepareSetLabelColor(Color.Gray); + this.ZeroFlowCalAmplitudeSetLabelColor(Color.Black); + this.ZeroFlowCalOffsetSetLabelColor(Color.Gray); + this.ZeroFlowCalTempCalSetLabelColor(Color.Gray); + this.ZeroFlowCalCompletionSetLabelColor(Color.Gray); + break; + + case StatusPanelItems.Offset: + this.ZeroFlowCalDetectSetBackColor(Color.LightGreen); + this.ZeroFlowCalPrepareSetBackColor(Color.LightGreen); + this.ZeroFlowCalAmplitudeSetBackColor(Color.LightGreen); + this.ZeroFlowCalTempCalSetBackColor(Color.LightGreen); + this.ZeroFlowCalOffsetSetBackColor(Color.LightGreen); + this.ZeroFlowCalCompletionSetBackColor(Color.Gainsboro); + this.ZeroFlowCalDetectSetLabelColor(Color.Gray); + this.ZeroFlowCalPrepareSetLabelColor(Color.Gray); + this.ZeroFlowCalAmplitudeSetLabelColor(Color.Gray); + this.ZeroFlowCalOffsetSetLabelColor(Color.Black); + this.ZeroFlowCalTempCalSetLabelColor(Color.Gray); + this.ZeroFlowCalCompletionSetLabelColor(Color.Gray); + break; + + case StatusPanelItems.Completion: + this.ZeroFlowCalDetectSetBackColor(Color.LightGreen); + this.ZeroFlowCalPrepareSetBackColor(Color.LightGreen); + this.ZeroFlowCalAmplitudeSetBackColor(Color.LightGreen); + this.ZeroFlowCalOffsetSetBackColor(Color.LightGreen); + this.ZeroFlowCalTempCalSetBackColor(Color.LightGreen); + this.ZeroFlowCalCompletionSetBackColor(Color.LightGreen); + this.ZeroFlowCalDetectSetLabelColor(Color.Gray); + this.ZeroFlowCalPrepareSetLabelColor(Color.Gray); + this.ZeroFlowCalAmplitudeSetLabelColor(Color.Gray); + this.ZeroFlowCalOffsetSetLabelColor(Color.Gray); + this.ZeroFlowCalTempCalSetLabelColor(Color.Gray); + this.ZeroFlowCalCompletionSetLabelColor(Color.Black); + break; + + case StatusPanelItems.TempCal: + this.ZeroFlowCalDetectSetBackColor(Color.LightGreen); + this.ZeroFlowCalPrepareSetBackColor(Color.LightGreen); + this.ZeroFlowCalAmplitudeSetBackColor(Color.LightGreen); + this.ZeroFlowCalTempCalSetBackColor(Color.LightGreen); + this.ZeroFlowCalOffsetSetBackColor(Color.Gainsboro); + this.ZeroFlowCalCompletionSetBackColor(Color.Gainsboro); + this.ZeroFlowCalDetectSetLabelColor(Color.Gray); + this.ZeroFlowCalPrepareSetLabelColor(Color.Gray); + this.ZeroFlowCalAmplitudeSetLabelColor(Color.Gray); + this.ZeroFlowCalTempCalSetLabelColor(Color.Black); + this.ZeroFlowCalOffsetSetLabelColor(Color.Gray); + this.ZeroFlowCalCompletionSetLabelColor(Color.Gray); + break; + + default: + //this.ZeroFlowCalDetectSetBackColor(Color.Gainsboro); + //this.ZeroFlowCalPrepareSetBackColor(Color.Gainsboro); + //this.ZeroFlowCalAmplitudeSetBackColor(Color.Gainsboro); + //this.ZeroFlowCalOffsetSetBackColor(Color.Gainsboro); + //this.ZeroFlowCalCompletionSetBackColor(Color.Gainsboro); + //this.ZeroFlowCalTempCalSetBackColor(Color.Gainsboro); + //this.ZeroFlowCalDetectSetLabelColor(Color.Gray); + //this.ZeroFlowCalPrepareSetLabelColor(Color.Gray); + //this.ZeroFlowCalAmplitudeSetLabelColor(Color.Gray); + //this.ZeroFlowCalOffsetSetLabelColor(Color.Gray); + //this.ZeroFlowCalCompletionSetLabelColor(Color.Gray); + //this.ZeroFlowCalTempCalSetLabelColor(Color.Gray); + break; + + } + + WaitNSeconds(2); + return; + } + + public void SetControlElements(Boolean enabled) + { + if (this.InvokeRequired) + { + this.Invoke((Action)SetControlElements, enabled); + return; + } + this.pB_Bubbles1.Visible = !enabled; + this.btn_ZeroFlowCal_Detect.Enabled = enabled; + foreach (var MeterStateCtl in MeterStateCtls) + { + //MeterStateCtl.Enabled = enabled; + } + foreach (var TempMeterStateCtl in TempMeterStateCtls) + { + //TempMeterStateCtl.Enabled = enabled; + } + this.btn_ZeroFlowCal_Pdf.Enabled = enabled; + this.btn_ZeroFlowCal_Save.Enabled = enabled; + this.btn_ZeroFlowCal_Clear.Enabled = enabled; + btn_ZeroFlowCal_Abort.Enabled = !enabled; + this.cB_AmplitudeTestEnable.Enabled = enabled; + this.cB_TempCalEnable.Enabled = enabled; + this.cB_ZeroFlowOffsetTestEnable.Enabled = enabled; + } + public void StatusLabel(String debugMessage) + { + // Add line and scroll to caret + if (!String.IsNullOrEmpty(debugMessage)) + { + if (this.InvokeRequired) + { + this.Invoke((Action)StatusLabel, debugMessage); + return; + } + this.l_ZeroFlowCal_Status.Text = debugMessage; + } + } + public void SetControlText(CultureInfo culture) + { + if (this.InvokeRequired) + { + this.Invoke((Action)SetControlText, culture); + return; + } + //todo langureage setup + if (culture.Name == "de-DE") + { + //this.l_ZeroFlowCal_Meter1.Text = "ZÄHLER1"; + //this.l_ZeroFlowCal_Meter2.Text = "ZÄHLER2"; + //this.l_ZeroFlowCal_Meter3.Text = "ZÄHLER3"; + //this.l_ZeroFlowCal_Meter4.Text = "ZÄHLER4"; + //this.l_ZeroFlowCal_Meter5.Text = "ZÄHLER5"; + //this.l_ZeroFlowCal_Meter6.Text = "ZÄHLER6"; + //this.l_ZeroFlowCal_Meter7.Text = "ZÄHLER7"; + //this.l_ZeroFlowCal_Meter8.Text = "ZÄHLER8"; + //this.l_ZeroFlowCal_Meter9.Text = "ZÄHLER9"; + //this.l_ZeroFlowCal_Meter10.Text = "ZÄHLER10"; + + //this.l_ZeroFlowCal_Detect.Text = "DETEKT"; + //this.l_ZeroFlowCal_Prepare.Text = "RÜSTEN"; + //this.l_ZeroFlowCal_Amplitude.Text = "AMPLITUDEN\nTEST"; + //this.l_ZeroFlowCal_TempCal.Text = "TEMPERATUR\nKALIBRIERUNG"; + //this.l_ZeroFlowCal_Completion.Text = "ABSCHLUSS"; + //this.l_ZeroFlowCal_Resttime.Text = "Geschätzte Restzeit "; + //this.cB_ZeroFlowCal_EnableMeter1.Text = "aktiv"; + //this.cB_ZeroFlowCal_EnableMeter2.Text = "aktiv"; + //this.cB_ZeroFlowCal_EnableMeter3.Text = "aktiv"; + //this.cB_ZeroFlowCal_EnableMeter4.Text = "aktiv"; + //this.cB_ZeroFlowCal_EnableMeter5.Text = "aktiv"; + //this.cB_ZeroFlowCal_EnableMeter6.Text = "aktiv"; + //this.cB_ZeroFlowCal_EnableMeter7.Text = "aktiv"; + //this.cB_ZeroFlowCal_EnableMeter8.Text = "aktiv"; + //this.cB_ZeroFlowCal_EnableMeter9.Text = "aktiv"; + //this.cB_ZeroFlowCal_EnableMeter10.Text = "aktiv"; + //this.btn_ZeroFlowCal_Save.Text = "speichern"; + //this.btn_ZeroFlowCal_Clear.Text = "löschen"; + //this.btn_ZeroFlowCal_Detect.Text = "DETEKT"; + //this.l_ZeroFlowCal_Status.Text = "'DETEKT'-Taste drücken"; + } + else + { + //this.l_ZeroFlowCal_Meter1.Text = "METER1"; + //this.l_ZeroFlowCal_Meter2.Text = "METER2"; + //this.l_ZeroFlowCal_Meter3.Text = "METER3"; + //this.l_ZeroFlowCal_Meter4.Text = "METER4"; + //this.l_ZeroFlowCal_Meter5.Text = "METER5"; + //this.l_ZeroFlowCal_Meter6.Text = "METER6"; + //this.l_ZeroFlowCal_Meter7.Text = "METER7"; + //this.l_ZeroFlowCal_Meter8.Text = "METER8"; + //this.l_ZeroFlowCal_Meter9.Text = "METER9"; + //this.l_ZeroFlowCal_Meter10.Text = "METER10"; + //this.l_ZeroFlowCal_Detect.Text = "DETECT"; + //this.l_ZeroFlowCal_Prepare.Text = "PREPARE"; + //this.l_ZeroFlowCal_Amplitude.Text = "AMPLITUDE\nTEST"; + //this.l_ZeroFlowCal_TempCal.Text = "TEMPERATURE\nCALIBRATION"; + //this.l_ZeroFlowCal_Completion.Text = "COMPLETION"; + //this.l_ZeroFlowCal_Resttime.Text = "Estimated time to finish: "; + //this.cB_ZeroFlowCal_EnableMeter1.Text = "enable"; + //this.cB_ZeroFlowCal_EnableMeter2.Text = "enable"; + //this.cB_ZeroFlowCal_EnableMeter3.Text = "enable"; + //this.cB_ZeroFlowCal_EnableMeter4.Text = "enable"; + //this.cB_ZeroFlowCal_EnableMeter5.Text = "enable"; + //this.cB_ZeroFlowCal_EnableMeter6.Text = "enable"; + //this.cB_ZeroFlowCal_EnableMeter7.Text = "enable"; + //this.cB_ZeroFlowCal_EnableMeter8.Text = "enable"; + //this.cB_ZeroFlowCal_EnableMeter9.Text = "enable"; + //this.cB_ZeroFlowCal_EnableMeter10.Text = "enable"; + //this.btn_ZeroFlowCal_Save.Text = "Save"; + //this.btn_ZeroFlowCal_Clear.Text = "Clear"; + //this.btn_ZeroFlowCal_Detect.Text = "DETECT"; + //this.l_ZeroFlowCal_Status.Text = "Press 'DETECT'"; + + } + + } + + public static void WaitNSeconds(Int32 seconds, bool fromGui = false) + { + fromGui = true; + if (fromGui) + { + if (seconds < 1) + { + return; + } + + TimeSpan ts = new TimeSpan(); + DateTime _desired = DateTime.Now.AddSeconds(seconds); + while (DateTime.Now < _desired) + { + Application.DoEvents(); + Thread.Sleep(100); + } + } + else + { + Thread.Sleep(seconds * 1000); + } + } + + private bool isAutomaticMode = false; + public void AutoStart() + { + try + { + isAutomaticMode = true; + + btn_ZeroFlowCal_Detect_Click(null, EventArgs.Empty); + if (detectState == false) + { + throw new ApplicationException("Detect failed"); + } + if (settings.MeterSize != MeterSize.NA) + { + btn_ZeroFlowCal_Start_Click(null, EventArgs.Empty); + } + + //OnIsDone?.Invoke(null, EventArgs.Empty); + } + catch (Exception ex) + { + var r = ShowMsg($"{ex.Message} {Environment.NewLine} Retry?", "Retry?", MessageBoxButtons.RetryCancel); + + if (r == DialogResult.Retry) + { + AutoStart(); + } + else + { + + OnAbort?.Invoke(null, new EventArgsMeterSuccsessfull(new List())); + } + + } + } + + public DialogResult ShowMsg(string text, string caption = "no caption", MessageBoxButtons buttons = MessageBoxButtons.OK, MessageBoxIcon icon = MessageBoxIcon.Information, bool OverrideAutomatic = false, bool WaitForResponse = true) + { + + if (!isAutomaticMode || OverrideAutomatic) + { + if (WaitForResponse) + { + return MessageBox.Show(text, caption, buttons, icon); + } + else + { + //new Task(() => { new MsgBox(caption, text).Show(); }).Start(); + return DialogResult.OK; + } + + } + else + { + return DialogResult.OK; + } + } + + public static class PredefinedMessages + { + #region Miscellaneous + public static String StorageFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Speichern fehlgeschlagen"; + } + else + { + Message = "Storage failed"; + } + + return Message; + } + public static String MeterSequenceFailed(String sequenceName, String MeterIndex, CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = $"{sequenceName} fehlgeschlagen bei ZÄHLER{MeterIndex}"; + } + else + { + Message = $"{sequenceName} failed at METER{MeterIndex}"; + } + + return Message; + } + public static String AreYouSure(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Sind Sie sicher?"; + } + else + { + Message = "Are you sure?"; + } + + return Message; + } + public static String PressDetect(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'DETEKT'-Taste drücken"; + } + else + { + Message = "Press 'DETECT'"; + } + + return Message; + } + public static String WaitDetect(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis 'DETEKT' beendet"; + } + else + { + Message = "Wait until 'DETECTION' has finished"; + } + + return Message; + } + public static String WaitSeconds(Int32 seconds, CultureInfo culture) + { + String Message = String.Empty; + String Time = seconds.ToString(culture); + if (culture.Name == "de-DE") + { + Message = $"Wartezeit {Time} Sekunden"; + } + else + { + Message = $"Wait {Time} seconds"; + } + + return Message; + } + public static String DetectFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'DETEKT' fehlgeschlagen"; + } + else + { + Message = "'DETECT' failed"; + } + + return Message; + } + public static String PressStartOrDetect(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'START'-Taste drücken oder 'DETEKT' wiederholen"; + } + else + { + Message = "Press 'START' or repeat 'DETECT'"; + } + + return Message; + } + public static String NoMeterSelected(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Keinen ZÄHLER ausgewählt"; + } + else + { + Message = "No METER selected"; + } + + return Message; + } + public static String NoMeterPresent(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Kein ZÄHLER bereit"; + } + else + { + Message = "No METER present"; + } + + return Message; + } + public static String NoThermometerPresent(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Kein THERMOMETER bereit"; + } + else + { + Message = "No THERMOMETER present"; + } + + return Message; + } + public static String WaitUntilTemperatureAcquisitionFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis Temperaturakquirierung beendet ist"; + } + else + { + Message = "Wait until temperature acquisition finished"; + } + + return Message; + } + public static String WaitUntilTemperatureCalibrationFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis Temperaturkalibrierung beendet ist"; + } + else + { + Message = "Wait until temperature calibration finished"; + } + + return Message; + } + public static String WaitUntilFlushFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis Spülvorgang beendet ist"; + } + else + { + Message = "Wait until flushing pipe is finished"; + } + + return Message; + } + public static String NoThermometerSelected(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Kein Thermometer ausgewählt"; + } + else + { + Message = "No THERMOMETER selected"; + } + + return Message; + } + public static String WaitForStabilization(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis Werte stabil: "; + } + else + { + Message = "Wait for stabilization: "; + } + + return Message; + } + #endregion + #region Empty pipe mode + public static String WaitForEmptyPipe(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis 'EMPTY PIPE'-Modus beendet: "; + } + else + { + Message = "Wait for leaving 'EMPTY PIPE' mode: "; + } + + return Message; + } + public static String EmptyPipeFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'EMPTY PIPE'-check fehlgeschlagen"; + } + else + { + Message = "'EMPTY PIPE'-check failed"; + } + + return Message; + } + #endregion + #region LOGIN + public static String WaitUntilLoginFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis 'LOGIN' beendet"; + } + else + { + Message = "Wait until 'LOGIN' has finished"; + } + + return Message; + } + public static String LoginFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'LOGIN'-fehlgeschlagen"; + } + else + { + Message = "'LOGIN'-failed"; + } + + return Message; + } + #endregion + #region PREPARATION + public static String WaitUntilPreparationFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis 'RÜSTEN' beendet"; + } + else + { + Message = "Wait until 'PREPARE' has finished"; + } + + return Message; + } + public static String PreparationFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'RÜSTEN' fehlgeschlagen"; + } + else + { + Message = "'PREPARE' failed"; + } + + return Message; + } + public static String PreparationStopped(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'RÜSTEN' gestoppt"; + } + else + { + Message = "'PREPARE' stopped"; + } + + return Message; + } + #endregion + #region AMPLITUDE TEST + public static String WaitUntilAmplitudeTestFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis AMPLITUDENTEST beendet"; + } + else + { + Message = "Wait until AMPLITUDE TEST has finished"; + } + + return Message; + } + public static String WaitUntilRegisterWriteFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis Schreiben auf Register beendet"; + } + else + { + Message = "Wait until register write has finished"; + } + + return Message; + } + public static String WaitUntilRegisterReadFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis Lesen vom Register beendet"; + } + else + { + Message = "Wait until register read has finished"; + } + + return Message; + } + public static String WaitUntilPercentageSweepFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis Messung beendet"; + } + else + { + Message = "Wait for percentage sweep to end:"; + } + + return Message; + } + public static String WaitUntilAmplitudeFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis 'AMPLITUDENTEST' beendet"; + } + else + { + Message = "Wait until 'AMPLITUDE TEST' has finished"; + } + + return Message; + } + public static String AmplitudeFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'AMPLITUDENTEST' fehlgeschlagen"; + } + else + { + Message = "'AMPLITUDE TEST' failed"; + } + + return Message; + } + public static String AmplitudeStopped(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'AMPLITUDENTEST' gestoppt"; + } + else + { + Message = "'AMPLITUDE TEST' stopped"; + } + + return Message; + } + #endregion + #region ZEROFLOW OFFSET TEST + public static String WaitUntilZeroflowOffsetTestFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis 'OFFSET TEST' beendet"; + } + else + { + Message = "Wait until 'OFFSET TEST' has finished"; + } + + return Message; + } + public static String ZeroflowOffsetAqqFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis Datenaufnahme beendet:"; + } + else + { + Message = "Wait until data aquisition has finished:"; + } + + return Message; + } + public static String ZeroflowOffsetTestFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'ZEROFLOW OFFSET TEST' fehlgeschlagen"; + } + else + { + Message = "'ZEROFLOW OFFSET TEST' failed"; + } + + return Message; + } + public static String ZeroflowOffsetTestStopped(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'ZEROFLOW OFFSET TEST' gestoppt"; + } + else + { + Message = "'ZEROFLOW OFFSET TEST' stopped"; + } + + return Message; + } + public static String ZeroflowOffsetWaitForSettling(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Beruhigungszeit abwarten: "; + } + else + { + Message = "Wait for settling time: "; + } + + return Message; + } + #endregion + #region TEMPERATURE CALIBRATION + public static String TempCalFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "TEMPERATUR KALIBRIERUNG fehlgeschlagen bei ZÄHLER"; + } + else + { + Message = "TEMPERATURE CALIBRATION failed at METER"; + } + + return Message; + } + #endregion + #region COMPLETION + public static String WaitUntilCompletionFinished(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "Warten bis 'ABSCHLUSS' beendet"; + } + else + { + Message = "Wait until 'COMPLETION' has finished"; + } + + return Message; + } + public static String CompletionStopped(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'ABSCHLUSS' gestoppt"; + } + else + { + Message = "'COMPLETION' stopped"; + } + + return Message; + } + public static String CompletionFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'ABSCHLUSS' fehlgeschlagen"; + } + else + { + Message = "'COMPLETION' failed"; + } + + return Message; + } + #endregion + #region ZEROFLOW CALIBRATION SEQUENCE + public static String ZeroflowCalibrationSequenceStopped(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'ZEROFLOW KALIBRIERUNGS'-Sequenz gestoppt"; + } + else + { + Message = "'ZEROFLOW CALIBRATION' sequence stopped"; + } + + return Message; + } + public static String ZeroflowCalibrationSequenceFailed(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'ZEROFLOW KALIBRIERUNGS'-Sequenz fehlgeschlagen"; + } + else + { + Message = "'ZEROFLOW CALIBRATION' sequence failed"; + } + + return Message; + } + public static String ZeroflowCalibrationSequenceSuccessful(CultureInfo culture) + { + String Message = String.Empty; + + if (culture.Name == "de-DE") + { + Message = "'ZEROFLOW KALIBRIERUNGS'-Sequenz erfolgreich"; + } + else + { + Message = "'ZEROFLOW CALIBRATION' sequence successful"; + } + + return Message; + } + #endregion + } + #endregion + + private bool detectState = true; + private void btn_ZeroFlowCal_Detect_Click(object sender, System.EventArgs e) + { + detectState = true; + CultureInfo Culture = settings.Culture; + try + { + btn_ZeroFlowCal_Detect.Enabled = false; + if (GlobalMeterBatch.ListOfMeters.Any()) + { + GlobalMeterBatch.RemoveAllMeters(); + } + + if (ThermoMeterBatch.ListOfMeters.Any()) + { + ThermoMeterBatch.RemoveAllMeters(); + } + + GlobalMeterBatch = new MeterBatch(); + ThermoMeterBatch = new MeterBatch(); + if (!settings.GetTempUseTempFlansh()) + { + TempMeterStateCtls = new List(); + } + #region Definitions and initializations + + foreach (var meterStateCtl in AllMeterStateCtrls()) + { + + if (meterStateCtl.IsEnabled || meterStateCtl is TempMeterStateControl) + { + + //if (meterStateCtl is TempMeterStateControl && (((TempMeterStateControl)meterStateCtl).HasMeter && meterStateCtl.Meter != null)) + //{ + // continue; + //} + if (meterStateCtl.Slot != -1) + { + var currentMeter = new ZeroFlowGenesisMeter(meterStateCtl.Slot, 3, !(meterStateCtl is TempMeterStateControl)); + + currentMeter.LogOnEnable = true; + currentMeter.LoginFailed = false; + currentMeter.PreparationFailed = false; + currentMeter.AmplitudeFailed = false; + currentMeter.ZeroFlowOffsetFailed = false; + currentMeter.AmplitudeFailed = false; + currentMeter.CompletionFailed = false; + currentMeter.Ok = false; + currentMeter.EmptyPipeCheckEnable = false; + currentMeter.EmptyPipeCheckFailed = false; + if (meterStateCtl is TempMeterStateControl) + { + ThermoMeterBatch.AddMeter(currentMeter); + meterStateCtl.IsEnabled = true; + } + else + { + GlobalMeterBatch.AddMeter(currentMeter); + } + + meterStateCtl.Meter = currentMeter; + } + } + + } + + #endregion + WaitNSeconds(2, true); + btn_ZeroFlowCal_Detect.Enabled = true; + } + catch (Exception ex) + { + ShowMsg($"{PredefinedMessages.DetectFailed(Culture)} {Environment.NewLine} {ex.Message}"); + + + btn_ZeroFlowCal_Detect.Enabled = true; + detectState = false; + return; + } + + #region Definitions and initializations + //Boolean[] EnableOpening = new Boolean[Constants.NumberOfMeters]; + //Boolean[] ThermoEnableOpening = new Boolean[Constants.NumberOfThermometers]; + //Boolean[] Ok = new Boolean[2 * Constants.NumberOfMeters]; + //Boolean[] ThermoOk = new Boolean[2 * Constants.NumberOfThermometers]; + //Boolean[] SetToUnknownStatus = new Boolean[Constants.NumberOfMeters]; + //Boolean[] ThermoSetToUnknownStatus = new Boolean[Constants.NumberOfThermometers]; + + foreach (var meterState in AllMeterStateCtrls()) + { + meterState.EnableOpening = meterState.IsEnabled; + } + + btn_ZeroFlowCal_Start.Enabled = false; + AbortIndicator = false; + #endregion + #region Bubbles + pB_Bubbles1.Visible = true; + #endregion + + if (!MeterStateCtls.Any(a => a.EnableOpening)) + { + ShowMsg(PredefinedMessages.NoMeterSelected(Culture), "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + StatusLabel(PredefinedMessages.PressDetect(Culture)); + SetControlElements(true); + detectState = false; + return; + } + + + foreach (var meterState in AllMeterStateCtrls()) + { + meterState.SetToUnknownStatus = !meterState.EnableOpening; + } + + + #region Visual indication 'PREPARE' + SetProgressPanel(StatusPanelItems.Detect); + StatusLabel(PredefinedMessages.WaitDetect(Culture)); + + foreach (var meterCtl in MeterStateCtls) + { + if (meterCtl != null && meterCtl.IsEnabled) + { + meterCtl.Ok = meterCtl.Meter.CheckRequestPort() && meterCtl.Meter.CheckStreamingPort(); + } + } + try + { + if (!settings.GetTempUseManualInput()) + { + + + foreach (var meterCtl in TempMeterStateCtls) + { + if (meterCtl != null && meterCtl.IsEnabled) + { + meterCtl.Ok = meterCtl.Meter.CheckStreamingPort(); + } + } + AllMeterStateCtrls().ForEach(f => f.SetUi()); + } + } + catch (Exception ex) + { + ShowMsg($"TempMeterError{ex.Message}"); + } + + + + + //Display.ConnectionStatusReset(SetToUnknownStatus); + //Display.ThermoConnectionStatusReset(ThermoSetToUnknownStatus); + #endregion + #region Status message + StatusLabel(PredefinedMessages.PressStartOrDetect(Culture)); + btn_ZeroFlowCal_Start.Enabled = true; + pB_Bubbles1.Visible = false; + #endregion + } + public event EventHandler OnAbort; + public event EventHandler OnIsDone; + public event EventHandler OnRequestFlush; + public event EventHandler OnRequestTemperatur; + + + + + public DialogResult AskForRetry(String sequenceName, string Text) + { + + if (this.InvokeRequired) + { + return (DialogResult)this.Invoke(new Func(() => { return AskForRetry(sequenceName, Text); })); + } + else + { + DialogResult AskForActions = DialogResult.Ignore; + AbortButtonEnabled(false); + AskForActions = ShowMsg(Text, $"{sequenceName}", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Question, true); + AbortButtonEnabled(true); + + DebugMessage($"AskForActions on {sequenceName} selected {AskForActions}"); + return AskForActions; + } + + + } + private void ClearLog() + { + rTB_ZeroFlowCal.Clear(); // Clear log (textbox) + proccessLog.Clear(); + } + private void btn_ZeroFlowCal_Start_Click(object sender, System.EventArgs e) + { + + pp = new ProcessProgress(); + pp.Setting = settings; + pp.Logo = pB_Logo1.Image; + //if (!isAutomaticMode) + //{ + pp.Setting.MeterSize = (MeterSize)cb_Metersize.SelectedItem; // ((MeterSize)nUD_SettingsPreparationMetersize.Value); + //} + + + AllMeterStateCtrls().ForEach(mc => mc.EnabeldBoxEnabel(false)); + foreach (var tm in TempMeterStateCtls.Where(t => t.IsEnabled)) + { + tm.OnWatcherFailed += delegate (Object o, EventArgs b) + { + //pp.CancellationSource.Cancel(); + DebugMessage("Tempreature watch failed"); + ShowMsg(PredefinedMessages.ZeroflowOffsetTestFailed(pp.Setting.Culture), "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + }; + } + + + pp.OnBubblesChanged += delegate (Object o, EventArgsBool b) + { + SetBusy(b.Value); + + }; + pp.OnDebugMessageChanged += delegate (Object o, EventArgsDebug s) + { + + try + { + DebugMessage(s.Value, s.Slot, s.Source, s.PcbId); + } + catch (Exception) + { + //ignor + } + }; + if (!TempMeterStateCtls.Any(a => a.IsEnabled)) + { + pp.OnRequestTempretureSelection += PpOnOnRequestTempretureSelection; + } + + pp.OnStatusLabelChanged += delegate (Object o, EventArgsString s) { StatusLabel(s.Value); }; + pp.OnForceFailedMessage += delegate (Object o, EventArgs args) + { + ShowMsg(PredefinedMessages.ZeroflowOffsetTestFailed(pp.Setting.Culture), "Form closing", MessageBoxButtons.OK, MessageBoxIcon.Error); + }; + OnAbort += (o, args) => + { + pp.StopSequence = true; + pp.CancellationSource.Cancel(); + }; + pp.IsAutomaticMode = isAutomaticMode; + pp.OnRequestFlush += delegate (Object o, EventArgsMeterSize size) + { + var flushParams = new FlushParams(size.Value); + if (OnRequestFlush == null) + { + ShowMsg($"{flushParams.Message}", "Flush", MessageBoxButtons.OK, MessageBoxIcon.Information, false, false); + pp.FlushDone = true; + } + else + { + OnRequestFlush.Invoke(o, new EventArgsFlushRequest(flushParams)); + } + + }; + + + pp.OnRequestTemperatur += delegate (Object o, EventArgs args) + { + + OnRequestTemperatur?.Invoke(o, new EventArgs()); + + + }; + + + try + { + + OnAbort += (o, args) => pp.CancellationSource.Cancel(); + btn_ZeroFlowCal_Start.Enabled = false; + + List listOfProgrammParts = new List(); + + + + listOfProgrammParts.Add(new PrepareTestProcess("PrepareTest", CordonelPreadjustmentUi.PreAdjustmentControl.StatusPanelItems.Detect, string.Empty, string.Empty, 1 * 60)); + + listOfProgrammParts.Add(new LoginProcess("Login", CordonelPreadjustmentUi.PreAdjustmentControl.StatusPanelItems.Detect, PredefinedMessages.WaitUntilLoginFinished(pp.Setting.Culture), PredefinedMessages.LoginFailed(pp.Setting.Culture), 1 * 60)); + + listOfProgrammParts.Add(new FlushProcess("First Flush", CordonelPreadjustmentUi.PreAdjustmentControl.StatusPanelItems.Detect, PredefinedMessages.WaitUntilFlushFinished(pp.Setting.Culture), string.Empty, 2 * 60)); + + //listOfProgrammParts.Add(new PressureTestProcess("PreussureTest", StatusPanelItems.Prepare, PredefinedMessages.WaitUntilPreparationFinished(pp.Setting.Culture), PredefinedMessages.PreparationFailed(pp.Setting.Culture), 1 * 60)); + + if (pp.Setting.NumberOfPaths == 1) + { + listOfProgrammParts.Add(new SPPreparationProcess("Preparation Single", CordonelPreadjustmentUi.PreAdjustmentControl.StatusPanelItems.Prepare, PredefinedMessages.WaitUntilPreparationFinished(pp.Setting.Culture), PredefinedMessages.PreparationFailed(pp.Setting.Culture), 1 * 60)); + + } + else + { + listOfProgrammParts.Add(new PreparationProcess("Preparation", CordonelPreadjustmentUi.PreAdjustmentControl.StatusPanelItems.Prepare, PredefinedMessages.WaitUntilPreparationFinished(pp.Setting.Culture), PredefinedMessages.PreparationFailed(pp.Setting.Culture), 1 * 60)); + + } + + + + + if (!pp.Setting.TempOnly) + { + if (pp.Setting.NumberOfPaths == 1) + { + listOfProgrammParts.Add(new SPAmplitudeTestProcess("Amplitude Test Single", CordonelPreadjustmentUi.PreAdjustmentControl.StatusPanelItems.Amplitude, PredefinedMessages.WaitUntilAmplitudeTestFinished(pp.Setting.Culture), PredefinedMessages.AmplitudeFailed(pp.Setting.Culture), 4 * 60)); + } + else + { + listOfProgrammParts.Add(new AmplitudeTestProcess("Amplitude Test", CordonelPreadjustmentUi.PreAdjustmentControl.StatusPanelItems.Amplitude, PredefinedMessages.WaitUntilAmplitudeTestFinished(pp.Setting.Culture), PredefinedMessages.AmplitudeFailed(pp.Setting.Culture), 4 * 60)); + } + + listOfProgrammParts.Add(new FlushProcess("Second Flush", CordonelPreadjustmentUi.PreAdjustmentControl.StatusPanelItems.Amplitude, PredefinedMessages.WaitUntilFlushFinished(pp.Setting.Culture), string.Empty, 2 * 60)); + } + + if (pp.Setting.NumberOfPaths == 1) + { + listOfProgrammParts.Add(new SPTemperatureCalibrationProcess("Temperature Calibration Single", CordonelPreadjustmentUi.PreAdjustmentControl.StatusPanelItems.TempCal, PredefinedMessages.WaitUntilTemperatureCalibrationFinished(pp.Setting.Culture), PredefinedMessages.TempCalFailed(pp.Setting.Culture), 2 * 60)); + + if (!pp.Setting.TempOnly) + { + listOfProgrammParts.Add(new SPOffsetTestProcess("Offset Test Single", CordonelPreadjustmentUi.PreAdjustmentControl.StatusPanelItems.Offset, PredefinedMessages.WaitUntilZeroflowOffsetTestFinished(pp.Setting.Culture), PredefinedMessages.ZeroflowOffsetTestFailed(pp.Setting.Culture), 18 * 60)); + } + listOfProgrammParts.Add(new SPCompletionProcess("Completion Single", CordonelPreadjustmentUi.PreAdjustmentControl.StatusPanelItems.Completion, PredefinedMessages.WaitUntilCompletionFinished(pp.Setting.Culture), PredefinedMessages.CompletionFailed(pp.Setting.Culture), 1 * 60)); + + } + else + { + listOfProgrammParts.Add(new TemperatureCalibrationProcess("Temperature Calibration", CordonelPreadjustmentUi.PreAdjustmentControl.StatusPanelItems.TempCal, PredefinedMessages.WaitUntilTemperatureCalibrationFinished(pp.Setting.Culture), PredefinedMessages.TempCalFailed(pp.Setting.Culture), 2 * 60)); + + if (!pp.Setting.TempOnly) + { + listOfProgrammParts.Add(new OffsetTestProcess("Offset Test", CordonelPreadjustmentUi.PreAdjustmentControl.StatusPanelItems.Offset, PredefinedMessages.WaitUntilZeroflowOffsetTestFinished(pp.Setting.Culture), PredefinedMessages.ZeroflowOffsetTestFailed(pp.Setting.Culture), 18 * 60)); + } + listOfProgrammParts.Add(new CompletionProcess("Completion", CordonelPreadjustmentUi.PreAdjustmentControl.StatusPanelItems.Completion, PredefinedMessages.WaitUntilCompletionFinished(pp.Setting.Culture), PredefinedMessages.CompletionFailed(pp.Setting.Culture), 1 * 60)); + + } + + + + var t = new Task(() => + { + try + { + int totalSecondsEstm = 0; + foreach (BaseProcess curentProccess in listOfProgrammParts) + { + totalSecondsEstm = totalSecondsEstm + curentProccess.ExpectedTimeS; + + } + DateTimeOffset totalStart = DateTimeOffset.UtcNow; + DateTimeOffset? totalStartOffset = null; + + foreach (BaseProcess curentProccess in listOfProgrammParts) + { + if (!MeterStateCtls.Any(m => m.IsEnabled)) + { + DebugMessage($"\tAPPLICATION:\t\t No device enabled"); + DebugMessage($"\tAPPLICATION:\t\t ZEROFLOW CALIBRATION sequence failed"); + pp.StopSequence = true; + + listOfProgrammParts.Last().StartProcess(pp, MeterStateCtls, TempMeterStateCtls); + + while (pp.IsBusy) + { + Thread.Sleep(50); + + } + + } + + + + pp.IsBusy = true; + var done = false; + while (!done && !pp.StopSequence) + { + pp.IsBusy = true; + try + { + if (curentProccess is OffsetTestProcess) + { + totalStartOffset = DateTimeOffset.UtcNow; + } + curentProccess.StartProcess(pp, MeterStateCtls, TempMeterStateCtls); + } + catch (Exception ex) + { + ShowMsg($"Error on Start Process", ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error, true); + throw; + } + + var secondCounter = 0; + while (pp.IsBusy) + { + Thread.Sleep(50); + try + { + if (secondCounter >= 1000) + { + PushProgressBars(totalSecondsEstm, totalStart, curentProccess.ExpectedTimeS, curentProccess.StartTime); + secondCounter = 0; + } + else + { + secondCounter = secondCounter + 50; + } + } + catch (Exception ex) + { + DebugMessage(ex); + } + + } + + if (totalStartOffset.HasValue) + { + var ts = DateTimeOffset.UtcNow - totalStartOffset.Value; + DebugMessage($"offset duration= {ts.TotalSeconds}"); + + MeterStateCtls.ForEach(f => f.Meter?.calibrationResult?.AddAdditionalLog($"offset duration=", $"{ts.TotalSeconds}S")); + + totalStartOffset = null; + + } + MeterStateCtls.ForEach(f => f.SetUi()); + + if (MeterStateCtls.Any(a => a.IsEnabled && a.Failed)) + { + var sb = new StringBuilder(); + + + + if (MeterStateCtls.Count(a => a.IsEnabled && a.Failed) == 1) + { + sb.Append($"Der Zähler hat den {curentProccess.ProcessName} nicht bestanden."); + } + else + { + sb.Append($"Die Zähler haben den {curentProccess.ProcessName} nicht bestanden."); + } + sb.AppendLine(""); + foreach (var a in MeterStateCtls.Where(a => a.IsEnabled && a.Failed).ToList()) + { + if (string.IsNullOrEmpty(a.Meter.SerialNumber)) + { + sb.Append($"{a.Meter.PcbId} an EP. {a.Slot},"); + } + else + { + sb.Append($"{a.Meter.SerialNumber} an EP. {a.Slot},"); + } + } + + sb = sb.Remove(sb.Length - 1, 1); + + sb.AppendLine(""); + sb.AppendLine("Soll der Schritt wiederholt werden (Retry/Wiederholen) ?"); + + if (MeterStateCtls.Count(a => a.IsEnabled && a.Failed) == 1) + { + sb.AppendLine("Ohne diesen Zähler fortgefahren werden (Ignor/Ignorieren)?"); + } + else + { + sb.AppendLine("Ohne diese Zähler fortgefahren (Ignor/Ignorieren)?"); + } + sb.AppendLine("Soll der Prozess für ALLE Zähler abgebrochen werden (Cancel/Abbruch)?"); + + + switch (AskForRetry(curentProccess.ProcessName, sb.ToString())) + { + case DialogResult.Retry: + MeterStateCtls.Where(a => a.IsEnabled && !a.Failed).ToList().ForEach(a => a.SetDisableForRetry()); + MeterStateCtls.Where(a => a.IsEnabled && a.Failed).ToList().ForEach(a => a.Failed = false); + break; + case DialogResult.Ignore: + MeterStateCtls.Where(a => a.IsEnabled && !a.Failed).ToList().ForEach(a => a.IsEnabled = false); + done = true; + break; + default: + + pp.StopSequence = true; + break; + } + + //var returnValue = AskForRetry..Invoke(); + + } + else + { + done = true; + } + MeterStateCtls.ForEach(a => a.SetEnableAfterRetry()); + + + } + foreach (var checkMeterForFailed in AllMeterStateCtrls()) + { + if (checkMeterForFailed.IsEnabled && checkMeterForFailed.Failed) + { + pp.GenerateReturnNote(curentProccess.FailedMessage, checkMeterForFailed); + try + { + if (!pp.IsAutomaticMode) + { + checkMeterForFailed.Meter.SetProcessState(DisplayCodes.ZeroFlowFailed); + } + + } + catch (Exception) + { + + } + checkMeterForFailed.IsEnabled = false; + } + } + + + if (pp.StopSequence || !MeterStateCtls.Any(meter => !meter.Failed)) + { + StopMainSequence(curentProccess.FailedMessage, MessageBoxIcon.Error, pp.Setting.Culture); + return; + } + + AbortIndicator = false; + SetControlElements(false); + SetProgressPanel((StatusPanelItems)curentProccess.PanelState); + + + if (!GlobalMeterBatch.ListOfMeters.Any() && MeterStateCtls.Any(meter => meter.IsEnabled && !meter.Failed)) + { + StopMainSequence(PredefinedMessages.NoMeterSelected(pp.Setting.Culture), MessageBoxIcon.Error, + pp.Setting.Culture); + } + + //if ((pp.AtLeastOneThermometerPresent) || (pp.AtLeastOneMeterPresent)) return pp; + //StopMainSequence( + // !pp.AtLeastOneThermometerPresent + // ? PredefinedMessages.NoThermometerPresent(pp.Culture) + // : PredefinedMessages.NoMeterPresent(pp.Culture), + // MessageBoxIcon.Error, pp.Culture); + } + + } + catch (Exception ex) + { + ShowMsg($"Critical error", ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error, true); + DebugMessage(ex); + } + finally + { + + var GoodMeters = new List(); + foreach (var addToSuccessfullList in MeterStateCtls.Where(a => a.IsEnabled && !a.Failed)) + { + GoodMeters.Add(addToSuccessfullList.Meter.Slot); + } + + GlobalMeterBatch?.RemoveAllMeters(); + ThermoMeterBatch?.RemoveAllMeters(); + GlobalMeterBatch.Dispose(); + ThermoMeterBatch.Dispose(); + + TestDone(PredefinedMessages.ZeroflowCalibrationSequenceSuccessful(pp.Setting.Culture), pp.Setting.Culture, GoodMeters); + } + + + } + ); + t.Start(); + } + catch (Exception exception) + { + DebugMessage(exception); + + } + } + + public void PushProgressBars(int totalSecondsEstm, DateTimeOffset totalStart, int currentProccessEstm, DateTimeOffset currentProccessStartTime) + { + if (this.InvokeRequired) + { + Invoke((Action)PushProgressBars, totalSecondsEstm, totalStart, currentProccessEstm, currentProccessStartTime); + return; + } + try + { + l_ZeroFlowCal_SubResttimeDisplayValue.Text = currentProccessStartTime.ToLocalTime().AddSeconds(currentProccessEstm).ToString("HH:mm:ss"); + l_ZeroFlowCal_ResttimeDisplayValue.Text = totalStart.ToLocalTime().AddSeconds(totalSecondsEstm).ToString("HH:mm:ss"); + + int progressPer = 0; + var pastSeconds = (int)(DateTimeOffset.UtcNow - totalStart).TotalSeconds; + if (pastSeconds > 0) + { + progressPer = (int)(pastSeconds / (totalSecondsEstm / 100.0)); + progressPer = progressPer >= 100 ? 100 : progressPer; + } + + + pB_ZeroFlowCal_Progress.Value = progressPer; + + progressPer = 0; + pastSeconds = (int)(DateTimeOffset.UtcNow - currentProccessStartTime).TotalSeconds; + + if (pastSeconds > 0) + { + progressPer = (int)(pastSeconds / (currentProccessEstm / 100.0)); + progressPer = progressPer >= 100 ? 100 : progressPer; + } + + + pB_ZeroFlowCal_SubProgress.Value = progressPer; + } + catch (Exception ex) + { + DebugMessage($"Not able to update proccess {ex.Message}"); + } + + } + + private void TestDone(string msg, CultureInfo c, List goodMeters) + { + + if (this.InvokeRequired) + { + Invoke((Action>)TestDone, msg, c, goodMeters); + return; + } + + AllMeterStateCtrls().ForEach(ctl => ctl.Dispose()); + PreAdjustmentControl_Load(this, EventArgs.Empty); + GlobalMeterBatch = new MeterBatch(); + ThermoMeterBatch = new MeterBatch(); + StopMainSequence(msg, MessageBoxIcon.Information, c); + + OnIsDone?.Invoke(this, new EventArgsMeterSuccsessfull(goodMeters)); + + + } + + + private void PpOnOnRequestTempretureSelection(Object sender, EventArgsBool e) + { + + if (this.InvokeRequired) + { + Invoke((Action)PpOnOnRequestTempretureSelection, sender, e); + return; + } + + btn_StoreTempe.Enabled = true; + } + + public void StopMainSequence(String message, MessageBoxIcon icon, CultureInfo culture) + { + + SetProgressPanel(StatusPanelItems.None); + + AbortButtonEnabled(false); + SetControlElements(true); + StatusLabel(PredefinedMessages.PressDetect(pp.Setting.Culture)); + ShowMsg(message, "Form closing", MessageBoxButtons.OK, icon); // "'ZEROFLOW CALIBRATION' sequence stopped" + return; + + } + + + // + + private void btn_ZeroFlowCal_Abort_Click(object sender, System.EventArgs e) + { + + DialogResult AskForActions = DialogResult.None; + btn_ZeroFlowCal_Abort.Enabled = false; + + AskForActions = ShowMsg(PredefinedMessages.AreYouSure(settings.Culture), "Form closing", MessageBoxButtons.OKCancel, MessageBoxIcon.Error); + + if (DialogResult.Equals(AskForActions, DialogResult.OK)) + { + + AbortIndicator = true; + OnAbort?.Invoke(null, new EventArgsMeterSuccsessfull(new List())); + } + else + { + AbortIndicator = false; + btn_ZeroFlowCal_Abort.Enabled = true; + } + } + + private void btn_StoreTempe_Click(object sender, EventArgs e) + { + btn_StoreTempe.Enabled = false; + pp.TempretureSelected = true; + } + + private void btn_ShowAll_Click(object sender, EventArgs e) + { + if (this.InvokeRequired) + { + this.Invoke((Action)btn_ShowAll_Click, sender, e); + return; + } + rTB_ZeroFlowCal.Visible = true; + gB_MeterLog.Visible = false; + } + } +} diff --git a/GenesisCordonelInterface/UI/LaatzenAPI_CordonelPreadjustmentUI/PreAdjustmentControl.resx b/GenesisCordonelInterface/UI/LaatzenAPI_CordonelPreadjustmentUI/PreAdjustmentControl.resx new file mode 100644 index 000000000..719eb0636 --- /dev/null +++ b/GenesisCordonelInterface/UI/LaatzenAPI_CordonelPreadjustmentUI/PreAdjustmentControl.resx @@ -0,0 +1,2261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + /9j/4AAQSkZJRgABAgEAAAAAAAD/7gAOQWRvYmUAZAAAAAAB/9sAQwACAgICAgICAgICAwICAgMEAwIC + AwQFBAQEBAQFBgUFBQUFBQYGBwcIBwcGCQkKCgkJDAwMDAwMDAwMDAwMDAwM/9sAQwEDAwMFBAUJBgYJ + DQsJCw0PDg4ODg8PDAwMDAwPDwwMDAwMDA8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgB + IwJYAwERAAIRAQMRAf/EAB8AAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKC//EALUQAAIBAwMCBAIG + BwMEAgYCcwECAxEEAAUhEjFBUQYTYSJxgRQykaEHFbFCI8FS0eEzFmLwJHKC8SVDNFOSorJjc8I1RCeT + o7M2F1RkdMPS4ggmgwkKGBmElEVGpLRW01UoGvLj88TU5PRldYWVpbXF1eX1ZnaGlqa2xtbm9jdHV2d3 + h5ent8fX5/c4SFhoeIiYqLjI2Oj4KTlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/EAB8BAAICAwEB + AQEBAAAAAAAAAAEAAgMEBQYHCAkKC//EALURAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZx + gZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp + 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJ + WWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A+/mKuxV2KuxV2KuxV2KuxV2KuxV2 + KuxV5r+cX/ksfOf/AGz2/wCJLmq7c/xLL/VcTXf3Evc/L3PI3kXYq7FXYq7FXYq7FXYq7FXYq/UL8nf/ + ACWPkz/tnr/xJs9c7D/xLF/Veu0P9xH3PSs2rluxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux + V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux + V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvN/zfR5Pyz85JGjSO2nsFRQST8S9AM1fbYJ0WWv5ri67+4l + 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 + 7FXYq7FXYq/kt/MP/lP/ADz/AOBBqf8A1FSZ7Npv7qH9Ufc+fZvrl7yw/L2t+nP/AD62/wDJvfmF/wCA + e3/dQtc5P2v/AMXh/W/QXedg/wB7L+r+kP3Jzz56l+S3/P1b/jgfkv8A9tDW/wDk1Z52fsf9eX3R/S89 + 2/8ATD4/ofjNndPNuxV2KuxV2KuxV2KuxV2KvRvyo/K/zT+cXnvQfIPlGze41LWbhVuLviWhsrYEGa7u + GH2Y4lqx7nZVqxAOLrNXDS4jkmdh9p7h727T4JZ5iEeZf1OeU/LWm+TPK3lvyho6FNJ8r6XaaTpqtTl6 + FnCsMfIilSVQVPjnkObLLLOU5c5Ek/F7zHAQiIjkBTIMqZvyD/5+Y/kbrOoXPl/88vLmmyX1jp+nrovn + oW6cjbRxStJZ3jhRUqfVaJ2Oy0jHfO29lO0IxEtPI0Sbj594/T83ne3NKTWWI8j+gvx5zt3nHYq7FXYq + 7FXYq7FXYq7FUw0rStT13U7DRdFsLjVdW1W4jtdN021jaWeeeVgqRxooJZmJoAMjOcYRMpGgOZTGJkaG + 5L+nr/nGf8pZfyT/ACW8l+Qb0xvrllbveeZZYm5IdRvZGnnVWBoyxFxErDqqA988l7W1v5vUyyDlyHuG + w/W9zodP4GGMDz6+97xmuct/Pd/z8c/9aY1T/wAB/Sf+TbZ6X7L/AOJD+sXj+2v8YPuD4OzonVOxV2Ku + xV2KuxV2KuxV2KvtL/nBv8i9Z/Nj85fL3mObTn/wN+XV/BrPmHVJFPovc2zCazs0Owd5JVUsvaMMT2Da + H2g7QjptNKN+uYoDyPM/L7XZ9laU5sol/DHc/oD7f/6JX+QP/Lq+YP8ApCtf65oP9GGX/U4/Mu0/kGH8 + 8u/6JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv+iV/kD/y6vmD/pCtf64/6MMv+px+ZX+QYfzy7/ol + f5A/8ur5g/6QrX+uP+jDL/qcfmV/kGH88u/6JX+QP/Lq+YP+kK1/rj/owy/6nH5lf5Bh/PLv+iV/kD/y + 6vmD/pCtf64/6MMv+px+ZX+QYfzy7/olf5A/8ur5g/6QrX+uP+jDL/qcfmV/kGH88u/6JX+QP/Lq+YP+ + kK1/rj/owy/6nH5lf5Bh/PKJtP8An1l+WiS1vvzO8zXEFN44ILOF6/67JKP+FyMva/N0xx+1R2Dj6yP2 + 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 + 2kvTYnofrV3qDQcPyCgC0J9qIgAAOw== + + + \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmConfigurations.Designer.cs b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmConfigurations.Designer.cs new file mode 100644 index 000000000..1b8b109d0 --- /dev/null +++ b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmConfigurations.Designer.cs @@ -0,0 +1,553 @@ +namespace GenesisCordonelInterface.UI.LaatzenAPI_GenesisToolBox +{ + partial class FrmConfigurations + { + /// + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblState = new System.Windows.Forms.Label(); + this.btnConnect = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.cbComSlot = new System.Windows.Forms.ComboBox(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.cbPulseWiegth = new System.Windows.Forms.ComboBox(); + this.panel1 = new System.Windows.Forms.Panel(); + this.rbEvenDistOff = new System.Windows.Forms.RadioButton(); + this.rbEvenDistOn = new System.Windows.Forms.RadioButton(); + this.lblPrencesInMin = new System.Windows.Forms.Label(); + this.label13 = new System.Windows.Forms.Label(); + this.label14 = new System.Windows.Forms.Label(); + this.lblPulseWeightInternal = new System.Windows.Forms.Label(); + this.label11 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.nudPulseResolution = new System.Windows.Forms.NumericUpDown(); + this.cbxPulseMode = new System.Windows.Forms.ComboBox(); + this.cbxPulseLength = new System.Windows.Forms.ComboBox(); + this.label8 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.nudAdapterPresence = new System.Windows.Forms.NumericUpDown(); + this.rbTestModeOff = new System.Windows.Forms.RadioButton(); + this.rbTestModeOn = new System.Windows.Forms.RadioButton(); + this.lblPulsesequence = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.btnDisplayDefault = new System.Windows.Forms.Button(); + this.btnWrite = new System.Windows.Forms.Button(); + this.btnRead = new System.Windows.Forms.Button(); + this.btnLogout = new System.Windows.Forms.Button(); + this.lblPulseWeightMl = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.lblP2000PulseSetup = new System.Windows.Forms.Label(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nudPulseResolution)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nudAdapterPresence)).BeginInit(); + this.SuspendLayout(); + // + // lblState + // + this.lblState.AutoSize = true; + this.lblState.Location = new System.Drawing.Point(12, 51); + this.lblState.Name = "lblState"; + this.lblState.Size = new System.Drawing.Size(78, 13); + this.lblState.TabIndex = 9; + this.lblState.Text = "Not connected"; + // + // btnConnect + // + this.btnConnect.Location = new System.Drawing.Point(212, 8); + this.btnConnect.Name = "btnConnect"; + this.btnConnect.Size = new System.Drawing.Size(85, 30); + this.btnConnect.TabIndex = 8; + this.btnConnect.Text = "Connect"; + this.btnConnect.UseVisualStyleBackColor = true; + this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 21); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(25, 13); + this.label1.TabIndex = 7; + this.label1.Text = "Slot"; + // + // cbComSlot + // + this.cbComSlot.FormattingEnabled = true; + this.cbComSlot.Location = new System.Drawing.Point(83, 12); + this.cbComSlot.Name = "cbComSlot"; + this.cbComSlot.Size = new System.Drawing.Size(104, 21); + this.cbComSlot.TabIndex = 6; + this.cbComSlot.Text = "1"; + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Location = new System.Drawing.Point(6, 92); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(574, 324); + this.tabControl1.TabIndex = 11; + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.lblP2000PulseSetup); + this.tabPage1.Controls.Add(this.label12); + this.tabPage1.Controls.Add(this.lblPulseWeightMl); + this.tabPage1.Controls.Add(this.cbPulseWiegth); + this.tabPage1.Controls.Add(this.panel1); + this.tabPage1.Controls.Add(this.lblPrencesInMin); + this.tabPage1.Controls.Add(this.label13); + this.tabPage1.Controls.Add(this.label14); + this.tabPage1.Controls.Add(this.lblPulseWeightInternal); + this.tabPage1.Controls.Add(this.label11); + this.tabPage1.Controls.Add(this.label10); + this.tabPage1.Controls.Add(this.nudPulseResolution); + this.tabPage1.Controls.Add(this.cbxPulseMode); + this.tabPage1.Controls.Add(this.cbxPulseLength); + this.tabPage1.Controls.Add(this.label8); + this.tabPage1.Controls.Add(this.label9); + this.tabPage1.Controls.Add(this.nudAdapterPresence); + this.tabPage1.Controls.Add(this.rbTestModeOff); + this.tabPage1.Controls.Add(this.rbTestModeOn); + this.tabPage1.Controls.Add(this.lblPulsesequence); + this.tabPage1.Controls.Add(this.label7); + this.tabPage1.Controls.Add(this.label6); + this.tabPage1.Controls.Add(this.label5); + this.tabPage1.Controls.Add(this.label4); + this.tabPage1.Controls.Add(this.label3); + this.tabPage1.Controls.Add(this.label2); + this.tabPage1.Controls.Add(this.btnDisplayDefault); + this.tabPage1.Controls.Add(this.btnWrite); + this.tabPage1.Controls.Add(this.btnRead); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(566, 298); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "Pluse"; + this.tabPage1.UseVisualStyleBackColor = true; + this.tabPage1.Click += new System.EventHandler(this.tabPage1_Click); + // + // cbPulseWiegth + // + this.cbPulseWiegth.FormattingEnabled = true; + this.cbPulseWiegth.Items.AddRange(new object[] { + " 1 l/Imp.", + "10 l/Imp.", + "100 l/Imp.", + "1.000 l/Imp.", + "1 Gallons/Imp.", + "10 Gallons/Imp.", + "100 Gallons/Imp.", + "1.000 Gallons/Imp.", + "1 Cub. Feet/Imp.", + "10 Cub. Feet/Imp.", + "100 Cub. Feet/Imp.", + "1.000 Cub. Feet/Imp.", + "1 Barrel/Imp.", + "10 Barrels/Imp.", + "100 Barrels/Imp.", + "1.000 Barrels/Imp.", + "ohne"}); + this.cbPulseWiegth.Location = new System.Drawing.Point(237, 180); + this.cbPulseWiegth.Name = "cbPulseWiegth"; + this.cbPulseWiegth.Size = new System.Drawing.Size(111, 21); + this.cbPulseWiegth.TabIndex = 37; + this.cbPulseWiegth.SelectedIndexChanged += new System.EventHandler(this.cbPulseWiegth_SelectedIndexChanged); + // + // panel1 + // + this.panel1.Controls.Add(this.rbEvenDistOff); + this.panel1.Controls.Add(this.rbEvenDistOn); + this.panel1.Location = new System.Drawing.Point(237, 74); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(124, 21); + this.panel1.TabIndex = 36; + // + // rbEvenDistOff + // + this.rbEvenDistOff.AutoSize = true; + this.rbEvenDistOff.Location = new System.Drawing.Point(59, 3); + this.rbEvenDistOff.Name = "rbEvenDistOff"; + this.rbEvenDistOff.Size = new System.Drawing.Size(39, 17); + this.rbEvenDistOff.TabIndex = 27; + this.rbEvenDistOff.TabStop = true; + this.rbEvenDistOff.Text = "Off"; + this.rbEvenDistOff.UseVisualStyleBackColor = true; + // + // rbEvenDistOn + // + this.rbEvenDistOn.AutoSize = true; + this.rbEvenDistOn.Location = new System.Drawing.Point(3, 3); + this.rbEvenDistOn.Name = "rbEvenDistOn"; + this.rbEvenDistOn.Size = new System.Drawing.Size(39, 17); + this.rbEvenDistOn.TabIndex = 26; + this.rbEvenDistOn.TabStop = true; + this.rbEvenDistOn.Text = "On"; + this.rbEvenDistOn.UseVisualStyleBackColor = true; + // + // lblPrencesInMin + // + this.lblPrencesInMin.AutoSize = true; + this.lblPrencesInMin.Location = new System.Drawing.Point(401, 34); + this.lblPrencesInMin.Name = "lblPrencesInMin"; + this.lblPrencesInMin.Size = new System.Drawing.Size(13, 13); + this.lblPrencesInMin.TabIndex = 35; + this.lblPrencesInMin.Text = "0"; + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(485, 34); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(54, 13); + this.label13.TabIndex = 34; + this.label13.Text = "in minutes"; + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Location = new System.Drawing.Point(354, 34); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(41, 13); + this.label14.TabIndex = 33; + this.label14.Text = "internal"; + // + // lblPulseWeightInternal + // + this.lblPulseWeightInternal.AutoSize = true; + this.lblPulseWeightInternal.Location = new System.Drawing.Point(467, 206); + this.lblPulseWeightInternal.Name = "lblPulseWeightInternal"; + this.lblPulseWeightInternal.Size = new System.Drawing.Size(13, 13); + this.lblPulseWeightInternal.TabIndex = 32; + this.lblPulseWeightInternal.Text = "0"; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Location = new System.Drawing.Point(467, 183); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(72, 13); + this.label11.TabIndex = 31; + this.label11.Text = "in internal unit"; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(354, 183); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(28, 13); + this.label10.TabIndex = 30; + this.label10.Text = "in ml"; + // + // nudPulseResolution + // + this.nudPulseResolution.Location = new System.Drawing.Point(237, 152); + this.nudPulseResolution.Maximum = new decimal(new int[] { + 7, + 0, + 0, + 0}); + this.nudPulseResolution.Name = "nudPulseResolution"; + this.nudPulseResolution.Size = new System.Drawing.Size(111, 20); + this.nudPulseResolution.TabIndex = 28; + this.nudPulseResolution.Value = new decimal(new int[] { + 7, + 0, + 0, + 0}); + // + // cbxPulseMode + // + this.cbxPulseMode.FormattingEnabled = true; + this.cbxPulseMode.Location = new System.Drawing.Point(237, 127); + this.cbxPulseMode.Name = "cbxPulseMode"; + this.cbxPulseMode.Size = new System.Drawing.Size(111, 21); + this.cbxPulseMode.TabIndex = 27; + // + // cbxPulseLength + // + this.cbxPulseLength.FormattingEnabled = true; + this.cbxPulseLength.Location = new System.Drawing.Point(237, 103); + this.cbxPulseLength.Name = "cbxPulseLength"; + this.cbxPulseLength.Size = new System.Drawing.Size(111, 21); + this.cbxPulseLength.TabIndex = 26; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(6, 178); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(169, 13); + this.label8.TabIndex = 23; + this.label8.Text = "METROLOGYASST_PulseWeight"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(6, 154); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(185, 13); + this.label9.TabIndex = 22; + this.label9.Text = "METROLOGYASST_PulseResolution"; + // + // nudAdapterPresence + // + this.nudAdapterPresence.Location = new System.Drawing.Point(237, 27); + this.nudAdapterPresence.Name = "nudAdapterPresence"; + this.nudAdapterPresence.Size = new System.Drawing.Size(111, 20); + this.nudAdapterPresence.TabIndex = 21; + this.nudAdapterPresence.ValueChanged += new System.EventHandler(this.nudAdapterPresence_ValueChanged); + // + // rbTestModeOff + // + this.rbTestModeOff.AutoSize = true; + this.rbTestModeOff.Location = new System.Drawing.Point(293, 8); + this.rbTestModeOff.Name = "rbTestModeOff"; + this.rbTestModeOff.Size = new System.Drawing.Size(39, 17); + this.rbTestModeOff.TabIndex = 18; + this.rbTestModeOff.TabStop = true; + this.rbTestModeOff.Text = "Off"; + this.rbTestModeOff.UseVisualStyleBackColor = true; + // + // rbTestModeOn + // + this.rbTestModeOn.AutoSize = true; + this.rbTestModeOn.Location = new System.Drawing.Point(237, 8); + this.rbTestModeOn.Name = "rbTestModeOn"; + this.rbTestModeOn.Size = new System.Drawing.Size(39, 17); + this.rbTestModeOn.TabIndex = 17; + this.rbTestModeOn.TabStop = true; + this.rbTestModeOn.Text = "On"; + this.rbTestModeOn.UseVisualStyleBackColor = true; + // + // lblPulsesequence + // + this.lblPulsesequence.AutoSize = true; + this.lblPulsesequence.Location = new System.Drawing.Point(234, 58); + this.lblPulsesequence.Name = "lblPulsesequence"; + this.lblPulsesequence.Size = new System.Drawing.Size(13, 13); + this.lblPulsesequence.TabIndex = 16; + this.lblPulsesequence.Text = "0"; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(5, 10); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(55, 13); + this.label7.TabIndex = 15; + this.label7.Text = "TestMode"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(6, 130); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(162, 13); + this.label6.TabIndex = 14; + this.label6.Text = "METROLOGYASST_PulseMode"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(6, 106); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(168, 13); + this.label5.TabIndex = 13; + this.label5.Text = "METROLOGYASST_PulseLength"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(6, 82); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(212, 13); + this.label4.TabIndex = 12; + this.label4.Text = "METROLOGYASST_PulseEvenDistribution"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(5, 58); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(114, 13); + this.label3.TabIndex = 11; + this.label3.Text = "IRDA_PulseSequence"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(5, 34); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(142, 13); + this.label2.TabIndex = 10; + this.label2.Text = "IRDA_AdapterPresenceLimit"; + // + // btnDisplayDefault + // + this.btnDisplayDefault.Location = new System.Drawing.Point(282, 239); + this.btnDisplayDefault.Name = "btnDisplayDefault"; + this.btnDisplayDefault.Size = new System.Drawing.Size(113, 53); + this.btnDisplayDefault.TabIndex = 8; + this.btnDisplayDefault.Text = "Set DisplayDefault"; + this.btnDisplayDefault.UseVisualStyleBackColor = true; + this.btnDisplayDefault.Click += new System.EventHandler(this.btnDisplayDefault_Click); + // + // btnWrite + // + this.btnWrite.Location = new System.Drawing.Point(147, 239); + this.btnWrite.Name = "btnWrite"; + this.btnWrite.Size = new System.Drawing.Size(129, 53); + this.btnWrite.TabIndex = 1; + this.btnWrite.Text = "Write"; + this.btnWrite.UseVisualStyleBackColor = true; + this.btnWrite.Click += new System.EventHandler(this.btnWrite_Click); + // + // btnRead + // + this.btnRead.Location = new System.Drawing.Point(3, 239); + this.btnRead.Name = "btnRead"; + this.btnRead.Size = new System.Drawing.Size(129, 53); + this.btnRead.TabIndex = 0; + this.btnRead.Text = "Read"; + this.btnRead.UseVisualStyleBackColor = true; + this.btnRead.Click += new System.EventHandler(this.btnRead_Click); + // + // btnLogout + // + this.btnLogout.Location = new System.Drawing.Point(303, 8); + this.btnLogout.Name = "btnLogout"; + this.btnLogout.Size = new System.Drawing.Size(85, 30); + this.btnLogout.TabIndex = 12; + this.btnLogout.Text = "Logout"; + this.btnLogout.UseVisualStyleBackColor = true; + this.btnLogout.Click += new System.EventHandler(this.btnLogout_Click); + // + // lblPulseWeightMl + // + this.lblPulseWeightMl.AutoSize = true; + this.lblPulseWeightMl.Location = new System.Drawing.Point(354, 206); + this.lblPulseWeightMl.Name = "lblPulseWeightMl"; + this.lblPulseWeightMl.Size = new System.Drawing.Size(13, 13); + this.lblPulseWeightMl.TabIndex = 38; + this.lblPulseWeightMl.Text = "0"; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(466, 223); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(94, 13); + this.label12.TabIndex = 39; + this.label12.Text = "p2000 PulseSetup"; + // + // lblP2000PulseSetup + // + this.lblP2000PulseSetup.AutoSize = true; + this.lblP2000PulseSetup.Location = new System.Drawing.Point(467, 249); + this.lblP2000PulseSetup.Name = "lblP2000PulseSetup"; + this.lblP2000PulseSetup.Size = new System.Drawing.Size(13, 13); + this.lblP2000PulseSetup.TabIndex = 40; + this.lblP2000PulseSetup.Text = "0"; + // + // FrmConfigurations + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(587, 450); + this.Controls.Add(this.btnLogout); + this.Controls.Add(this.tabControl1); + this.Controls.Add(this.lblState); + this.Controls.Add(this.btnConnect); + this.Controls.Add(this.label1); + this.Controls.Add(this.cbComSlot); + this.Name = "FrmConfigurations"; + this.Text = "FrmConfigurations"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmConfigurations_FormClosing); + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.tabPage1.PerformLayout(); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nudPulseResolution)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nudAdapterPresence)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblState; + private System.Windows.Forms.Button btnConnect; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cbComSlot; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.Button btnLogout; + private System.Windows.Forms.Button btnWrite; + private System.Windows.Forms.Button btnRead; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button btnDisplayDefault; + private System.Windows.Forms.Label lblPulsesequence; + private System.Windows.Forms.RadioButton rbTestModeOff; + private System.Windows.Forms.RadioButton rbTestModeOn; + private System.Windows.Forms.NumericUpDown nudAdapterPresence; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.NumericUpDown nudPulseResolution; + private System.Windows.Forms.ComboBox cbxPulseMode; + private System.Windows.Forms.ComboBox cbxPulseLength; + private System.Windows.Forms.Label lblPulseWeightInternal; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label lblPrencesInMin; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.RadioButton rbEvenDistOff; + private System.Windows.Forms.RadioButton rbEvenDistOn; + private System.Windows.Forms.ComboBox cbPulseWiegth; + private System.Windows.Forms.Label lblPulseWeightMl; + private System.Windows.Forms.Label lblP2000PulseSetup; + private System.Windows.Forms.Label label12; + } +} \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmConfigurations.cs b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmConfigurations.cs new file mode 100644 index 000000000..69ec86caf --- /dev/null +++ b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmConfigurations.cs @@ -0,0 +1,405 @@ +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 GenesisCordonelInterface.UI.LaatzenAPI_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 InterfaceGCIToLaatzen interfaceToLaatzen = new InterfaceGCIToLaatzen(); + + 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(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; + + } + + + + + + + + } +} + diff --git a/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmRegisterStore.Designer.cs b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmRegisterStore.Designer.cs new file mode 100644 index 000000000..f09b49201 --- /dev/null +++ b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmRegisterStore.Designer.cs @@ -0,0 +1,410 @@ +namespace GenesisCordonelInterface.UI.LaatzenAPI_GenesisToolBox +{ + partial class FrmRegisterStore + { + + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.cbComSlot = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.btnReadRegister = new System.Windows.Forms.Button(); + this.registerGridView = new System.Windows.Forms.DataGridView(); + this.btnConnect = new System.Windows.Forms.Button(); + this.lblState = new System.Windows.Forms.Label(); + this.timProgress = new System.Windows.Forms.Timer(this.components); + this.btnGetPCbID = new System.Windows.Forms.Button(); + this.pnlBussy = new System.Windows.Forms.Panel(); + this.lblProgress = new System.Windows.Forms.Label(); + this.lblAction = new System.Windows.Forms.Label(); + this.probarBusy = new System.Windows.Forms.ProgressBar(); + this.label3 = new System.Windows.Forms.Label(); + this.btnReadFwVersions = new System.Windows.Forms.Button(); + this.btnCalibrationRestore = new System.Windows.Forms.Button(); + this.btnBatteryIdle = new System.Windows.Forms.Button(); + this.btnSetDefaultPulse = new System.Windows.Forms.Button(); + this.btnStoreAll = new System.Windows.Forms.Button(); + this.btnRegisterToFile = new System.Windows.Forms.Button(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.btnBatLife = new System.Windows.Forms.Button(); + this.btnRadioPressure = new System.Windows.Forms.Button(); + this.nundCalResultID = new System.Windows.Forms.NumericUpDown(); + this.lblGtbVersion = new System.Windows.Forms.Label(); + this.lblConfigVersion = new System.Windows.Forms.Label(); + this.btnFileToRegister = new System.Windows.Forms.Button(); + this.cbxUseOfflinePwds = new System.Windows.Forms.CheckBox(); + ((System.ComponentModel.ISupportInitialize)(this.registerGridView)).BeginInit(); + this.pnlBussy.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nundCalResultID)).BeginInit(); + this.SuspendLayout(); + // + // cbComSlot + // + this.cbComSlot.FormattingEnabled = true; + this.cbComSlot.Location = new System.Drawing.Point(44, 91); + this.cbComSlot.Name = "cbComSlot"; + this.cbComSlot.Size = new System.Drawing.Size(58, 21); + this.cbComSlot.TabIndex = 0; + this.cbComSlot.Text = "1"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(10, 94); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(28, 13); + this.label1.TabIndex = 1; + this.label1.Text = "Slot:"; + this.label1.Click += new System.EventHandler(this.label1_Click); + // + // btnRead + // + this.btnReadRegister.Location = new System.Drawing.Point(251, 123); + this.btnReadRegister.Name = "btnReadRegister"; + this.btnReadRegister.Size = new System.Drawing.Size(110, 30); + this.btnReadRegister.TabIndex = 2; + this.btnReadRegister.Text = "Read Meter"; + this.btnReadRegister.UseVisualStyleBackColor = true; + this.btnReadRegister.Click += new System.EventHandler(this.btnRead_Click); + // + // registerGridView + // + this.registerGridView.AllowUserToAddRows = false; + this.registerGridView.AllowUserToDeleteRows = false; + this.registerGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.registerGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.registerGridView.Location = new System.Drawing.Point(8, 171); + this.registerGridView.Name = "registerGridView"; + this.registerGridView.Size = new System.Drawing.Size(778, 370); + this.registerGridView.TabIndex = 3; + this.registerGridView.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.registerGridView_CellClick); + this.registerGridView.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.registerGridView_CellEndEdit); + // + // btnConnect + // + this.btnConnect.Location = new System.Drawing.Point(125, 87); + this.btnConnect.Name = "btnConnect"; + this.btnConnect.Size = new System.Drawing.Size(110, 30); + this.btnConnect.TabIndex = 4; + this.btnConnect.Text = "Connect"; + this.btnConnect.UseVisualStyleBackColor = true; + this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click); + // + // lblState + // + this.lblState.AutoSize = true; + this.lblState.Location = new System.Drawing.Point(12, 132); + this.lblState.Name = "lblState"; + this.lblState.Size = new System.Drawing.Size(78, 13); + this.lblState.TabIndex = 5; + this.lblState.Text = "Not connected"; + this.lblState.Click += new System.EventHandler(this.lblState_Click); + // + // timProgress + // + this.timProgress.Tick += new System.EventHandler(this.TimeProgress_tick); + // + // btnGetPCbID + // + this.btnGetPCbID.Location = new System.Drawing.Point(399, 16); + this.btnGetPCbID.Name = "btnGetPCbID"; + this.btnGetPCbID.Size = new System.Drawing.Size(110, 30); + this.btnGetPCbID.TabIndex = 11; + this.btnGetPCbID.Text = "Get PCB ID"; + this.btnGetPCbID.UseVisualStyleBackColor = true; + this.btnGetPCbID.Click += new System.EventHandler(this.btnGetPCbID_Click); + // + // pnlBussy + // + this.pnlBussy.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlBussy.BackColor = System.Drawing.Color.Transparent; + this.pnlBussy.Controls.Add(this.lblProgress); + this.pnlBussy.Controls.Add(this.lblAction); + this.pnlBussy.Controls.Add(this.probarBusy); + this.pnlBussy.Controls.Add(this.label3); + this.pnlBussy.Location = new System.Drawing.Point(8, 171); + this.pnlBussy.Name = "pnlBussy"; + this.pnlBussy.Size = new System.Drawing.Size(803, 398); + this.pnlBussy.TabIndex = 51; + this.pnlBussy.Visible = false; + // + // lblProgress + // + this.lblProgress.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblProgress.AutoSize = true; + this.lblProgress.Location = new System.Drawing.Point(240, 334); + this.lblProgress.Name = "lblProgress"; + this.lblProgress.Size = new System.Drawing.Size(0, 13); + this.lblProgress.TabIndex = 3; + // + // lblAction + // + this.lblAction.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblAction.AutoSize = true; + this.lblAction.Location = new System.Drawing.Point(240, 312); + this.lblAction.Name = "lblAction"; + this.lblAction.Size = new System.Drawing.Size(0, 13); + this.lblAction.TabIndex = 2; + // + // probarBusy + // + this.probarBusy.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.probarBusy.Location = new System.Drawing.Point(12, 286); + this.probarBusy.Name = "probarBusy"; + this.probarBusy.Size = new System.Drawing.Size(779, 23); + this.probarBusy.TabIndex = 1; + // + // label3 + // + this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(240, 270); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(64, 13); + this.label3.TabIndex = 0; + this.label3.Text = "Please wait!"; + // + // btnReadFwVersions + // + this.btnReadFwVersions.Location = new System.Drawing.Point(399, 51); + this.btnReadFwVersions.Name = "btnReadFwVersions"; + this.btnReadFwVersions.Size = new System.Drawing.Size(110, 30); + this.btnReadFwVersions.TabIndex = 52; + this.btnReadFwVersions.Text = "Read FW Versions"; + this.btnReadFwVersions.UseVisualStyleBackColor = true; + this.btnReadFwVersions.Click += new System.EventHandler(this.btnReadFwVersions_Click); + // + // btnCalibrationRestore + // + this.btnCalibrationRestore.Location = new System.Drawing.Point(560, 14); + this.btnCalibrationRestore.Name = "btnCalibrationRestore"; + this.btnCalibrationRestore.Size = new System.Drawing.Size(110, 30); + this.btnCalibrationRestore.TabIndex = 58; + this.btnCalibrationRestore.Text = "CalibrationRestore"; + this.btnCalibrationRestore.UseVisualStyleBackColor = true; + this.btnCalibrationRestore.Visible = false; + this.btnCalibrationRestore.Click += new System.EventHandler(this.btnCalibrationRestore_Click); + // + // btnBatteryIdle + // + this.btnBatteryIdle.Location = new System.Drawing.Point(399, 87); + this.btnBatteryIdle.Name = "btnBatteryIdle"; + this.btnBatteryIdle.Size = new System.Drawing.Size(110, 30); + this.btnBatteryIdle.TabIndex = 60; + this.btnBatteryIdle.Text = "Battery Idle"; + this.btnBatteryIdle.UseVisualStyleBackColor = true; + this.btnBatteryIdle.Visible = false; + this.btnBatteryIdle.Click += new System.EventHandler(this.btnBatteryIdle_Click); + // + // btnSetDefaultPulse + // + this.btnSetDefaultPulse.Location = new System.Drawing.Point(560, 85); + this.btnSetDefaultPulse.Name = "btnSetDefaultPulse"; + this.btnSetDefaultPulse.Size = new System.Drawing.Size(110, 30); + this.btnSetDefaultPulse.TabIndex = 61; + this.btnSetDefaultPulse.Text = "Set default Pulse"; + this.btnSetDefaultPulse.UseVisualStyleBackColor = true; + this.btnSetDefaultPulse.Click += new System.EventHandler(this.btnSetDefaultPulse_Click); + // + // btnStoreAll + // + this.btnStoreAll.Location = new System.Drawing.Point(251, 16); + this.btnStoreAll.Name = "btnStoreAll"; + this.btnStoreAll.Size = new System.Drawing.Size(110, 28); + this.btnStoreAll.TabIndex = 62; + this.btnStoreAll.Text = "Store All"; + this.btnStoreAll.UseVisualStyleBackColor = true; + this.btnStoreAll.Click += new System.EventHandler(this.btnStoreAll_Click); + // + // btnRegisterToFile + // + this.btnRegisterToFile.Location = new System.Drawing.Point(251, 50); + this.btnRegisterToFile.Name = "btnRegisterToFile"; + this.btnRegisterToFile.Size = new System.Drawing.Size(110, 30); + this.btnRegisterToFile.TabIndex = 63; + this.btnRegisterToFile.Text = "RegisterToFile"; + this.btnRegisterToFile.UseVisualStyleBackColor = true; + this.btnRegisterToFile.Click += new System.EventHandler(this.btnRegisterToFile_Click); + // + // timer1 + // + this.timer1.Interval = 5000; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // btnBatLife + // + this.btnBatLife.Location = new System.Drawing.Point(399, 123); + this.btnBatLife.Name = "btnBatLife"; + this.btnBatLife.Size = new System.Drawing.Size(110, 30); + this.btnBatLife.TabIndex = 71; + this.btnBatLife.Text = "Lifetime"; + this.btnBatLife.UseVisualStyleBackColor = true; + this.btnBatLife.Click += new System.EventHandler(this.btnBatLife_Click); + // + // btnRadioPressure + // + this.btnRadioPressure.Location = new System.Drawing.Point(560, 123); + this.btnRadioPressure.Name = "btnRadioPressure"; + this.btnRadioPressure.Size = new System.Drawing.Size(110, 30); + this.btnRadioPressure.TabIndex = 72; + this.btnRadioPressure.Text = "Activate Radio"; + this.btnRadioPressure.UseVisualStyleBackColor = true; + this.btnRadioPressure.Click += new System.EventHandler(this.btnRadioPressure_Click); + // + // nundCalResultID + // + this.nundCalResultID.Location = new System.Drawing.Point(562, 58); + this.nundCalResultID.Maximum = new decimal(new int[] { + 999999, + 0, + 0, + 0}); + this.nundCalResultID.Name = "nundCalResultID"; + this.nundCalResultID.Size = new System.Drawing.Size(110, 20); + this.nundCalResultID.TabIndex = 73; + this.nundCalResultID.Visible = false; + // + // lblGtbVersion + // + this.lblGtbVersion.AutoSize = true; + this.lblGtbVersion.Location = new System.Drawing.Point(10, 10); + this.lblGtbVersion.Name = "lblGtbVersion"; + this.lblGtbVersion.Size = new System.Drawing.Size(79, 13); + this.lblGtbVersion.TabIndex = 75; + this.lblGtbVersion.Text = "GTB Version: ?"; + // + // lblConfigVersion + // + this.lblConfigVersion.AutoSize = true; + this.lblConfigVersion.Location = new System.Drawing.Point(10, 33); + this.lblConfigVersion.Name = "lblConfigVersion"; + this.lblConfigVersion.Size = new System.Drawing.Size(119, 13); + this.lblConfigVersion.TabIndex = 76; + this.lblConfigVersion.Text = "Configuration Version: ?"; + // + // btnFileToRegister + // + this.btnFileToRegister.Location = new System.Drawing.Point(251, 87); + this.btnFileToRegister.Name = "btnFileToRegister"; + this.btnFileToRegister.Size = new System.Drawing.Size(110, 30); + this.btnFileToRegister.TabIndex = 77; + this.btnFileToRegister.Text = "FileToRegister"; + this.btnFileToRegister.UseVisualStyleBackColor = true; + this.btnFileToRegister.Click += new System.EventHandler(this.btnFileToRegister_Click); + // + // cbxUseOfflinePwds + // + this.cbxUseOfflinePwds.AutoSize = true; + this.cbxUseOfflinePwds.Location = new System.Drawing.Point(12, 59); + this.cbxUseOfflinePwds.Name = "cbxUseOfflinePwds"; + this.cbxUseOfflinePwds.Size = new System.Drawing.Size(132, 17); + this.cbxUseOfflinePwds.TabIndex = 78; + this.cbxUseOfflinePwds.Text = "Use Offline _externPasswords"; + this.cbxUseOfflinePwds.UseVisualStyleBackColor = true; + this.cbxUseOfflinePwds.CheckedChanged += new System.EventHandler(this.cbxUseOfflinePwds_CheckedChanged); + // + // FrmRegisterStore + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(803, 553); + this.Controls.Add(this.cbxUseOfflinePwds); + this.Controls.Add(this.btnFileToRegister); + this.Controls.Add(this.lblConfigVersion); + this.Controls.Add(this.lblGtbVersion); + this.Controls.Add(this.nundCalResultID); + this.Controls.Add(this.btnRadioPressure); + this.Controls.Add(this.btnBatLife); + this.Controls.Add(this.btnRegisterToFile); + this.Controls.Add(this.btnStoreAll); + this.Controls.Add(this.btnSetDefaultPulse); + this.Controls.Add(this.btnBatteryIdle); + this.Controls.Add(this.btnCalibrationRestore); + this.Controls.Add(this.btnReadFwVersions); + this.Controls.Add(this.pnlBussy); + this.Controls.Add(this.btnGetPCbID); + this.Controls.Add(this.lblState); + this.Controls.Add(this.btnConnect); + this.Controls.Add(this.registerGridView); + this.Controls.Add(this.btnReadRegister); + this.Controls.Add(this.label1); + this.Controls.Add(this.cbComSlot); + this.Name = "FrmRegisterStore"; + this.Text = "frmRegisterStore"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmRegisterStore_FormClosing); + this.Load += new System.EventHandler(this.frmRegisterStore_Load); + ((System.ComponentModel.ISupportInitialize)(this.registerGridView)).EndInit(); + this.pnlBussy.ResumeLayout(false); + this.pnlBussy.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nundCalResultID)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ComboBox cbComSlot; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button btnReadRegister; + private System.Windows.Forms.DataGridView registerGridView; + private System.Windows.Forms.Button btnConnect; + private System.Windows.Forms.Label lblState; + private System.Windows.Forms.Timer timProgress; + private System.Windows.Forms.Button btnGetPCbID; + private System.Windows.Forms.Panel pnlBussy; + private System.Windows.Forms.Label lblProgress; + private System.Windows.Forms.Label lblAction; + private System.Windows.Forms.ProgressBar probarBusy; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button btnReadFwVersions; + private System.Windows.Forms.Button btnCalibrationRestore; + private System.Windows.Forms.Button btnBatteryIdle; + private System.Windows.Forms.Button btnSetDefaultPulse; + private System.Windows.Forms.Button btnStoreAll; + private System.Windows.Forms.Button btnRegisterToFile; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.Button btnBatLife; + private System.Windows.Forms.Button btnRadioPressure; + private System.Windows.Forms.NumericUpDown nundCalResultID; + private System.Windows.Forms.Label lblGtbVersion; + private System.Windows.Forms.Label lblConfigVersion; + private System.Windows.Forms.Button btnFileToRegister; + private System.Windows.Forms.CheckBox cbxUseOfflinePwds; + } +} \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmRegisterStore.cs b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmRegisterStore.cs new file mode 100644 index 000000000..76e855ce1 --- /dev/null +++ b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmRegisterStore.cs @@ -0,0 +1,2634 @@ +//...MF using LaaPackages.Features.Cordonel; +using GenesisCordonelInterface.API; +using Logic.ProductionToProductMapper.Cordonel; +using Newtonsoft.Json; +using NLog; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Reflection; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using Xylem.Common.CommonCore.Configuration; +using Xylem.Common.CommonCore.Consts; +using Xylem.Common.Hardware.Interfaces.Ports.PortCore; +using Xylem.Common.Hardware.WaterMeter.Genesis.Applications.Const; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.Consts; +using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; +using Xylem.Common.Hardware.WaterMeter.Genesis.Registers.DataTypes; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; +using Xylem.Common.Logic.ProductionOrderCore.TestResults; +using Xylem.Common.Logic.SoftwareAccessHelper; +using Xylem.Common.Utils.Logging; +using static Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.GenesisMeter; +using Access = Xylem.Common.Hardware.WaterMeter.Genesis.Registers.Access; +using Register = Xylem.Common.Hardware.WaterMeter.Genesis.Registers.Register; + +namespace GenesisCordonelInterface.UI.LaatzenAPI_GenesisToolBox +{ + public partial class FrmRegisterStore : Form + { + private static readonly NLog.ILogger Logger = NLog.LogManager.GetLogger("GenesisCordonelInterface"); + private readonly InterfaceGCIToLaatzen interfaceToLaatzen = new InterfaceGCIToLaatzen(); + + public class regStore + { + public String PcbId; + public DateTimeOffset created; + public List keyValues; + } + + public class regDefValue + { + public RegisterDefinition def; + public String value; + } + + private readonly DataTable _dataTable = new DataTable(); + private GenesisMeter _currentGenesis; + private MeterBatch _meterBatch = new MeterBatch(); + private Color _defaultButtonColor; + private regStore _regsToStore; + private String _currentPcbId = ""; + + private Boolean IsBusy + { + get; + set; + } + + public FrmRegisterStore() + { + InitializeComponent(); + + //_dataTable = new DataTable(); + _dataTable.Columns.Add("Name", typeof(String)); + _dataTable.Columns.Add("Type", typeof(String)); + + _dataTable.Columns.Add("isChecked", typeof(Boolean)); + _dataTable.Columns.Add("RawValue", typeof(String)); + _dataTable.Columns.Add("RawValueFile", typeof(String)); + _dataTable.Columns.Add("Value", typeof(String)); + + _dataTable.Columns.Add("Min", typeof(String)); + _dataTable.Columns.Add("Max", typeof(String)); + _dataTable.Columns.Add("Description", typeof(String)); + + _dataTable.Columns.Add("Version", typeof(String)); + _dataTable.Columns.Add("IsAvailable", typeof(String)); + + _dataTable.Columns.Add("Privilege", typeof(String)); + + _dataTable.Columns.Add("btnHistoryText", typeof(String)); + + loadPreSet(); + } + + private void SetBusy(Boolean val, String action = "") + { + IsBusy = val; + if (IsBusy) + { + Invoke(new Action(() => + { + probarBusy.Value = 0; + pnlBussy.Visible = true; + timProgress.Enabled = true; + lblAction.Text = action; + })); + } + else + { + ProgressTotal = null; + ProgressCurrent = null; + Invoke(new Action(() => + { + pnlBussy.Visible = false; + timProgress.Enabled = false; + lblAction.Text = action; + lblProgress.Text = ""; + })); + } + } + + private void SetProgress(String text, Int32 total = 0, Int32 current = 0) + { + ProgressTotal = total; + ProgressCurrent = current; + Invoke(new Action(() => { lblProgress.Text = $@"{text} ({current}/{total})"; })); + } + + private Int32? ProgressTotal; + private Int32? ProgressCurrent; + + private void TimeProgress_tick(Object sender, EventArgs e) + { + if (IsBusy) + { + if (ProgressTotal.HasValue && ProgressCurrent.HasValue && !ProgressTotal.Value.Equals(0) && + !ProgressCurrent.Value.Equals(0)) + { + try + { + probarBusy.Value = + (Int32)Math.Round((ProgressCurrent.Value / (Double)ProgressTotal.Value) * 100, + 0); + } + catch (Exception) + { + // + } + } + else + { + var current = probarBusy.Value; + if (current + 1 > 100) + { + current = 0; + } + + probarBusy.Value = current + 1; + } + } + } + + private void btnConnect_Click(Object sender, EventArgs e) + { + Connect(); + } + + private void btnRead_Click(Object sender, EventArgs e) + { + SetBusy(true, "Read Registers"); + + var hex = "4F793AF100000002"; + var value = ulong.Parse(hex, NumberStyles.HexNumber); + + Console.WriteLine(value); + + + Task.Factory.StartNew(() => { ReadRegisters(); }).ContinueWith(delegate + { + SetBusy(false); + }); + } + + + private void btnStore_Click(Object sender, EventArgs e) + { + SetBusy(true, "Store to file"); + Task.Factory.StartNew(() => { StoreFile(); }).ContinueWith(delegate + { + SetBusy(false); + }); + } + + private void btnFileToMeter_Click(Object sender, EventArgs e) + { + var openFileDialog = new OpenFileDialog(); + openFileDialog.Filter = @"all JSON files (*.JSON)|*.JSON"; + openFileDialog.Multiselect = false; + + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + SetBusy(true, "writing to meter"); + + var filename = openFileDialog.FileName; + + Task.Factory.StartNew(() => { LoadFile(filename); }).ContinueWith(delegate + { + SetBusy(false); + }); + } + } + + + private void registerGridView_CellEndEdit(Object sender, DataGridViewCellEventArgs e) + { + if (registerGridView.Columns[e.ColumnIndex].Name == "RawValue") + { + SetBusy(true, "writing register to meter"); + + Task.Factory.StartNew(() => { WriteRegister(e); }).ContinueWith(delegate + { + SetBusy(false); + }); + + } + } + + private void WriteRegister(DataGridViewCellEventArgs e) + { + var inputValue = registerGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(); + + var arr = inputValue.Split('-'); + var array = new Byte[arr.Length]; + for (var i = arr.Length - 1; i >= 0; i--) + { + array[i] = Convert.ToByte(arr[i], 16); + } + + var reg = (String)registerGridView.Rows[e.RowIndex].Cells[0].Value; + var meterRegisters = _currentGenesis.GetConfigRegistersDefinitions(); + var regDef = meterRegisters.GetRegisterDefinitionByName(reg); + + if (regDef.DataType != typeof(String) && regDef.DataType != typeof(ByteArray)) + array = array.Reverse().ToArray(); + _currentGenesis.WriteRegister(reg, array, checkRegister: true); + } + + private void frmRegisterStore_Load(Object sender, EventArgs e) + { + _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(); + if (listSlots == null) throw new ArgumentNullException(nameof(listSlots)); + foreach (var item in meterConfigList) + { + cbComSlot.Items.Add(item.Slot); + listSlots.Add(item.Slot); + } + if (cbComSlot.Items.Count >= 1) + { + cbComSlot.SelectedItem = cbComSlot.Items[0]; + } + + var version = Assembly.GetExecutingAssembly().GetName().Version; + lblGtbVersion.Text = $@"GTB Version: {version.Major}.{version.Minor}.{version.Build}"; + DisableAllButtons(); + + btnConnect.Enabled = true; + _defaultButtonColor = btnConnect.BackColor; + } + + private void frmRegisterStore_FormClosing(Object sender, FormClosingEventArgs e) + { + _meterBatch.Dispose(); + } + + private void DisableAllButtons() + { + Invoke(new Action(() => + { + btnConnect.Enabled = false; + btnReadRegister.Enabled = false; + + btnRadioPressure.Enabled = false; + btnSetDefaultPulse.Enabled = false; + btnBatLife.Enabled = false; + btnBatteryIdle.Enabled = false; + btnCalibrationRestore.Enabled = false; + btnStoreAll.Enabled = false; + + btnFileToRegister.Enabled = false; + btnRegisterToFile.Enabled = false; + + btnReadFwVersions.Enabled = false; + + btnReadRegister.BackColor = _defaultButtonColor; + + btnRadioPressure.BackColor = _defaultButtonColor; + btnSetDefaultPulse.BackColor = _defaultButtonColor; + btnBatLife.BackColor = _defaultButtonColor; + btnBatteryIdle.BackColor = _defaultButtonColor; + btnCalibrationRestore.BackColor = _defaultButtonColor; + btnStoreAll.BackColor = _defaultButtonColor; + + btnFileToRegister.BackColor = _defaultButtonColor; + btnRegisterToFile.BackColor = _defaultButtonColor; + + btnReadFwVersions.BackColor = _defaultButtonColor; + + })); + } + + private void EnableAllButtons() + { + Invoke(new Action(() => + { + btnConnect.Enabled = true; + btnReadRegister.Enabled = true; + + btnRadioPressure.Enabled = true; + btnSetDefaultPulse.Enabled = true; + btnBatLife.Enabled = true; + btnBatteryIdle.Enabled = true; + btnCalibrationRestore.Enabled = true; + btnStoreAll.Enabled = true; + + btnFileToRegister.Enabled = true; + btnRegisterToFile.Enabled = true; + + btnReadFwVersions.Enabled = true; + })); + } + + private void Connect() + { + try + { + if (string.IsNullOrEmpty(cbComSlot.SelectedItem.ToString()) || + !int.TryParse(cbComSlot.SelectedItem.ToString(), out var slotNo)) + { + return; + } + + SetBusy(true, "Connect"); + //disable all buttons + DisableAllButtons(); + _currentGenesis?.DisposeMeter(); + //dispose old meter + _meterBatch.RemoveAllMeters(); + _currentGenesis = null; + + //assign new meter and assign meter to FW update file if this exists + _currentGenesis = new GenesisMeter(); + _currentGenesis.UseOfflinePasswords = cbxUseOfflinePwds.Checked; + _currentGenesis.SetupFromConfigFile(slotNo); + _meterBatch.AddMeter(_currentGenesis); + + Task.Factory.StartNew(() => + { + _meterBatch.MetersLogin(); + + if (!_currentGenesis.IsLoggedOn && String.IsNullOrEmpty(_currentGenesis.PcbId)) + { + SetBusy(false); + MessageBox.Show(@"ERROR: Cannot read out PcbId! Access to Cordonel denied!"); + return; + } + + Invoke(new Action(() => + { + if (_currentGenesis.IsLoggedOn) + { + lblState.ForeColor = Color.Green; + lblState.Text = $@"Connected to PCB {_currentGenesis.PcbId}"; + lblConfigVersion.Text = @"Configuration Version: " + + _currentGenesis.InterfaceInfo.InterfaceVersion; + lblConfigVersion.ForeColor = + _currentGenesis.InterfaceSupportsFwVersion ? Color.Green : Color.Red; + if (!_currentGenesis.InterfaceSupportsFwVersion) + { + var text = "CONFIGURATION OUTDATED!\n\n" + + "The loaded \"configuration.json\" " + + $"version: {_currentGenesis.InterfaceInfo.InterfaceVersion}\n" + + $"does NOT support the Cordonel FW version: {_currentGenesis.FwVersion}!"; + MessageBox.Show(text, @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + _dataTable.Rows.Clear(); + + foreach (var item in _currentGenesis.GetRegistersDic()) + { + var row = _dataTable.NewRow(); + row["Name"] = item.Key.GetIdent(); + row["Type"] = item.Key.DataType.Name; + row["isChecked"] = false; + row["Value"] = ""; + row["RawValue"] = item.Value; + row["RawValueFile"] = item.Value; + + row["Min"] = item.Key.Minimum; + row["Max"] = item.Key.Maximum; + row["Description"] = item.Key.RegisterDetail.Description; + var From = item.Key.RegisterDetail.Version.First.HasValue + ? item.Key.RegisterDetail.Version.First.Value.ToString() + : "-"; + + var To = item.Key.RegisterDetail.Version.Last.HasValue + ? item.Key.RegisterDetail.Version.Last.Value.ToString() + : "-"; + + row["Version"] = $"from {From} to {To}"; + row["IsAvailable"] = item.Key.IsAvailable; + row["Privilege"] = item.Key.RegisterDetail.Privilege.Lvl8.ToString(); + row["btnHistoryText"] = "View History"; + + _dataTable.Rows.Add(row); + } + + registerGridView.DataSource = _dataTable.DefaultView; + var column = registerGridView?.Columns["isChecked"]; + if (column != null) + { + column.SortMode = DataGridViewColumnSortMode.Automatic; + registerGridView.Sort(column, ListSortDirection.Descending); + var viewColumn = registerGridView.Columns["RawValueFile"]; + if (viewColumn != null) viewColumn.Visible = false; + + } + + column = registerGridView?.Columns["Name"]; + if (column != null) + { + registerGridView.Sort(column, ListSortDirection.Ascending); + } + + var btnHistory = new DataGridViewButtonColumn(); + btnHistory.Name = "btnHistory"; + + btnHistory.DataPropertyName = "btnHistoryText"; + registerGridView?.Columns.AddRange(btnHistory); + + } + else + { + btnConnect.Enabled = false; + lblState.ForeColor = Color.Red; + lblState.Text = $@"Not Connected to PcbId:{_currentGenesis.PcbId}"; + registerGridView.Visible = false; + } + })); + }).ContinueWith(delegate + { + SetBusy(false); + EnableAllButtons(); + }); + } + catch (Exception ex) + { + SetBusy(false); + MessageBox.Show(ex.Message, @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error); + // Dispose meter + _meterBatch.RemoveAllMeters(); + // If meter is not already assigned to batch as the config reader may fail + _currentGenesis?.DisposeMeter(); + + btnConnect.Enabled = true; + } + } + + private async void __Connect() + { + try + { + if (cbComSlot.SelectedItem == null || + string.IsNullOrEmpty(cbComSlot.SelectedItem.ToString()) || + !int.TryParse(cbComSlot.SelectedItem.ToString(), out var slotNo)) + { + return; + } + + SetBusy(true, "Connect"); + DisableAllButtons(); + _dataTable.Rows.Clear(); + + var result = await Task.Run(() => interfaceToLaatzen.ConnectOneMeter(slotNo)); + + if (result.Success) + { + lblState.ForeColor = Color.Green; + lblState.Text = $@"Connected to PCB {result.PcbId}"; + lblConfigVersion.Text = @"Configuration Version: " + result.InterfaceVersion; + lblConfigVersion.ForeColor = result.InterfaceSupportsFwVersion ? Color.Green : Color.Red; + + if (!result.InterfaceSupportsFwVersion) + { + var text = "CONFIGURATION OUTDATED!\n\n" + + "The loaded \"configuration.json\" " + + $"version: {result.InterfaceVersion}\n" + + $"does NOT support the Cordonel FW version: {result.FwVersion}!"; + + MessageBox.Show(text, @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + foreach (var item in result.Registers) + { + var row = _dataTable.NewRow(); + row["Name"] = item.Name; + row["Type"] = item.Type; + row["isChecked"] = false; + row["Value"] = ""; + row["RawValue"] = item.RawValue; + row["RawValueFile"] = item.RawValue; + row["Min"] = item.Min; + row["Max"] = item.Max; + row["Description"] = item.Description; + row["Version"] = item.Version; + row["IsAvailable"] = item.IsAvailable; + row["Privilege"] = item.Privilege; + row["btnHistoryText"] = "View History"; + + _dataTable.Rows.Add(row); + } + + registerGridView.DataSource = _dataTable.DefaultView; + + var column = registerGridView?.Columns["isChecked"]; + if (column != null) + { + column.SortMode = DataGridViewColumnSortMode.Automatic; + registerGridView.Sort(column, ListSortDirection.Descending); + + var viewColumn = registerGridView.Columns["RawValueFile"]; + if (viewColumn != null) + viewColumn.Visible = false; + } + + column = registerGridView?.Columns["Name"]; + if (column != null) + { + registerGridView.Sort(column, ListSortDirection.Ascending); + } + + if (registerGridView.Columns["btnHistory"] == null) + { + var btnHistory = new DataGridViewButtonColumn + { + Name = "btnHistory", + DataPropertyName = "btnHistoryText" + }; + + registerGridView.Columns.Add(btnHistory); + } + + registerGridView.Visible = true; + btnConnect.Enabled = true; + } + else + { + btnConnect.Enabled = false; + lblState.ForeColor = Color.Red; + lblState.Text = $@"Not Connected to PcbId:{result.PcbId}"; + registerGridView.Visible = false; + + MessageBox.Show(result.ErrorMessage ?? "Connect failed.", @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error); + btnConnect.Enabled = true; + } + finally + { + SetBusy(false); + EnableAllButtons(); + } + } + + private void GetPcbId(Int32 slotNR) + { + try + { + _meterBatch.RemoveAllMeters(); + _currentGenesis = new GenesisMeter(); + try + { + _currentGenesis.SetupFromConfigFile(slotNR); + _meterBatch.AddMeter(_currentGenesis); + } + catch (Exception ex) + { + Logger.Error(ex, $"Slot #{slotNR} failed: {ex.Message}"); + } + + _currentPcbId = _currentGenesis.GetPcbId(); + + } + catch (Exception ex) + { + Logger.Error(ex, ex.Message); + } + + _currentGenesis.Dispose(); + _currentGenesis = null; + } + + private void SelectPreset(String content) + { + foreach (var rowItem in _dataTable.Rows) + { + if (rowItem is DataRow) + { + ((DataRow)rowItem)["isChecked"] = false; + } + } + + + switch (content) + { + case "All": + foreach (var rowItem in _dataTable.Rows) + { + if (rowItem is DataRow) + { + ((DataRow)rowItem)["isChecked"] = true; + } + } + + break; + case "Ampl. Test": + foreach (var rowItem in _dataTable.Rows) + { + if (rowItem is DataRow) + { + if (preSetAmplTest.Any(p => p.Equals(((DataRow)rowItem)["Name"].ToString()))) + { + ((DataRow)rowItem)["isChecked"] = true; + } + else + { + ((DataRow)rowItem)["isChecked"] = false; + } + + } + } + + break; + case "Temp. Calibration": + foreach (var rowItem in _dataTable.Rows) + { + if (rowItem is DataRow) + { + if (preSetTempCal.Any(p => p.Equals(((DataRow)rowItem)["Name"].ToString()))) + { + ((DataRow)rowItem)["isChecked"] = true; + } + else + { + ((DataRow)rowItem)["isChecked"] = false; + } + + } + } + + break; + case "Zero Flow": + foreach (var rowItem in _dataTable.Rows) + { + if (rowItem is DataRow) + { + if (preSetZeroFlow.Any(p => p.Equals(((DataRow)rowItem)["Name"].ToString()))) + { + ((DataRow)rowItem)["isChecked"] = true; + } + else + { + ((DataRow)rowItem)["isChecked"] = false; + } + + } + } + + break; + case "Flow Calibration": + foreach (var rowItem in _dataTable.Rows) + { + if (rowItem is DataRow) + { + if (preSetFlowCalibration.Any(p => p.Equals(((DataRow)rowItem)["Name"].ToString()))) + { + ((DataRow)rowItem)["isChecked"] = true; + } + else + { + ((DataRow)rowItem)["isChecked"] = false; + } + } + } + + break; + case "All Meteorological": + foreach (var rowItem in _dataTable.Rows) + { + if (rowItem is DataRow) + { + if (preSetAllMeteorological.Any(p => p.Equals(((DataRow)rowItem)["Name"].ToString()))) + { + ((DataRow)rowItem)["isChecked"] = true; + } + else + { + ((DataRow)rowItem)["isChecked"] = false; + } + } + } + + break; + case "Own": + case "None": + foreach (var rowItem in _dataTable.Rows) + { + if (rowItem is DataRow) + { + ((DataRow)rowItem)["isChecked"] = false; + } + } + + break; + } + + + + } + public class RegisterRestoreData + { + public Int32 PcbID { get; set; } + public DateTime BuildTime { get; set; } + public Dictionary RegisterList { get; set; } + + } + + private RegisterRestoreData ReadRegisters() + { + + if (_currentGenesis != null) + { + _regsToStore = new regStore + { + PcbId = _currentGenesis.PcbId, + created = DateTimeOffset.Now, + keyValues = new List() + }; + + var ret = new RegisterRestoreData + { + PcbID = int.Parse(_currentGenesis.PcbId), + BuildTime = DateTime.Now, + RegisterList = new Dictionary() + }; + + var total = 0; + foreach (var rowItem in _dataTable.Rows) + { + if (rowItem is DataRow) + { + if ((Boolean)((DataRow)rowItem)["isChecked"]) + { + total += 1; + } + } + } + + var done = 0; + foreach (var rowItem in _dataTable.Rows) + { + if (rowItem is DataRow) + { + if ((Boolean)((DataRow)rowItem)["isChecked"]) + { + + var reg = ((DataRow)rowItem)["Name"].ToString(); + + var meterRegisters = _currentGenesis.GetConfigRegistersDefinitions(); + var regDef = meterRegisters.GetRegisterDefinitionByName(reg); + SetProgress($"Read Register {regDef.RegisterName}", total, done + 1); + if (regDef.RegisterDetail != null && ( + regDef.RegisterDetail.Privilege.Lvl8 == Access.RO || + regDef.RegisterDetail.Privilege.Lvl8 == Access.RW)) + { + try + { + var rawRegister = _currentGenesis.ReadRegister(reg); + ret.RegisterList[reg] = rawRegister; + + //var temp = RegisterConverter.GetRegisterContent(regDef, rawRegister); + ((DataRow)rowItem)["RawValue"] = RegisterConverter.GetRegisterRawText(regDef, rawRegister); + _regsToStore.keyValues.Add(new regDefValue + { + def = regDef, + value = BitConverter.ToString(rawRegister) + }); + + try + { + var result = RegisterConverter.ConvertToText(rawRegister, regDef.DataType); + ((DataRow)rowItem)["Value"] = result; + } + catch (Exception) + { + ((DataRow)rowItem)["Value"] = "not converted"; + } + } + catch (Exception) + { + ((DataRow)rowItem)["Value"] = "error"; + } + } + else + { + ((DataRow)rowItem)["RawValue"] = "No Access"; + ((DataRow)rowItem)["Value"] = ""; + } + + done += 1; + } + } + } + + return ret; + } + + return null; + } + + private void CompareFile(String filename) + { + + var styleDiff = new DataGridViewCellStyle + { + BackColor = Color.Red, + ForeColor = Color.Black + }; + + var styleEqual = new DataGridViewCellStyle + { + BackColor = Color.Green, + ForeColor = Color.Black + }; + + SetProgress($"Read File {filename}"); + var text = File.ReadAllText(filename); + var loadedRegStore = JsonConvert.DeserializeObject(text); + + var done = 1; + + foreach (var rowItem in _dataTable.Rows) + { + if (rowItem is DataRow) + { + + SetProgress("Read file", loadedRegStore.keyValues.Count, done); + + var reg = ((DataRow)rowItem)["Name"].ToString(); + var meterRegisters = _currentGenesis.GetConfigRegistersDefinitions(); + var regDef = meterRegisters.GetRegisterDefinitionByName(reg); + + var keyValue = + loadedRegStore.keyValues.FirstOrDefault(f => f.def.RegisterName.Equals(regDef.RegisterName)); + if (keyValue != null) + { + ((DataRow)rowItem)["RawValueFile"] = keyValue.value; + + if (regDef.RegisterDetail.Privilege.Lvl8 == Access.RO || + regDef.RegisterDetail.Privilege.Lvl8 == Access.RW) + { + var rawRegister = _currentGenesis.ReadRegister(reg); + + //var temp = RegisterConverter.GetRegisterContent(regDef, rawRegister); + ((DataRow)rowItem)["RawValue"] = RegisterConverter.GetRegisterRawText(regDef, rawRegister); + _regsToStore.keyValues.Add(new regDefValue + { + def = regDef, + value = BitConverter.ToString(rawRegister) + }); + + try + { + var result = RegisterConverter.ConvertToText(rawRegister, regDef.DataType); + ((DataRow)rowItem)["Value"] = result; + } + catch (Exception) + { + ((DataRow)rowItem)["Value"] = "not converted"; + } + + + DataGridViewCell meterCell = null; + DataGridViewCell fileCell = null; + foreach (DataGridViewRow row in registerGridView.Rows) + { + if (row.Cells["Name"].Value.Equals(regDef.RegisterName)) + { + meterCell = row.Cells["RawValue"]; + fileCell = row.Cells["RawValueFile"]; + break; + } + } + + if (meterCell != null && fileCell != null) + { + if (BitConverter.ToString(rawRegister).Equals(keyValue.value)) + { + + meterCell.Style = styleEqual; + fileCell.Style = styleEqual; + } + else + { + meterCell.Style = styleDiff; + fileCell.Style = styleDiff; + } + } + } + else + { + ((DataRow)rowItem)["RawValue"] = "No Access"; + ((DataRow)rowItem)["Value"] = ""; + } + + done += 1; + } + else + { + ((DataRow)rowItem)["RawValueFile"] = "Not in File"; + } + } + } + } + + private void ShowFile(String filename) + { + SetProgress($"Read File {filename}"); + var text = File.ReadAllText(filename); + var loadedRegStore = JsonConvert.DeserializeObject(text); + + var done = 1; + + foreach (var rowItem in _dataTable.Rows) + { + if (rowItem is DataRow) + { + + SetProgress("Compare file", loadedRegStore.keyValues.Count, done); + var regDef = (RegisterDefinition)((DataRow)rowItem)["regDef"]; + var keyValue = + loadedRegStore.keyValues.FirstOrDefault(f => f.def.RegisterName.Equals(regDef.RegisterName)); + if (keyValue != null) + { + ((DataRow)rowItem)["RawValueFile"] = keyValue.value; + + } + else + { + ((DataRow)rowItem)["RawValueFile"] = "Not in File"; + } + + done += 1; + } + } + } + + private void LoadFile(String filename) + { + //SetProgreess($"Read File {filename}"); + //var text = File.ReadAllText(filename); + //var loadedRegStore = Newtonsoft.Json.JsonConvert.DeserializeObject(text); + //if (loadedRegStore.PcbId != _currentPcbId) + //{ + // MessageBox.Show($"Please connect to PCB {loadedRegStore.PcbId}"); + // return; + //} + + //var done = 1; + //foreach (var keyValueToWrite in loadedRegStore.keyValues) + //{ + // SetProgreess($"Write Register {keyValueToWrite.def.Name}", loadedRegStore.keyValues.Count, done); + // var valueToWrite = keyValueToWrite.value.Split('-').Select(b => Convert.ToByte(b, 16)); + // valueToWrite.Reverse(); + // _currentGenesis.WriteRegister(keyValueToWrite.def, valueToWrite.ToArray()); + + // done = done + 1; + //} + + //read(); + } + + private void StoreFile() + { + //read(); + //var text = Newtonsoft.Json.JsonConvert.SerializeObject(regsToStore); + //SaveFileDialog saveFileDialog = new SaveFileDialog(); + //saveFileDialog.FileName = $"storePcbId{regsToStore.PcbId}on{regsToStore.created.ToString("yyyyMMdd")}.json"; + + //Invoke(new Action(() => + //{ + + // if (saveFileDialog.ShowDialog() == DialogResult.OK) + // File.WriteAllText(saveFileDialog.FileName, text); + + //})); + + //var done = 1; + //foreach (var keyValueToWrite in regsToStore.keyValues) + //{ + // SetProgreess($"Write Register {keyValueToWrite.def.Name}", regsToStore.keyValues.Count, done); + // var valueToWrite = keyValueToWrite.value.Split('-').Select(b => Convert.ToByte(b, 16)); + // valueToWrite.Reverse(); + // _currentGenesis.WriteRegister(keyValueToWrite.def, valueToWrite.ToArray()); + + // done = done + 1; + //} + + } + + private void StoreAsCsv() + { + ReadRegisters(); + + var csv = new StringBuilder(); + var saveFileDialog = new SaveFileDialog(); + saveFileDialog.FileName = $"storePcbId{_regsToStore.PcbId}on{_regsToStore.created.ToString("yyyyMMdd")}.csv"; + + csv.AppendLine("name;value"); + foreach (var values in _regsToStore.keyValues) + { + csv.AppendLine($"{values.def.RegisterName};{values.value}"); + } + + Invoke(new Action(() => + { + + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + File.WriteAllText(saveFileDialog.FileName, csv.ToString()); + } + })); + } + + private List preSetAmplTest = new List(); + private List preSetTempCal = new List(); + private List preSetZeroFlow = new List(); + private List preSetFlowCalibration = new List(); + private List preSetAllMeteorological = new List(); + private List preSetDefault = new List(); + private void loadPreSet() + { + #region defaults + preSetDefault.Add(Register.Genesisflow.SampleRate); + preSetDefault.Add(Register.Genesisflow.LedMode); + preSetDefault.Add(Register.Genesisflow.MeterSize); + #endregion + + #region preSetAmplTest + + preSetAmplTest.Add(Register.Genesisflow.FirstHitUpdatePeriod); + preSetAmplTest.Add(Register.Genesisflow.FirstHitShift); + preSetAmplTest.Add(Register.Genesisflow.FirstHitPercent1); + preSetAmplTest.Add(Register.Genesisflow.FirstHitPercent2); + preSetAmplTest.Add(Register.Genesisflow.FirstHitPercent3); + + #endregion + + #region preSetTempCal + + preSetTempCal.Add(Register.Genesisflow.ToFTempCalibrate); + preSetTempCal.Add(Register.Genesisflow.ToFTempOffset1); + preSetTempCal.Add(Register.Genesisflow.ToFTempOffset2); + preSetTempCal.Add(Register.Genesisflow.ToFTempOffset3); + + #endregion + + #region preSetZeroFlow + + preSetZeroFlow.Add(Register.Genesisflow.ZeroOffset1); + preSetZeroFlow.Add(Register.Genesisflow.ZeroOffset2); + preSetZeroFlow.Add(Register.Genesisflow.ZeroOffset3); + + #endregion + + #region preSetAllMeteorological + + preSetFlowCalibration.Add(Register.Genesisflow.CalFactor1); + preSetFlowCalibration.Add(Register.Genesisflow.CalFactor2); + preSetFlowCalibration.Add(Register.Genesisflow.CalFactor3); + + #endregion + + #region preset All metro + + preSetAllMeteorological.AddRange(preSetAmplTest); + preSetAllMeteorological.AddRange(preSetTempCal); + preSetAllMeteorological.AddRange(preSetZeroFlow); + preSetAllMeteorological.AddRange(preSetFlowCalibration); + + #endregion + + #region addDefaults + + preSetAllMeteorological.AddRange(preSetDefault); + preSetZeroFlow.AddRange(preSetDefault); + preSetFlowCalibration.AddRange(preSetDefault); + preSetTempCal.AddRange(preSetDefault); + preSetAmplTest.AddRange(preSetDefault); + + #endregion + } + + private void btnGetPCbID_Click(Object sender, EventArgs e) + { + Logger.Trace("UI-CLICK: FrmRegisterStore: btnGetPCbID_Click() use APILaatzen"); + + if (cbComSlot.SelectedItem != null) // && cbComSlot.SelectedValue is ListBoxItem) + { + _currentPcbId = ""; + if (!string.IsNullOrEmpty(cbComSlot.SelectedItem.ToString()) && + int.TryParse(cbComSlot.SelectedItem.ToString(), out var slotNR)) + { + + SetBusy(true, "GetPcbId"); + + // as new meter object will be generated the data grid shows outdated data + _dataTable.Rows.Clear(); + DisableAllButtons(); + + Task.Factory.StartNew(() => { GetPcbId(slotNR); }).ContinueWith(delegate + { + Invoke(new Action(() => + { + SetBusy(false); + btnConnect.Enabled = true; + MessageBox.Show(_currentPcbId); + })); + }); + + } + } + } + + private async void __btnGetPCbID_Click(object sender, EventArgs e) + { + Logger.Trace("UI-CLICK: FrmRegisterStore: btnGetPCbID_Click() use API2"); + + if (cbComSlot.SelectedItem == null) + return; + + if (!int.TryParse(cbComSlot.SelectedItem.ToString(), out var slotNr)) + return; + + try + { + _currentPcbId = ""; + + SetBusy(true, "GetPcbId"); + + // as new meter object will be generated the data grid shows outdated data + _dataTable.Rows.Clear(); + DisableAllButtons(); + + _currentPcbId = await Task.Run(() => interfaceToLaatzen.GetPcbId(slotNr)); + + btnConnect.Enabled = true; + + Logger.Info("COM: Request detection SUCCESS for slot " + slotNr); + + MessageBox.Show(_currentPcbId); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); + + Logger.Error("COM: Request detection FAILED for slot " + slotNr); + } + finally + { + SetBusy(false); + } + } + + private void btnReadFwVersions_Click(Object sender, EventArgs e) + { + if (_currentGenesis != null) + { + var sb = new StringBuilder(); + sb.AppendLine($"PCBID: {_currentGenesis.PcbId}"); + sb.AppendLine($"Date: {DateTimeOffset.UtcNow}"); + sb.AppendLine($"System Core Revision: {_currentGenesis.StrCoreRevision}"); + foreach (var fm in _currentGenesis.MeterAppListVersion.OrderBy(o => o.AppId)) + { + var versionString = fm.IsInstalled + ? $"V: {fm.StrVersion} - CRC: 0x{fm.Crc:X4}" : "Not installed"; + if (fm.Status == MeterAppState.Unknown) + versionString = "Communication error"; + + sb.AppendLine($"AppId: 0x{fm.AppId:X2} - {versionString} - AppName: {fm.AppName}"); + } + + MessageBox.Show(sb.ToString()); + } + } + + private void btnProgram_Click(Object sender, EventArgs e) + { + if (_currentGenesis != null) + { + var fa = new List(); + fa.AddRange((new Byte[] { 0x0E, 0x9F, 0xAC, 0xC6 })); + fa.AddRange((new Byte[] { 0xA0, 0xE1, 0xEF, 0x1C })); + fa.AddRange((new Byte[] { 0x3B, 0x27, 0xA4, 0x9B })); + fa.AddRange((new Byte[] { 0xAC, 0x21, 0x65, 0x35 })); + _currentGenesis.ReLogin(); + _currentGenesis.WriteRegister("SENSUSRADIO_EncryptionKey", fa.ToArray()); + //var before = _currentGenesis.ReadRegister("SYSTEM_CalendarSeconds"); + + //var tsa = DateTimeOffset.UtcNow - new DateTimeOffset(2000, 1, 1, 0, 0, 0, new TimeSpan(0)); + //_currentGenesis.WriteRegister("SYSTEM_CalendarSeconds", Convert.ToInt32(tsa.TotalSeconds)); + + //var after = _currentGenesis.ReadRegister("SYSTEM_CalendarSeconds"); + + + + + //#region fixparameter + + //register final programming + + //var overAllResult = new List>(); + ////611.219.280 + //// + //var ts = DateTimeOffset.UtcNow - new DateTimeOffset(2000, 1, 1, 0, 0, 0, new TimeSpan(0)); + + + + + ////Alarms + //////_currentGenesis.WriteRegister("SENSUSRADIO_MainAlarmMask? + //////_currentGenesis.WriteRegister("SENSUSRADIO_ExtendedAlarmMask ? + ////CUSTOMER_AlarmBroadcastMask? + ////CUSTOMER_AlarmEnableMask ? + ////CUSTOMER_AlarmVisualAutoClearMask? + ////CUSTOMER_AlarmVisualMask ? + //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_SealDisplay", + // (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); + + //overAllResult.Add(_currentGenesis_WriteRegister("SYSTEM_CalendarSeconds", + // Convert.ToInt32(ts.TotalSeconds), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_ExcessFlowTimeThreshold", + // (new Byte[] { 0x00, 0x00, 0x00, 0x05 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_ExcessFlowVolumeThreshold", + // (new Byte[] { 0x00, 0x00, 0x61, 0xA8 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_LeakFlowThreshold", + // (new Byte[] { 0x00, 0x00, 0x01, 0x77 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_LeakTimeThreshold", + // (new Byte[] { 0x00, 0x00, 0x4E, 0xC0 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_Locale", + // (new Byte[] { 0x00, 0x00, 0x01, 0x60 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_PressureHighDelay", + // (new Byte[] { 0x00, 0x00, 0x02, 0x58 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_PressureHighThreshold", + // (new Byte[] { 0x00, 0x0B, 0x71, 0xB0 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_PressureLowDelay", + // (new Byte[] { 0x00, 0x00, 0x02, 0x58 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_PressureLowThreshold", + // (new Byte[] { 0x00, 0x00, 0x75, 0x30 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_ReverseFlowTimeThreshold", + // (new Byte[] { 0x00, 0x00, 0x00, 0x78 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_TemperatureHighDelay", + // (new Byte[] { 0x00, 0x00, 0x01, 0x2C }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_TemperatureHighThreshold", + // (new Byte[] { 0x00, 0x00, 0x01, 0xF4 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_TemperatureLowDelay", + // (new Byte[] { 0x00, 0x00, 0x01, 0x2C }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("CUSTOMER_TemperatureLowThreshold", + // (new Byte[] { 0x00, 0x00, 0x00, 0x14 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_ArrowThreshold", + // (new Byte[] { 0x00, 0x1E, 0x84, 0x80 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_DisplayPow10", + // (new Byte[] { 0x00, 0x00, 0x00, 0xFD }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_DisplayUnits", + // (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_ForwardArrow", + // (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_HardErrorLimit", + // (new Byte[] { 0x00, 0x00, 0x00, 0x04 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_LedMode", + // (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); + ////overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_LowFlowMaxPeriod", (new Byte[] { 0x00, 0x00, 0x00, 0x3C }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_LowFlowMaxPeriod", 60 << 16, true, true)); + + //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_LowFlowThreshold", + // (new Byte[] { 0x00, 0x00, 0x00, 0xC8 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_MeterSize", + // (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_PipeFillingDelay", + // (new Byte[] { 0x00, 0x00, 0x00, 0x1E }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_ResetAccumulators", + // (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, false)); + //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_SampleRate", + // (new Byte[] { 0x00, 0x00, 0x00, 0x02 }).Reverse().ToArray(), true, true)); + + //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_UpdateThreshold", + // (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("IRDA_AdapterPresenceLimit", + // (new Byte[] { 0x00, 0x00, 0x00, 0x60 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("IRDA_PulseReportRate", + // (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_FlowPoint", + // (new Byte[] { 0x00, 0x00, 0x00, 0x02 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_FlowUnits", + // (new Byte[] { 0x00, 0x00, 0x00, 0x04 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_PressureOffset", + // (new Byte[] { 0x00, 0x00, 0x03, 0xF5 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_PressurePresent", + // (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_PressureRate", + // (new Byte[] { 0x00, 0x0D, 0xBB, 0xA0 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_PressureUnits", + // (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_PulseLength", + // (new Byte[] { 0x00, 0x00, 0x00, 0x07 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_PulseMode", + // (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_PulseWeight", + // (new Byte[] { 0x00, 0x00, 0x27, 0x10 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("METROLOGYASST_TemperatureUnits", + // (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_AverageFlowPeriod", + // (new Byte[] { 0x00, 0x00, 0x00, 0x05 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_DataLogContents", + // (new Byte[] { 0x08, 0x00, 0x24, 0x03 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_DataLogPeriod", + // (new Byte[] { 0x00, 0x00, 0x00, 0x3C }).Reverse().ToArray(), true, false)); + //overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_FixedDateDayOfMonth", + // (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_FixedDateReadingContents", + // (new Byte[] { 0x08, 0x00, 0x24, 0x03 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_PeriodicLogLifeTimeCounter", + // (new Byte[] { 0x00, 0x00, 0x00, 0x0 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("PERIODICLOG_ResetCounter", + // (new Byte[] { 0x00, 0x00, 0x00, 0x0 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("POWERMON_BatterySelection", + // (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, false)); + //overAllResult.Add(_currentGenesis_WriteRegister("POWERMON_WarnFromClamp", + // (new Byte[] { 0x00, 0x01, 0x51, 0x80 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_WakeupInterval", + // (new Byte[] { 0x00, 0x00, 0x00, 0x03 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_MbusState", + // (new Byte[] { 0x00, 0x00, 0x00, 0x07 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_UtcTimeOffset", + // (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); + + //// just read later //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_FrequencyIndicator}).Reverse(), true, true); + + //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_HistoricalAlarmsDays", + // (new Byte[] { 0x00, 0x00, 0x00, 0x1D }).Reverse().ToArray(), true, true)); + + + ////Original + ////0x11, 0x12, 0x13, 0x14, 0x21, 0x22, 0x23, 0x24, 0x31, 0x32, 0x33, 0x34, 0x41, 0x42, 0x43, 0x44 + ////Write to register + ////0x14, 0x13, 0x12, 0x11, 0x24, 0x23, 0x22, 0x21, 0x34, 0x33, 0x32, 0x31, 0x44, 0x43, 0x42, 0x41 + + + ////good one + ////E6-C8-88-00-DE-B8-68-C0-D6-A8-48-80-CE-98-28-40 + ////0E-05-04-04-00-14-30-68-D0-14-0E-80-40-63-93-73-22 + + ////&bad one + ////0E-05-04-05-00-00-88-C8-E6-C0-68-B8-DE-80-48-A8-D6-40-28-98-CE + + + ////0E-05-04-04-00-22-73-93-63-40-80-0E-14-D0-68-30-14 + + //var funkadresse = new List(); + //funkadresse.AddRange((new Byte[] { 0xE6, 0xC8, 0x88, 0x00 }).ToArray()); + //funkadresse.AddRange((new Byte[] { 0xDE, 0xB8, 0x68, 0xC0 }).ToArray()); + //funkadresse.AddRange((new Byte[] { 0xD6, 0xA8, 0x48, 0x80 }).ToArray()); + //funkadresse.AddRange((new Byte[] { 0xCE, 0x98, 0x28, 0x40 }).ToArray()); + //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_EncryptionKey", funkadresse.ToArray(), + // true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_EncryptionKey", + // (new Byte[] + // { + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + // }).ToArray(), true, true)); + ////overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_Authentification", (new Byte[] { 0x14, 0x30, 0x68, 0xD0, 0x14, 0x0E, 0x80, 0x40, 0x63, 0x93, 0x73, 0x22 }).ToArray(), true, true)); + ////overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_Authentification", (new Byte[] + ////{ + //// 0xD0,0x68 , 0x30 ,0x14, + //// 0x40,0x80, 0x0E ,0x14, + //// 0x22, 0x73, 0x93,0x63 + ////}).ToArray(), true, true)); + //////E6C88800DEB868C0D6A84880CE982840 + + //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_CustomerText", + // (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); + + //using (var dataacces = + // new SqlDataAccess( + // "Data Source=SLASQL01;;Initial Catalog=Auftrag;Persist Security Info=False;User ID=GenesisPasswordService;Password=PcbID;") + //) + //{ + + // var sb = new StringBuilder(); + // sb.AppendLine( + // $" SELECT distinct [MapPcbIdToSerialNumber_SerialNumber],Adresse,FunkschluesselIndex,SENSUSRADIO_PowerLevel, SENSUSRADIO_PowerLevelOption, SENSUSRADIO_ImpedanceCodeNew,SENSUSRADIO_ImpedanceCodeOption "); + // sb.AppendLine($" FROM [Auftrag].[dbo].[MapPcbIdToSerialNumber] pcb "); + // sb.AppendLine( + // $" inner join tmpRadioConfig radio on radio.pcbID = pcb.MapPcbIdToSerialNumber_PcbId"); + // sb.AppendLine( + // $" inner join Genesis_Meter meter on meter.Seriennummer = pcb.MapPcbIdToSerialNumber_SerialNumber"); + // sb.AppendLine($" where [MapPcbIdToSerialNumber_PcbId] = '{_currentGenesis.GetPcbId()}'"); + + // var MapData = dataacces.ExecuteQuery(sb.ToString()); + // if (MapData.Rows.Count != 1) + // { + // MessageBox.Show("Faild to get order data"); + // return; + // } + + // var SENSUSRADIO_RadioAddress = Convert.ToUInt32((Int64)MapData.Rows[0]["Adresse"] - 10000000000); + // var SENSUSRADIO_PowerLevel = Convert.ToUInt32(MapData.Rows[0]["SENSUSRADIO_PowerLevel"]); + // var SENSUSRADIO_PowerLevelOption = + // Convert.ToUInt32(MapData.Rows[0]["SENSUSRADIO_PowerLevelOption"]); + // var SENSUSRADIO_ImpedanceCodeNew = + // Convert.ToUInt32(MapData.Rows[0]["SENSUSRADIO_ImpedanceCodeNew"]); + // var SENSUSRADIO_ImpedanceCodeOption = + // Convert.ToUInt32(MapData.Rows[0]["SENSUSRADIO_ImpedanceCodeOption"]); + + + // overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_RadioAddress", + // SENSUSRADIO_RadioAddress, true, true)); + // overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_PowerLevel", SENSUSRADIO_PowerLevel, + // true, true)); + // overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_PowerLevelOption", + // SENSUSRADIO_PowerLevelOption, true, true)); + // overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_ImpedanceCodeNew", + // SENSUSRADIO_ImpedanceCodeNew, true, true)); + // overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_ImpedanceCodeOption", + // SENSUSRADIO_ImpedanceCodeOption, true, true)); + + + //} + + ////MapData.Rows[0]["Adresse"] + + + //overAllResult.Add(_currentGenesis_WriteRegister("GENESISFLOW_SealDisplay", + // (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, true)); + + ////radio end state! + //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_SystemState", + // (new Byte[] { 0x00, 0x00, 0x00, 0xFF }).Reverse().ToArray(), true, false)); + + //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_SystemState", + // (new Byte[] { 0x00, 0x00, 0x00, 0x02 }).Reverse().ToArray(), true, true)); + + //var sbR = new StringBuilder(); + //if (overAllResult.Any(a => a.Item2 == false)) + //{ + + // foreach (var failedIndex in overAllResult) + // { + // if (!failedIndex.Item2) + // { + // sbR.AppendLine($"Register={failedIndex.Item1} failed"); + // } + + // } + //} + //else + //{ + // sbR.AppendLine($"done without errors"); + //} + + //_currentGenesis.Logout(); + //MessageBox.Show("Result:" + sbR.ToString()); + + //#endregion + + ////radio + ////storeconfig _all + ////log out + ////using (var dataacces = new SqlDataAccess(GlobalConfig.connectionString.Value)) + ////{ + + //var resultDic = new Dictionary(); + + // resultDic.Add("SENSUSRADIO_RadioAddress", ra); + + // //10412000966 + + //resultDic.Add("SENSUSRADIO_EncryptionKey", new Byte[] {0x40, 0x28, 0x98, 0xCE, 0x00}); + + //} + + + ////radio + + // //[Adresse] + + + + // var listToCheckProgramm = new Dictionary(); + + //listToCheckProgramm.Add("", new byte[]{ 0x00, 0x00, 0x00, 0x00}); + + //listToCheckProgramm.Add("", new byte[] { 0x00, 0x00, 0x00, 0x00 }); + + //listToCheckProgramm.Add("", new byte[] { 0x00, 0x00, 0x00, 0x00 }); + + + + + + + + + } + } + + public Tuple _currentGenesis_WriteRegister(String reg, T value, Boolean waitForResult = true, + Boolean checkRegister = false) + { + return new Tuple(reg, + _currentGenesis.WriteRegister(reg, value, waitForResult, checkRegister)); + } + + private void btnJsonCheck_Click(Object sender, EventArgs e) + { + if (_currentGenesis != null) + { + var allSucceed = true; + var List = _currentGenesis.GetRegistersDic().Keys.ToList(); + foreach (var VARIABLE in List) + { + + if ((VARIABLE.RegisterDetail.Privilege.Lvl8 == Access.RO + || VARIABLE.RegisterDetail.Privilege.Lvl8 == Access.RW) + ) + { + var a = _currentGenesis.ReadRegister(VARIABLE.GetIdent()); + //String result = RegisterCheck.CheckRange(VARIABLE, a); + if (StatusReturn.Failed == RegisterCheck.CheckRange(VARIABLE, a, out var result)) + { + MessageBox.Show(result); + allSucceed = false; + } + } + } + + if (allSucceed) + { + MessageBox.Show(@"Json Check Succeed!"); + } + else + { + MessageBox.Show(@"Json Check Failed!"); + } + } + } + + private void btnReadyForTestBench_Click(Object sender, EventArgs e) + { + if (_currentGenesis != null) + { + + _currentGenesis.ReLogin(); + + //var rees1 = _currentGenesis.ReadRegister("SENSUSRADIO_EncryptionKey",32); + //var rees2 = _currentGenesis.ReadRegister("SENSUSRADIO_Authentification", 32); + //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_EncryptionKey", (new Byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true)); + //overAllResult.Add(_currentGenesis_WriteRegister("SENSUSRADIO_Authentification", (new Byte[] { 0x14, 0x30, 0x68, 0xD0, 0x14, 0x0E, 0x80, 0x40, 0x63, 0x93, 0x73, 0x22 }).Reverse().ToArray(), true, true)); + + _currentGenesis_WriteRegister("GENESISFLOW_LowFlowMaxPeriod", 60 << 16, true, true); + + + _currentGenesis.ResetAlarm(Alarm.EMPTY_PIPE | Alarm.REBOOT); + //TODO set display unit + //TODO calculated overflow volume for display + _currentGenesis_WriteRegister("GENESISFLOW_SealDisplay", + (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true); + + _currentGenesis.WriteRegister(Register.Genesisflow.SampleRate, 10, checkRegister: true); + _currentGenesis.WriteRegister(Register.Genesisflow.LedMode, 6, checkRegister: true); + _currentGenesis.WriteRegister("GENESISFLOW_TriggerActive", 1); + + _currentGenesis_WriteRegister("GENESISFLOW_DisplayPow10", + (new Byte[] { 0x00, 0x00, 0x00, 0xFA }).Reverse().ToArray(), true, true); + + + } + } + + private void button1_Click_2(Object sender, EventArgs e) + { + if (_currentGenesis != null) + { + _currentGenesis.ReLogin(); + _currentGenesis_WriteRegister("GENESISFLOW_SealDisplay", + (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true); + + _currentGenesis_WriteRegister("CUSTOMER_Locale", + (new Byte[] { 0x00, 0x00, 0x00, 0x24 }).Reverse().ToArray(), true, true); + + + _currentGenesis_WriteRegister("METROLOGYASST_PulseWeight", (new Byte[] { 0x00, 0x00, 0x0E, 0xC9 }).Reverse().ToArray(), true, true); + _currentGenesis_WriteRegister("METROLOGYASST_FlowPoint", (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true); + _currentGenesis_WriteRegister("METROLOGYASST_TemperatureUnits", (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, true); + _currentGenesis_WriteRegister("METROLOGYASST_FlowUnits", (new Byte[] { 0x00, 0x00, 0x00, 0x06 }).Reverse().ToArray(), true, true); + _currentGenesis_WriteRegister("GENESISFLOW_DisplayUnits", (new Byte[] { 0x00, 0x00, 0x00, 0x02 }).Reverse().ToArray(), true, true); + + + _currentGenesis_WriteRegister("GENESISFLOW_SealDisplay", + (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, true); + + + + } + } + + private void button2_Click_1(Object sender, EventArgs e) + { + _currentGenesis_WriteRegister("GENESISFLOW_SealDisplay", + (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true); + + + _currentGenesis_WriteRegister("CUSTOMER_Locale", + (new Byte[] { 0x00, 0x00, 0x00, 0xD0 }).Reverse().ToArray(), true, true); + + _currentGenesis_WriteRegister("METROLOGYASST_PulseWeight", (new Byte[] { 0x00, 0x00, 0x03, 0xE8 }).Reverse().ToArray(), true, true); + _currentGenesis_WriteRegister("METROLOGYASST_FlowPoint", (new Byte[] { 0x00, 0x00, 0x00, 0x02 }).Reverse().ToArray(), true, true); + _currentGenesis_WriteRegister("METROLOGYASST_TemperatureUnits", (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true); + _currentGenesis_WriteRegister("METROLOGYASST_FlowUnits", (new Byte[] { 0x00, 0x00, 0x00, 0x04 }).Reverse().ToArray(), true, true); + _currentGenesis_WriteRegister("GENESISFLOW_DisplayUnits", (new Byte[] { 0x00, 0x00, 0x00, 0x00 }).Reverse().ToArray(), true, true); + + _currentGenesis_WriteRegister("GENESISFLOW_SealDisplay", + (new Byte[] { 0x00, 0x00, 0x00, 0x01 }).Reverse().ToArray(), true, true); + } + + private void registerGridView_CellClick(Object sender, DataGridViewCellEventArgs e) + { + if (e.ColumnIndex > 0 && registerGridView.Columns[e.ColumnIndex] is DataGridViewButtonColumn) + { + if (_currentGenesis != null && _currentGenesis.IsLoggedOn) + { + var regdef = (String)registerGridView.Rows[e.RowIndex].Cells[0].Value; + var keyvalueRegdef = _currentGenesis.GetRegistersDic().FirstOrDefault(f => f.Key.GetIdent() == regdef); + if (keyvalueRegdef.Key != null) + { + /*var frmDialog = new FrmRegisterHistory(_currentGenesis.PcbId, keyvalueRegdef.Key); + frmDialog.SetDesktopLocation(Cursor.Position.X, Cursor.Position.Y); + frmDialog.ShowDialog();*///...MF + } + + + + } + } + } + + private String _preSelectReminder = "None"; + + private void lblState_Click(Object sender, EventArgs e) + { + if (_preSelectReminder.Contains("None")) + { + _preSelectReminder = "All"; + SelectPreset("All"); + } + else + { + _preSelectReminder = "None"; + SelectPreset("None"); + } + } + + private void btnSetDefaultPulse_Click(Object sender, EventArgs e) + { + if (_currentGenesis != null) + { + _currentGenesis.ReLogin(); + btnSetDefaultPulse.BackColor = Color.Yellow; + try + { + if (_currentGenesis.IsLoggedOn) + { + _currentGenesis.WriteRegister("METROLOGYASST_PulseMode", 1); + + _currentGenesis.WriteRegister("METROLOGYASST_PulseWeight", 32000); + + _currentGenesis.WriteRegister("METROLOGYASST_PulseLength", 8); + _currentGenesis.WriteRegister("GENESISFLOW_SampleRate", 2); + _currentGenesis.WriteRegister("GENESISFLOW_LedMode", 0); + + _currentGenesis.WriteRegister("GENESISFLOW_TriggerActive", 1); + + btnSetDefaultPulse.BackColor = Color.Green; + _currentGenesis.Logout(); + return; + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + + _currentGenesis.Logout(); + btnSetDefaultPulse.BackColor = Color.Red; + } + } + + private void btnBatteryIdle_Click(Object sender, EventArgs e) + { + if (_currentGenesis != null) + { + _currentGenesis.ReLogin(); + btnBatteryIdle.BackColor = Color.Yellow; + try + { + var ts = DateTimeOffset.UtcNow - new DateTimeOffset(2000, 1, 1, 0, 0, 0, new TimeSpan(0)); + if (_currentGenesis.IsLoggedOn) + { + _currentGenesis.WriteRegister("GENESISFLOW_SealDisplay", 0); + _currentGenesis.WriteRegister("POWERMON_WarnFromClamp", (UInt32)473040000); + _currentGenesis.WriteRegister("SYSTEM_CalendarSeconds", Convert.ToInt32(ts.TotalSeconds)); + var r = _currentGenesis.ReadRegister(Register.Genesisflow.TriggerIdle); + if (r[1] == 18) + { + var newVal = r[0] + 0x01; + var n = new Byte[] { (Byte)newVal, r[1], 0x00, 0x00 }; + + _currentGenesis.WriteRegister(Register.Genesisflow.TriggerIdle, n); + } + else + { + _currentGenesis.SetLcdText(false, new Byte[] { 0x12, 0x35 }); + } + + btnBatteryIdle.BackColor = Color.Green; + _currentGenesis.Logout(); + return; + } + + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + + btnBatteryIdle.BackColor = Color.Red; + _currentGenesis.Logout(); + } + } + + private void label1_Click(Object sender, EventArgs e) + { + + } + + private void btnStoreAll_Click(Object sender, EventArgs e) + { + if (_currentGenesis != null) + { + _currentGenesis.ReLogin(); + btnStoreAll.BackColor = Color.Yellow; + try + { + if (_currentGenesis.IsLoggedOn) + { + var resultAll = _currentGenesis.StoreAllConfigurations(); + if (resultAll) + { + btnStoreAll.BackColor = Color.Green; + _currentGenesis.Logout(); + return; + } + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + + _currentGenesis.Logout(); + btnStoreAll.BackColor = Color.Red; + } + } + + //private void btn0406_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)) + // { + + // btn0406.BackColor = Color.Yellow; + // try + // { + // foreach (var me in _meterBatch.ListOfMeters) + // { + // if (me is GenesisMeter) + // { + // if (((GenesisMeter)me).IsLoggedOn) + // { + // _currentGenesis = ((GenesisMeter)me); + + + + // _currentGenesis.WriteRegister("CUSTOMER_StoreConfiguration", 1); + + // var reboot = ByteArrayStyle.ByteStyler.ToString(_currentGenesis.ReadRegister("CUSTOMER_RebootCount")); + // var PERIODICLOG_ResetCounter = ByteArrayStyle.ByteStyler.ToString(_currentGenesis.ReadRegister("PERIODICLOG_ResetCounter")); + // var SENSUSRADIO_ResetCounter = ByteArrayStyle.ByteStyler.ToString(_currentGenesis.ReadRegister("SENSUSRADIO_ResetCounter")); + + // var rebootSeconds = ByteArrayStyle.ByteStyler.ToString(_currentGenesis.ReadRegister("SYSTEM_MonotonicSeconds")); + // var Storeconfig = ByteArrayStyle.ByteStyler.ToString(_currentGenesis.ReadRegister("CUSTOMER_StoreConfiguration")); + // _currentGenesis.WriteLog($"#+#+#{_currentGenesis.PcbId};{Storeconfig};{reboot};{rebootSeconds};{cbProd.Checked};{txtTest.Text};{PERIODICLOG_ResetCounter};{SENSUSRADIO_ResetCounter}"); + + // btn0406.BackColor = Color.Green; + // btn0406.Text = Storeconfig; + // return; + // } + + // } + // } + + // } + // catch (Exception ex) + // { + // btn0406.BackColor = Color.Red; + // MessageBox.Show(ex.Message); + // } + + + // } + // } + //} + + + private void CheckAndDisplayRebootCount() + { + if (_currentGenesis != null) + { + _currentGenesis.ReLogin(); + timer1.Enabled = false; + btnRegisterToFile.BackColor = Color.Yellow; + try + { + + if (_currentGenesis.IsLoggedOn) + { + var reboot = _currentGenesis.ReadRegister("CUSTOMER_RebootCount"); + _currentGenesis.ReadRegister("POWERMON_BatteryQuantity"); + _currentGenesis.SetLcdText(false, new Byte[] { 0xAC, reboot[0] }); + btnRegisterToFile.BackColor = Color.Green; + timer1.Enabled = true; + _currentGenesis.Logout(); + return; + } + + } + catch (Exception) + { + timer1.Enabled = true; + btnRegisterToFile.BackColor = Color.Red; + return; + } + + _currentGenesis.Logout(); + timer1.Enabled = true; + btnRegisterToFile.BackColor = Color.Gray; + } + } + + private void timer1_Tick(Object sender, EventArgs e) + { + CheckAndDisplayRebootCount(); + } + + + private void btnBatLife_Click(Object sender, EventArgs e) + { + if (_currentGenesis != null) + { + _currentGenesis.ReLogin(); + try + { + if (_currentGenesis.IsLoggedOn) + { + var t = new JustageResults + { + pcbId = _currentGenesis.PcbId, + p1Target = 0, + p1Value = RegisterConverter.ByteArrayToValue( + _currentGenesis.ReadRegister(Register.Genesisflow.CalFactor1)), + p2Target = 0, + p2Value = RegisterConverter.ByteArrayToValue( + _currentGenesis.ReadRegister(Register.Genesisflow.CalFactor2)), + p3Target = 0, + p3Value = RegisterConverter.ByteArrayToValue( + _currentGenesis.ReadRegister(Register.Genesisflow.CalFactor3)), + dt = DateTime.UtcNow + }; + + try + { + var tmpUrl = "http://10.49.40.25/MeterProcessState/api/TestBench/SetCalibrationValues"; + //ToDO: Update to service URl + + t.PostAsJson(tmpUrl); + } + catch (Exception) + { + // + } + + /*...MF var genesisStatus = new GenesisStatus(); + + if (GenesisStatusHandler.BuildLifeTimeInformation(_currentGenesis, genesisStatus, out _)) + { + var sbMSG = new StringBuilder(); + sbMSG.AppendLine($"Pcb = {_currentGenesis.PcbId}"); + + sbMSG.AppendLine($"POWERMON_TotalUsedSeconds = {genesisStatus.ExceededLifeTime_s}"); + sbMSG.AppendLine($"POWERMON_TotalUsedCharge = {genesisStatus.DrainedBatteryLoad_uAs}"); + sbMSG.AppendLine($"POWERMON_BatteryQuantity = {genesisStatus.BatteryQuantity}"); + sbMSG.AppendLine($"POWERMON_BatteryMilliAHrRating = {genesisStatus.InitialBatteryLoad_mAh}"); + sbMSG.AppendLine(""); + sbMSG.AppendLine($"Remaining life time in years {genesisStatus.RemainingLifeTimeYears:F2}"); + sbMSG.AppendLine($"Totally drained battery load in % {genesisStatus.DrainedBatteryLoadPercent:F2}"); + + MessageBox.Show(sbMSG.ToString(), $@"Battery for {_currentGenesis.PcbId} has remaining life " + + $@"time of {genesisStatus.RemainingLifeTimeYears:F2} years"); + } + else + { + MessageBox.Show(@"Failed to get life time information"); + }*/ + } + } + catch (Exception ex) + { + MessageBox.Show(ex.ToString()); + } + + _currentGenesis.Logout(); + } + } + + private void btnRadioPressure_Click(Object sender, EventArgs e) + { + if (_currentGenesis != null) + { + btnRadioPressure.BackColor = Color.Yellow; + _currentGenesis.ReLogin(); + try + { + var ret = "Failed"; + if (_currentGenesis.IsLoggedOn) + { + + //CUSTOMER_AlarmEnableMask - 00-00-80-53 + //CUSTOMER_AlarmBroadcastMask - 00-00-1F-DC + //CUSTOMER_AlarmVisualMask - 00-00-1F-DC + // + + _currentGenesis.WriteRegister("SENSUSRADIO_MainAlarmMask", new Byte[] { 0x00 }); + _currentGenesis.WriteRegister("SENSUSRADIO_ExtendedAlarmMask", new Byte[] { 0x00 }); + + _currentGenesis.WriteRegister("CUSTOMER_AlarmEnableMask", new Byte[] { 0xD3, 0x9F, 0x00, 0x00 }); + _currentGenesis.WriteRegister("CUSTOMER_AlarmBroadcastMask", new Byte[] { 0xDC, 0x1F, 0x00, 0x00 }); + _currentGenesis.WriteRegister("CUSTOMER_AlarmVisualMask", new Byte[] { 0xDC, 0x1F, 0x00, 0x00 }); + + _currentGenesis.WriteRegister("SENSUSRADIO_SystemState", 0xFF); + _currentGenesis.Logout(); + Thread.Sleep(3000); + if (!_currentGenesis.ReLogin()) + { + Thread.Sleep(5000); + if (!_currentGenesis.ReLogin()) + { + + } + } + + /*var SENSUSRADIO_MainAlarmMask = */ + _currentGenesis.ReadRegister("SENSUSRADIO_MainAlarmMask"); + /*var SENSUSRADIO_ExtendedAlarmMask = */ + _currentGenesis.ReadRegister("SENSUSRADIO_ExtendedAlarmMask"); + + //_currentGenesis.WriteRegister("POWERMON_BatteryQuantity", 2, true, true); + + //var defEncryptionKey = new List(); + //defEncryptionKey.AddRange(new Byte[] { 0x0E, 0x9F, 0xAC, 0xC6 }.ToArray()); + //defEncryptionKey.AddRange(new Byte[] { 0xA0, 0xE1, 0xEF, 0x1C }.ToArray()); + //defEncryptionKey.AddRange(new Byte[] { 0x3B, 0x27, 0xA4, 0x9B }.ToArray()); + //defEncryptionKey.AddRange(new Byte[] { 0xAC, 0x21, 0x65, 0x35 }.ToArray()); + //_currentGenesis.WriteRegister("SENSUSRADIO_EncryptionKey", defEncryptionKey.ToArray(), true); + + + var freq = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister("SENSUSRADIO_FrequencyIndicator")); + var radioAddress = RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister("SENSUSRADIO_RadioAddress")); + //_currentGenesis.WriteRegister("SENSUSRADIO_SystemState", 0xFF); + + //_currentGenesis.WriteRegister("SENSUSRADIO_WakeupInterval", 0); + //_currentGenesis.Logout(); + //File.AppendAllLines("RadioActivation.log", new[] { $"{freq};{_currentGenesis.PcbId};{RadioAdress};{DateTime.Now}" }); + if (0x02 == RegisterConverter.ByteArrayToValue( + _currentGenesis.ReadRegister("SENSUSRADIO_SystemState"))) + { + btnRadioPressure.BackColor = Color.Green; + ret = $"{freq};{_currentGenesis.PcbId};{radioAddress};{DateTime.Now}"; + } + else + { + btnRadioPressure.BackColor = Color.Red; + + } + } + + MessageBox.Show(ret); + } + catch (Exception ex) + { + btnRadioPressure.BackColor = Color.Red; + MessageBox.Show(ex.ToString()); + } + _currentGenesis.Logout(); + } + } + + private void btnCalibrationRestore_Click(Object sender, EventArgs e) + { + //foreach (var me in _meterBatch.ListOfMeters) + //{ + // if (me is GenesisMeter Meter) + // { + // if (((GenesisMeter)me).IsLoggedOn) + // { + // //check if pcb is in file + // // no + // //Pcb , cal valus into txt file + // // cal value + 0,6 + // // store + // // update Calvalues + + // //yes + // //msg + // } + // } + //} + } + + public static Boolean GetCalibrationResultsFromDbperRun(String RunId, CalibrationResults calibResults, + out String errorMsg) + { + errorMsg = ""; + if (null == calibResults) + { + return false; + } + + try + { + var url = "http://sla12iis01.emea.sensus.net/MeterProcessState/api/FinalCheck/CalibrationResults/"; + var requestResponse = LocalWebRequest.GetRequest(url, 30000, out var httpStatus); + if (httpStatus == HttpStatusCode.OK && !string.IsNullOrEmpty(requestResponse)) + { + var calibRes = JsonConvert.DeserializeObject(requestResponse); + // ClassAccess.CopyProperties(calibResults, calibRes); + var type = typeof(CalibrationResults); + foreach (var prop in type.GetProperties()) + { + if (prop.CanWrite) + prop.SetValue(calibResults, prop.GetValue(calibRes, null), null); + } + return true; + } + } + catch (Exception e) + { + errorMsg = e.Message; + return false; + } + + return false; + } + + private void FingerWeg_Clicked(Object sender, EventArgs args) + { + if (_currentGenesis != null) + { + _currentGenesis.ReLogin(); + try + { + if (_currentGenesis.IsLoggedOn) + { + + var Meter_calibrationResult = new CalibrationResult(); + Meter_calibrationResult.MeterSize = + RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister(Register.Genesisflow.MeterSize)); + + //readsOk.Add(ReadRegisterRetry(Meter, "CalFactor1", Register.Genesisflow.CalFactor1, out retByte)); + Meter_calibrationResult.CalFactor1 = + RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister(Register.Genesisflow.CalFactor1)); + //readsOk.Add(ReadRegisterRetry(Meter, "CalFactor2", Register.Genesisflow.CalFactor2, out retByte)); + Meter_calibrationResult.CalFactor2 = + RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister(Register.Genesisflow.CalFactor2)); + //readsOk.Add(ReadRegisterRetry(Meter, "CalFactor3", Register.Genesisflow.CalFactor3, out retByte)); + Meter_calibrationResult.CalFactor3 = + RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister(Register.Genesisflow.CalFactor3)); + //readsOk.Add(ReadRegisterRetry(Meter, "ZeroOffset1", Register.Genesisflow.ZeroOffset1, out retByte)); + Meter_calibrationResult.ZeroOffset1 = + RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister(Register.Genesisflow.ZeroOffset1)); + //readsOk.Add(ReadRegisterRetry(Meter, "ZeroOffset2", Register.Genesisflow.ZeroOffset2, out retByte)); + Meter_calibrationResult.ZeroOffset2 = + RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister(Register.Genesisflow.ZeroOffset2)); + //readsOk.Add(ReadRegisterRetry(Meter, "ZeroOffset3", Register.Genesisflow.ZeroOffset3, out retByte)); + Meter_calibrationResult.ZeroOffset3 = + RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister(Register.Genesisflow.ZeroOffset3)); + //readsOk.Add(ReadRegisterRetry(Meter, "FirstHitUpdatePeriod", Register.Genesisflow.FirstHitUpdatePeriod, out retByte)); + Meter_calibrationResult.FirstHitUpdatePeriod = + RegisterConverter.ByteArrayToValue( + _currentGenesis.ReadRegister(Register.Genesisflow.FirstHitUpdatePeriod)); + //readsOk.Add(ReadRegisterRetry(Meter, "FirstHitShift", Register.Genesisflow.FirstHitShift, out retByte)); + Meter_calibrationResult.FirstHitShift = + RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister(Register.Genesisflow.FirstHitShift)); + //readsOk.Add(ReadRegisterRetry(Meter, "FirstHitPercent1", Register.Genesisflow.FirstHitPercent1, out retByte)); + Meter_calibrationResult.FirstHitPercent1 = + RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister(Register.Genesisflow.FirstHitPercent1)); + //readsOk.Add(ReadRegisterRetry(Meter, "FirstHitPercent2", Register.Genesisflow.FirstHitPercent2, out retByte)); + Meter_calibrationResult.FirstHitPercent2 = + RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister(Register.Genesisflow.FirstHitPercent2)); + //readsOk.Add(ReadRegisterRetry(Meter, "FirstHitPercent3", Register.Genesisflow.FirstHitPercent3, out retByte)); + Meter_calibrationResult.FirstHitPercent3 = + RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister(Register.Genesisflow.FirstHitPercent3)); + //readsOk.Add(ReadRegisterRetry(Meter, "ToFTempOffset1", Register.Genesisflow.ToFTempOffset1, out retByte)); + Meter_calibrationResult.ToFTempOffset1 = + RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister(Register.Genesisflow.ToFTempOffset1)); + //readsOk.Add(ReadRegisterRetry(Meter, "ToFTempOffset2", Register.Genesisflow.ToFTempOffset2, out retByte)); + Meter_calibrationResult.ToFTempOffset2 = + RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister(Register.Genesisflow.ToFTempOffset2)); + + Meter_calibrationResult.ToFTempOffset3 = + RegisterConverter.ByteArrayToValue(_currentGenesis.ReadRegister(Register.Genesisflow.ToFTempOffset3)); + Meter_calibrationResult.AdditionalLogInfos.Add("add info", "restore from meter"); + var exPost = new Exception(); + var code = 0; + LocalWebRequest.PostRequestAsync($"{ServiceUrls.PostGenesisCalibrationResultUrl()}?PcbId={_currentGenesis.PcbId}", + ref code, ref exPost, 8000, Meter_calibrationResult); + } + } + catch (Exception) + { + // + } + + //if (this._currentGenesis is null || !this._currentGenesis.IsLoggedOn) + //{ + // MessageBox.Show("Not connected!"); + + // return; + //} + + //this.SetBusy(true, "Recalibration is running"); + + //if (!this.CheckBatteryLifetime()) + //{ + // this.SetBusy(false); + + // return; + //} + + //var p1Cal = default(int); + //var p2Cal = default(int); + //var p3Cal = default(int); + //var logBuilder = new StringBuilder(); + + //try + //{ + // var caption = string.Empty; + // var buttons = MessageBoxButtons.YesNo; + // var icon = MessageBoxIcon.Question; + + // int ReadRegister(string name) + // { + // var value = default(int); + + // if (!this._currentGenesis.IsLoggedOn) + // { + // if (!this._currentGenesis.ReLogin()) + // { + // var answer = MessageBox.Show("Relogin failed!\n\nWould you try again?", caption, buttons, icon); + + // if (answer == DialogResult.Yes) + // { + // value = ReadRegister(name); + // } + // } + // } + + // value = RegisterConverter.ByteArrayToValue(this._currentGenesis.ReadRegister(name)); + + // if (value == 0) + // { + // var answer = MessageBox.Show($"Reading: {name} failed value is - {value}!\n\nWould you try again?", caption, buttons, icon); + + // if (answer == DialogResult.Yes) + // { + // value = ReadRegister(name); + // } + // } + + // return value; + // } + + // p1Cal = ReadRegister(Register.Genesisflow.CalFactor1); + // p2Cal = ReadRegister(Register.Genesisflow.CalFactor2); + // p3Cal = ReadRegister(Register.Genesisflow.CalFactor3); + + // if (p1Cal == 0 || p2Cal == 0 || p3Cal == 0) + // { + // return; + // } + + // logBuilder.AppendLine(); + // logBuilder.AppendLine($"Old values:"); + // logBuilder.AppendLine($" - P1 CalFactor: {p1Cal}"); + // logBuilder.AppendLine($" - P2 CalFactor: {p2Cal}"); + // logBuilder.AppendLine($" - P3 CalFactor: {p3Cal}"); + //} + //catch (Exception eRead) + //{ + // MessageBox.Show($"Read exception: {eRead}"); + + // this.SetBusy(false); + + // return; + //} + + //var httpClient = new HttpClient(); + //var values = new List(); + + //try + //{ + // using (var httpResponse = await httpClient.GetAsync(ServiceUrls.GetQ3CalibrationsURI(this._currentPcbId))) + // { + // var content = await httpResponse.Content.ReadAsStringAsync(); + + // if (httpResponse.IsSuccessStatusCode) + // { + // try + // { + // values = JsonConvert.DeserializeObject>(content); + // } + // catch (Exception eParse) + // { + // MessageBox.Show($"Parse exception: {eParse}"); + + // this.SetBusy(false); + + // return; + // } + // } + // else + // { + // MessageBox.Show($"Error: {content}"); + + // this.SetBusy(false); + + // return; + // } + // } + //} + //catch (Exception eHttp) + //{ + // MessageBox.Show($"Http exception: {eHttp}"); + + // this.SetBusy(false); + + // return; + //} + + //if (!values.Any(x => x.P1Off == -0.30001)) + //{ + // try + // { + // var requestUri = ServiceUrls.Q3CalibrationResultURL; + // var requestJson = JsonConvert.SerializeObject(new Q3Calibration + // { + // PcbId = this._currentPcbId, + // P1Off = -0.30001, + // P1Cal = p1Cal, + // P2Off = -0.30001, + // P2Cal = p2Cal, + // P3Off = -0.30001, + // P3Cal = p3Cal, + // }); + // var requestContent = new StringContent(requestJson, Encoding.UTF8, "application/json"); + + // using (var httpResponse = await httpClient.PostAsync(requestUri, requestContent)) + // { + // var content = await httpResponse.Content.ReadAsStringAsync(); + + // if (httpResponse.IsSuccessStatusCode && int.TryParse($"{content}", out var rowsAffected)) + // { + // logBuilder.AppendLine($"... old values saved!"); + // } + // else + // { + // MessageBox.Show($"HTTP Error: {content}"); + + // this.SetBusy(false); + + // return; + // } + // } + // } + // catch (Exception eHttp) + // { + // MessageBox.Show($"Http exception: {eHttp}"); + + // this.SetBusy(false); + + // return; + // } + //} + + //if (!values.Any(x => x.P1Off == 0.30001)) + //{ + // var offset = 0D; + + // try + // { + // offset = values + // .OrderByDescending(x => x.Date) + // .FirstOrDefault() + // ?.P1Off ?? 0; + + // if (offset > 0.2) + // { + // MessageBox.Show($"Recalibration is not required!"); + + // this.SetBusy(false); + + // return; + // } + // } + // catch (Exception eLinq) + // { + // MessageBox.Show($"LINQ exception: {eLinq}"); + // } + + // try + // { + // p1Cal = (int)Math.Round(p1Cal * (1 + 0.6 / 100), 0); + // p2Cal = (int)Math.Round(p2Cal * (1 + 0.6 / 100), 0); + // p3Cal = (int)Math.Round(p3Cal * (1 + 0.6 / 100), 0); + // } + // catch (Exception eCalc) + // { + // MessageBox.Show($"Calculation exception: {eCalc}"); + + // this.SetBusy(false); + + // return; + // } + + // try + // { + // var caption = string.Empty; + // var buttons = MessageBoxButtons.YesNo; + // var icon = MessageBoxIcon.Question; + + // void WriteRegister(string name, int value) + // { + // if (!this._currentGenesis.IsLoggedOn) + // { + // if (!this._currentGenesis.ReLogin()) + // { + // var answer = MessageBox.Show("Relogin failed!\n\nWould you try again?", caption, buttons, icon); + + // if (answer == DialogResult.Yes) + // { + // WriteRegister(name, value); + // } + // } + // } + + // if (!this._currentGenesis.WriteRegister(name, value)) + // { + // var answer = MessageBox.Show($"Writing: {name} = {value} failed!\n\nWould you try again?", caption, buttons, icon); + + // if (answer == DialogResult.Yes) + // { + // WriteRegister(name, value); + // } + // } + // } + + // WriteRegister(Register.Genesisflow.SealDisplay, 0); + // WriteRegister(Register.Genesisflow.TriggerIdle, 0); + // WriteRegister(Register.Genesisflow.CalFactor1, p1Cal); + // WriteRegister(Register.Genesisflow.CalFactor2, p2Cal); + // WriteRegister(Register.Genesisflow.CalFactor3, p3Cal); + // WriteRegister(Register.Genesisflow.DisplayUnits, 0); + // WriteRegister(Register.Metrologyasst.FlowUnits, 4); + // WriteRegister(Register.Genesisflow.DisplayPow10, -6); + // WriteRegister(Register.Genesisflow.SealDisplay, 1); + // WriteRegister(Register.Genesisflow.StoreConfiguration, 1); + + // logBuilder.AppendLine(); + // logBuilder.AppendLine($"New values:"); + // logBuilder.AppendLine($" - P1 CalFactor: {p1Cal}"); + // logBuilder.AppendLine($" - P2 CalFactor: {p2Cal}"); + // logBuilder.AppendLine($" - P3 CalFactor: {p3Cal}"); + // } + // catch (Exception eWrite) + // { + // MessageBox.Show($"Write exception: {eWrite}"); + + // this.SetBusy(false); + + // return; + // } + + // var newValuesWriten = false; + + // try + // { + // //var requestUri = ServiceUrls.Q3CalibrationResultURL; + // //var requestJson = JsonConvert.SerializeObject(new Q3Calibration + // //{ + // // PcbId = this._currentPcbId, + // // P1Off = 0.30001, + // // P1Cal = p1Cal, + // // P2Off = 0.30001, + // // P2Cal = p2Cal, + // // P3Off = 0.30001, + // // P3Cal = p3Cal, + // //}); + // var requestContent = new StringContent(requestJson, Encoding.UTF8, "application/json"); + + // using (var httpResponse = await httpClient.PostAsync(requestUri, requestContent)) + // { + // var content = await httpResponse.Content.ReadAsStringAsync(); + + // if (httpResponse.IsSuccessStatusCode && int.TryParse($"{content}", out var rowsAffected)) + // { + // newValuesWriten = rowsAffected > 0; + // } + // else + // { + // MessageBox.Show($"HTTP Error: {content}"); + + // this.SetBusy(false); + + // return; + // } + // } + // } + // catch (Exception eHttp) + // { + // MessageBox.Show($"HTTP exception: {eHttp}"); + + // this.SetBusy(false); + + // return; + // } + + // if (newValuesWriten) + // { + // logBuilder.AppendLine("... new values saved!"); + + // foreach (var row in this._dataTable.Rows) + // { + // if (row is DataRow dataRow && dataRow["Name"] is string registerName) + // { + // dataRow["isChecked"] = registerName == Register.Genesisflow.SealDisplay + // || registerName == Register.Genesisflow.CalFactor1 + // || registerName == Register.Genesisflow.CalFactor2 + // || registerName == Register.Genesisflow.CalFactor3 + // || registerName == Register.Genesisflow.DisplayUnits + // || registerName == Register.Genesisflow.DisplayPow10 + // || registerName == Register.Genesisflow.StoreConfiguration + // || registerName == Register.Genesisflow.TriggerIdle + // || registerName == Register.Metrologyasst.FlowUnits; + // } + // } + + // this.btnRead_Click(sender, args); + // } + // else + // { + // MessageBox.Show($"Q3Calibration values are not saved!"); + + // this.SetBusy(false); + + // return; + // } + //} + //else + //{ + // MessageBox.Show($"Already recalibrated!"); + + // this.SetBusy(false); + + // return; + //} + + //MessageBox.Show(logBuilder.ToString(), $"{this._currentPcbId} - successfully recalibrated", MessageBoxButtons.OK, MessageBoxIcon.Information); + _currentGenesis.Logout(); + } + } + + private void btnRegisterToFile_Click(Object sender, EventArgs e) + { + SelectPreset("All"); + var j = ReadRegisters(); + + var saveFileDialog1 = new SaveFileDialog(); + saveFileDialog1.Filter = @"Register Back Up files (*.rbu)|*.rbu"; + saveFileDialog1.FilterIndex = 1; + saveFileDialog1.RestoreDirectory = true; + + if (saveFileDialog1.ShowDialog() == DialogResult.OK) + { + File.WriteAllText(saveFileDialog1.FileName, JsonConvert.SerializeObject(j)); + } + } + + private void btnFileToRegister_Click(Object sender, EventArgs e) + { + if (_currentGenesis != null) + { + _currentGenesis.ReLogin(); + + RegisterRestoreData DataShow = null; + using (var openFileDialog = new OpenFileDialog()) + { + openFileDialog.Filter = @"Register Back Up files (*.rbu)|*.rbu"; + openFileDialog.FilterIndex = 2; + openFileDialog.RestoreDirectory = true; + + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + //Get the path of specified file + var filePath = openFileDialog.FileName; + + DataShow = JsonConvert.DeserializeObject(File.ReadAllText(filePath)); + } + } + + var stringBuilder = new StringBuilder(); + var NotStringBuilder = new StringBuilder(); + if (DataShow != null) + { + foreach (var RestoreItem in DataShow.RegisterList) + { + var meterRegisters = _currentGenesis.GetConfigRegistersDefinitions(); + var regDef = meterRegisters.GetRegisterDefinitionByName(RestoreItem.Key); + var RegValue = RestoreItem.Value; + + + /*if (RestoreItem.Value != null + && regDef.RegisterDetail != null + && regDef.RegisterDetail.Privilege.Lvl8 == Access.RW + && regDef.DataType != typeof(RPC)) + { + _currentGenesis.ReLogin(); + var comp = _currentGenesis.ReadRegister(RestoreItem.Key); + + if (BitConverter.ToString(RegValue) == BitConverter.ToString(comp)) + { + NotStringBuilder.AppendLine( + $"Register not changed ! {RestoreItem.Key} to {BitConverter.ToString(RegValue)}"); + } + else + { + if (regDef.AppName == "CONFIGEXCHANGE" || regDef.AppName == "FLEXNETSERIAL" || + regDef.AppName == "FUNCTEST" || regDef.AppName == "NFC" || regDef.AppName == "TESTMANAGER") + { + NotStringBuilder.AppendLine( + $"AppBlocked ! {RestoreItem.Key} to {BitConverter.ToString(RegValue)}"); + } + else + { + stringBuilder.AppendLine( + $"{RestoreItem.Key} from {BitConverter.ToString(comp)} to {BitConverter.ToString(RegValue)}"); + + if (regDef.DataType != typeof(String)) + RegValue = RegValue.Reverse().ToArray(); + _currentGenesis.WriteRegister(RestoreItem.Key, RegValue, checkRegister: true); + } + } + }*///...MF + } + } + + _currentGenesis.Logout(); + + //...MF MessageBox.Show(stringBuilder.ToString()); + //...MF MessageBox.Show(NotStringBuilder.ToString()); + } + } + + private void cbxUseOfflinePwds_CheckedChanged(Object sender, EventArgs e) + { + cbxUseOfflinePwds.ForeColor = cbxUseOfflinePwds.Checked ? Color.Red : Color.Black; + } + } +} \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmSetup.Designer.cs b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmSetup.Designer.cs new file mode 100644 index 000000000..94e89959a --- /dev/null +++ b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmSetup.Designer.cs @@ -0,0 +1,705 @@ +namespace GenesisCordonelInterface.UI.LaatzenAPI_GenesisToolBox +{ + partial class FrmSetup + { + + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.btnReload = new System.Windows.Forms.Button(); + this.btnStore = new System.Windows.Forms.Button(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.btnAddRow = new System.Windows.Forms.Button(); + this.dgvConfig = new System.Windows.Forms.DataGridView(); + this.tbcSlot = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.cbcRequestPort = new System.Windows.Forms.DataGridViewComboBoxColumn(); + this.cbcRequestType = new System.Windows.Forms.DataGridViewComboBoxColumn(); + this.cbcStreamingPort = new System.Windows.Forms.DataGridViewComboBoxColumn(); + this.cbcSlotType = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + this.btcDetectRequest = new System.Windows.Forms.DataGridViewButtonColumn(); + this.btcDetectStreaming = new System.Windows.Forms.DataGridViewButtonColumn(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.cbxProductionMode = new System.Windows.Forms.CheckBox(); + this.cbUpdateFiles = new System.Windows.Forms.CheckBox(); + this.cbUseMinMaxCheck = new System.Windows.Forms.CheckBox(); + this.label1 = new System.Windows.Forms.Label(); + this.txtWachSeriveUrl = new System.Windows.Forms.TextBox(); + this.cbUseRegisterWatch = new System.Windows.Forms.CheckBox(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.cmdAddOffline = new System.Windows.Forms.Button(); + this.dgvofflinePw = new System.Windows.Forms.DataGridView(); + this.dataGridViewTextBoxColumn1 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.dataGridViewTextBoxColumn2 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.offlinePaswordItemBindingSource = new System.Windows.Forms.BindingSource(this.components); + this.tabPage4 = new System.Windows.Forms.TabPage(); + this.lblGlobalCurrentPath = new System.Windows.Forms.Label(); + this.btnGlobalSearch = new System.Windows.Forms.Button(); + this.btnGlobalDefaultLan = new System.Windows.Forms.Button(); + this.btnGlobalDefaultLocal = new System.Windows.Forms.Button(); + this.label6 = new System.Windows.Forms.Label(); + this.lblLocalCurrentPath = new System.Windows.Forms.Label(); + this.btnLocalSearch = new System.Windows.Forms.Button(); + this.btnLocalDefaultLan = new System.Windows.Forms.Button(); + this.btnLocalDefaultLocal = new System.Windows.Forms.Button(); + this.lblLocalPath = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.tabPage5 = new System.Windows.Forms.TabPage(); + this.cbxSirtService868MHz = new System.Windows.Forms.ComboBox(); + this.cbxSirtService433MHz = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.cbxSirtComport868MHz = new System.Windows.Forms.ComboBox(); + this.cbxSirtComport433MHz = new System.Windows.Forms.ComboBox(); + this.tbxSirtBoxNo = new System.Windows.Forms.TextBox(); + this.tbxSirtStationId = new System.Windows.Forms.TextBox(); + this.lblSirtComport868MHz = new System.Windows.Forms.Label(); + this.lblSirtComport433MHz = new System.Windows.Forms.Label(); + this.lblSirtBoxNo = new System.Windows.Forms.Label(); + this.lblSirtStation = new System.Windows.Forms.Label(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvConfig)).BeginInit(); + this.tabPage2.SuspendLayout(); + this.tabPage3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvofflinePw)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.offlinePaswordItemBindingSource)).BeginInit(); + this.tabPage4.SuspendLayout(); + this.tabPage5.SuspendLayout(); + this.SuspendLayout(); + // + // btnReload + // + this.btnReload.Location = new System.Drawing.Point(12, 12); + this.btnReload.Name = "btnReload"; + this.btnReload.Size = new System.Drawing.Size(140, 43); + this.btnReload.TabIndex = 1; + this.btnReload.Text = "Reload Setup"; + this.btnReload.UseVisualStyleBackColor = true; + this.btnReload.Click += new System.EventHandler(this.BtnReload_Click); + // + // btnStore + // + this.btnStore.Location = new System.Drawing.Point(158, 12); + this.btnStore.Name = "btnStore"; + this.btnStore.Size = new System.Drawing.Size(140, 43); + this.btnStore.TabIndex = 2; + this.btnStore.Text = "Save Setup"; + this.btnStore.UseVisualStyleBackColor = true; + this.btnStore.Click += new System.EventHandler(this.BtnStore_Click); + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Controls.Add(this.tabPage3); + this.tabControl1.Controls.Add(this.tabPage4); + this.tabControl1.Controls.Add(this.tabPage5); + this.tabControl1.Location = new System.Drawing.Point(12, 74); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(768, 387); + this.tabControl1.TabIndex = 17; + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.btnAddRow); + this.tabPage1.Controls.Add(this.dgvConfig); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(760, 361); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "Slots"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // btnAddRow + // + this.btnAddRow.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnAddRow.Location = new System.Drawing.Point(6, 255); + this.btnAddRow.Name = "btnAddRow"; + this.btnAddRow.Size = new System.Drawing.Size(199, 29); + this.btnAddRow.TabIndex = 5; + this.btnAddRow.Text = "Add Slot"; + this.btnAddRow.UseVisualStyleBackColor = true; + this.btnAddRow.Click += new System.EventHandler(this.btnAddRow_Click); + // + // dgvConfig + // + this.dgvConfig.AllowUserToAddRows = false; + this.dgvConfig.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dgvConfig.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dgvConfig.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.tbcSlot, + this.cbcRequestPort, + this.cbcRequestType, + this.cbcStreamingPort, + this.cbcSlotType, + this.btcDetectRequest, + this.btcDetectStreaming}); + this.dgvConfig.Location = new System.Drawing.Point(6, 6); + this.dgvConfig.Name = "dgvConfig"; + this.dgvConfig.Size = new System.Drawing.Size(746, 243); + this.dgvConfig.TabIndex = 4; + this.dgvConfig.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DgvConfig_CellContentClick); + this.dgvConfig.DataError += new System.Windows.Forms.DataGridViewDataErrorEventHandler(this.dgvConfig_DataError); + // + // tbcSlot + // + this.tbcSlot.HeaderText = "tbcSlot"; + this.tbcSlot.Name = "tbcSlot"; + // + // cbcRequestPort + // + this.cbcRequestPort.HeaderText = "cbcRequestPort"; + this.cbcRequestPort.Name = "cbcRequestPort"; + // + // cbcRequestType + // + this.cbcRequestType.HeaderText = "cbcRequestType"; + this.cbcRequestType.Name = "cbcRequestType"; + // + // cbcStreamingPort + // + this.cbcStreamingPort.HeaderText = "cbcStreamingPort"; + this.cbcStreamingPort.Name = "cbcStreamingPort"; + // + // cbcSlotType + // + this.cbcSlotType.HeaderText = "TempretureMeter"; + this.cbcSlotType.Name = "cbcSlotType"; + this.cbcSlotType.Resizable = System.Windows.Forms.DataGridViewTriState.True; + // + // btcDetectRequest + // + this.btcDetectRequest.HeaderText = "btcDetectRequest"; + this.btcDetectRequest.Name = "btcDetectRequest"; + // + // btcDetectStreaming + // + this.btcDetectStreaming.HeaderText = "btcDetectStreaming"; + this.btcDetectStreaming.Name = "btcDetectStreaming"; + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.cbxProductionMode); + this.tabPage2.Controls.Add(this.cbUpdateFiles); + this.tabPage2.Controls.Add(this.cbUseMinMaxCheck); + this.tabPage2.Controls.Add(this.label1); + this.tabPage2.Controls.Add(this.txtWachSeriveUrl); + this.tabPage2.Controls.Add(this.cbUseRegisterWatch); + this.tabPage2.Location = new System.Drawing.Point(4, 22); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(3); + this.tabPage2.Size = new System.Drawing.Size(760, 361); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "General"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // cbxProductionMode + // + this.cbxProductionMode.AutoSize = true; + this.cbxProductionMode.Location = new System.Drawing.Point(25, 19); + this.cbxProductionMode.Name = "cbxProductionMode"; + this.cbxProductionMode.Size = new System.Drawing.Size(104, 17); + this.cbxProductionMode.TabIndex = 22; + this.cbxProductionMode.Text = "ProductionMode"; + this.cbxProductionMode.UseVisualStyleBackColor = true; + // + // cbUpdateFiles + // + this.cbUpdateFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cbUpdateFiles.AutoSize = true; + this.cbUpdateFiles.Location = new System.Drawing.Point(25, 42); + this.cbUpdateFiles.Name = "cbUpdateFiles"; + this.cbUpdateFiles.Size = new System.Drawing.Size(199, 17); + this.cbUpdateFiles.TabIndex = 21; + this.cbUpdateFiles.Text = "Auto Update files (configuration.json)"; + this.cbUpdateFiles.UseVisualStyleBackColor = true; + this.cbUpdateFiles.CheckedChanged += new System.EventHandler(this.cbUpdateFiles_CheckedChanged); + // + // cbUseMinMaxCheck + // + this.cbUseMinMaxCheck.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cbUseMinMaxCheck.AutoSize = true; + this.cbUseMinMaxCheck.Location = new System.Drawing.Point(25, 88); + this.cbUseMinMaxCheck.Name = "cbUseMinMaxCheck"; + this.cbUseMinMaxCheck.Size = new System.Drawing.Size(113, 17); + this.cbUseMinMaxCheck.TabIndex = 20; + this.cbUseMinMaxCheck.Text = "UseMinMaxCheck"; + this.cbUseMinMaxCheck.UseVisualStyleBackColor = true; + this.cbUseMinMaxCheck.CheckedChanged += new System.EventHandler(this.cbUseMinMaxCheck_CheckedChanged); + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(147, 65); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(136, 13); + this.label1.TabIndex = 19; + this.label1.Text = "RegisterWatchServiceURL"; + // + // txtWachSeriveUrl + // + this.txtWachSeriveUrl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtWachSeriveUrl.Location = new System.Drawing.Point(288, 60); + this.txtWachSeriveUrl.Name = "txtWachSeriveUrl"; + this.txtWachSeriveUrl.Size = new System.Drawing.Size(439, 20); + this.txtWachSeriveUrl.TabIndex = 18; + this.txtWachSeriveUrl.TextChanged += new System.EventHandler(this.textBox1_TextChanged); + // + // cbUseRegisterWatch + // + this.cbUseRegisterWatch.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cbUseRegisterWatch.AutoSize = true; + this.cbUseRegisterWatch.Location = new System.Drawing.Point(25, 65); + this.cbUseRegisterWatch.Name = "cbUseRegisterWatch"; + this.cbUseRegisterWatch.Size = new System.Drawing.Size(116, 17); + this.cbUseRegisterWatch.TabIndex = 17; + this.cbUseRegisterWatch.Text = "UseRegisterWatch"; + this.cbUseRegisterWatch.UseVisualStyleBackColor = true; + this.cbUseRegisterWatch.CheckedChanged += new System.EventHandler(this.cbUseRegisterWatch_CheckedChanged); + // + // tabPage3 + // + this.tabPage3.Controls.Add(this.cmdAddOffline); + this.tabPage3.Controls.Add(this.dgvofflinePw); + this.tabPage3.Location = new System.Drawing.Point(4, 22); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.Size = new System.Drawing.Size(760, 361); + this.tabPage3.TabIndex = 2; + this.tabPage3.Text = "OfflinePasswords"; + this.tabPage3.UseVisualStyleBackColor = true; + // + // cmdAddOffline + // + this.cmdAddOffline.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdAddOffline.Location = new System.Drawing.Point(3, 195); + this.cmdAddOffline.Name = "cmdAddOffline"; + this.cmdAddOffline.Size = new System.Drawing.Size(257, 43); + this.cmdAddOffline.TabIndex = 17; + this.cmdAddOffline.Text = "Add Item"; + this.cmdAddOffline.UseVisualStyleBackColor = true; + this.cmdAddOffline.Click += new System.EventHandler(this.cmdAddOffline_Click); + // + // dgvofflinePw + // + this.dgvofflinePw.AutoGenerateColumns = false; + this.dgvofflinePw.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dgvofflinePw.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.dataGridViewTextBoxColumn1, + this.dataGridViewTextBoxColumn2}); + this.dgvofflinePw.DataSource = this.offlinePaswordItemBindingSource; + this.dgvofflinePw.Location = new System.Drawing.Point(3, 19); + this.dgvofflinePw.Name = "dgvofflinePw"; + this.dgvofflinePw.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvofflinePw.Size = new System.Drawing.Size(345, 170); + this.dgvofflinePw.TabIndex = 16; + // + // dataGridViewTextBoxColumn1 + // + this.dataGridViewTextBoxColumn1.DataPropertyName = "PcbID"; + this.dataGridViewTextBoxColumn1.HeaderText = "PcbID"; + this.dataGridViewTextBoxColumn1.Name = "dataGridViewTextBoxColumn1"; + // + // dataGridViewTextBoxColumn2 + // + this.dataGridViewTextBoxColumn2.DataPropertyName = "Password"; + this.dataGridViewTextBoxColumn2.HeaderText = "Password"; + this.dataGridViewTextBoxColumn2.Name = "dataGridViewTextBoxColumn2"; + // + // offlinePaswordItemBindingSource + // + this.offlinePaswordItemBindingSource.DataSource = typeof(OfflinePasswordItem); + // + // tabPage4 + // + this.tabPage4.Controls.Add(this.lblGlobalCurrentPath); + this.tabPage4.Controls.Add(this.btnGlobalSearch); + this.tabPage4.Controls.Add(this.btnGlobalDefaultLan); + this.tabPage4.Controls.Add(this.btnGlobalDefaultLocal); + this.tabPage4.Controls.Add(this.label6); + this.tabPage4.Controls.Add(this.lblLocalCurrentPath); + this.tabPage4.Controls.Add(this.btnLocalSearch); + this.tabPage4.Controls.Add(this.btnLocalDefaultLan); + this.tabPage4.Controls.Add(this.btnLocalDefaultLocal); + this.tabPage4.Controls.Add(this.lblLocalPath); + this.tabPage4.Controls.Add(this.label4); + this.tabPage4.Controls.Add(this.label3); + this.tabPage4.Controls.Add(this.label2); + this.tabPage4.Location = new System.Drawing.Point(4, 22); + this.tabPage4.Name = "tabPage4"; + this.tabPage4.Size = new System.Drawing.Size(760, 361); + this.tabPage4.TabIndex = 3; + this.tabPage4.Text = "Logging"; + this.tabPage4.UseVisualStyleBackColor = true; + this.tabPage4.Enter += new System.EventHandler(this.tabPage4_Click); + // + // lblGlobalCurrentPath + // + this.lblGlobalCurrentPath.AutoSize = true; + this.lblGlobalCurrentPath.Location = new System.Drawing.Point(132, 211); + this.lblGlobalCurrentPath.Name = "lblGlobalCurrentPath"; + this.lblGlobalCurrentPath.Size = new System.Drawing.Size(10, 13); + this.lblGlobalCurrentPath.TabIndex = 12; + this.lblGlobalCurrentPath.Text = "-"; + // + // btnGlobalSearch + // + this.btnGlobalSearch.Location = new System.Drawing.Point(52, 307); + this.btnGlobalSearch.Name = "btnGlobalSearch"; + this.btnGlobalSearch.Size = new System.Drawing.Size(314, 29); + this.btnGlobalSearch.TabIndex = 11; + this.btnGlobalSearch.Text = "Search"; + this.btnGlobalSearch.UseVisualStyleBackColor = true; + this.btnGlobalSearch.Click += new System.EventHandler(this.btnGlobalSearch_Click); + // + // btnGlobalDefaultLan + // + this.btnGlobalDefaultLan.Location = new System.Drawing.Point(52, 272); + this.btnGlobalDefaultLan.Name = "btnGlobalDefaultLan"; + this.btnGlobalDefaultLan.Size = new System.Drawing.Size(314, 29); + this.btnGlobalDefaultLan.TabIndex = 10; + this.btnGlobalDefaultLan.Text = "Use \\\\sla12buma\\cordonelds$\\${machinename}"; + this.btnGlobalDefaultLan.UseVisualStyleBackColor = true; + this.btnGlobalDefaultLan.Click += new System.EventHandler(this.btnGlobalDefaultLan_Click); + // + // btnGlobalDefaultLocal + // + this.btnGlobalDefaultLocal.Location = new System.Drawing.Point(52, 237); + this.btnGlobalDefaultLocal.Name = "btnGlobalDefaultLocal"; + this.btnGlobalDefaultLocal.Size = new System.Drawing.Size(314, 29); + this.btnGlobalDefaultLocal.TabIndex = 9; + this.btnGlobalDefaultLocal.Text = "Use C:\\GenesisLog\\"; + this.btnGlobalDefaultLocal.UseVisualStyleBackColor = true; + this.btnGlobalDefaultLocal.Click += new System.EventHandler(this.btnGlobalDefaultLocal_Click); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(49, 211); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(66, 13); + this.label6.TabIndex = 8; + this.label6.Text = "CurrentPath:"; + // + // lblLocalCurrentPath + // + this.lblLocalCurrentPath.AutoSize = true; + this.lblLocalCurrentPath.Location = new System.Drawing.Point(132, 57); + this.lblLocalCurrentPath.Name = "lblLocalCurrentPath"; + this.lblLocalCurrentPath.Size = new System.Drawing.Size(10, 13); + this.lblLocalCurrentPath.TabIndex = 7; + this.lblLocalCurrentPath.Text = "-"; + // + // btnLocalSearch + // + this.btnLocalSearch.Location = new System.Drawing.Point(52, 153); + this.btnLocalSearch.Name = "btnLocalSearch"; + this.btnLocalSearch.Size = new System.Drawing.Size(314, 29); + this.btnLocalSearch.TabIndex = 6; + this.btnLocalSearch.Text = "Search"; + this.btnLocalSearch.UseVisualStyleBackColor = true; + this.btnLocalSearch.Click += new System.EventHandler(this.btnLocalSearch_Click); + // + // btnLocalDefaultLan + // + this.btnLocalDefaultLan.Location = new System.Drawing.Point(52, 118); + this.btnLocalDefaultLan.Name = "btnLocalDefaultLan"; + this.btnLocalDefaultLan.Size = new System.Drawing.Size(314, 29); + this.btnLocalDefaultLan.TabIndex = 5; + this.btnLocalDefaultLan.Text = "Use \\\\sla12buma\\cordonelds$\\${machinename}"; + this.btnLocalDefaultLan.UseVisualStyleBackColor = true; + this.btnLocalDefaultLan.Click += new System.EventHandler(this.btnLocalDefaultLan_Click); + // + // btnLocalDefaultLocal + // + this.btnLocalDefaultLocal.Location = new System.Drawing.Point(52, 83); + this.btnLocalDefaultLocal.Name = "btnLocalDefaultLocal"; + this.btnLocalDefaultLocal.Size = new System.Drawing.Size(314, 29); + this.btnLocalDefaultLocal.TabIndex = 4; + this.btnLocalDefaultLocal.Text = "Use C:\\GenesisLog\\"; + this.btnLocalDefaultLocal.UseVisualStyleBackColor = true; + this.btnLocalDefaultLocal.Click += new System.EventHandler(this.btnLocalDefaultLocal_Click); + // + // lblLocalPath + // + this.lblLocalPath.AutoSize = true; + this.lblLocalPath.Location = new System.Drawing.Point(121, 57); + this.lblLocalPath.Name = "lblLocalPath"; + this.lblLocalPath.Size = new System.Drawing.Size(0, 13); + this.lblLocalPath.TabIndex = 3; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(49, 57); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(66, 13); + this.label4.TabIndex = 2; + this.label4.Text = "CurrentPath:"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(13, 190); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(37, 13); + this.label3.TabIndex = 1; + this.label3.Text = "Global"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(13, 32); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(103, 13); + this.label2.TabIndex = 0; + this.label2.Text = "Local (only ToolBox)"; + // + // tabPage5 + // + this.tabPage5.Controls.Add(this.cbxSirtService868MHz); + this.tabPage5.Controls.Add(this.cbxSirtService433MHz); + this.tabPage5.Controls.Add(this.label5); + this.tabPage5.Controls.Add(this.label7); + this.tabPage5.Controls.Add(this.cbxSirtComport868MHz); + this.tabPage5.Controls.Add(this.cbxSirtComport433MHz); + this.tabPage5.Controls.Add(this.tbxSirtBoxNo); + this.tabPage5.Controls.Add(this.tbxSirtStationId); + this.tabPage5.Controls.Add(this.lblSirtComport868MHz); + this.tabPage5.Controls.Add(this.lblSirtComport433MHz); + this.tabPage5.Controls.Add(this.lblSirtBoxNo); + this.tabPage5.Controls.Add(this.lblSirtStation); + this.tabPage5.Location = new System.Drawing.Point(4, 22); + this.tabPage5.Name = "tabPage5"; + this.tabPage5.Size = new System.Drawing.Size(760, 361); + this.tabPage5.TabIndex = 4; + this.tabPage5.Text = "SIRT"; + this.tabPage5.UseVisualStyleBackColor = true; + // + // cbxSirtService868MHz + // + this.cbxSirtService868MHz.FormattingEnabled = true; + this.cbxSirtService868MHz.Location = new System.Drawing.Point(142, 164); + this.cbxSirtService868MHz.Name = "cbxSirtService868MHz"; + this.cbxSirtService868MHz.Size = new System.Drawing.Size(121, 21); + this.cbxSirtService868MHz.TabIndex = 13; + // + // cbxSirtService433MHz + // + this.cbxSirtService433MHz.FormattingEnabled = true; + this.cbxSirtService433MHz.Location = new System.Drawing.Point(142, 137); + this.cbxSirtService433MHz.Name = "cbxSirtService433MHz"; + this.cbxSirtService433MHz.Size = new System.Drawing.Size(121, 21); + this.cbxSirtService433MHz.TabIndex = 12; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(22, 168); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(114, 13); + this.label5.TabIndex = 11; + this.label5.Text = "Service Port 868 MHz:"; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(22, 140); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(114, 13); + this.label7.TabIndex = 10; + this.label7.Text = "Service Port 433 MHz:"; + // + // cbxSirtComport868MHz + // + this.cbxSirtComport868MHz.FormattingEnabled = true; + this.cbxSirtComport868MHz.Location = new System.Drawing.Point(142, 102); + this.cbxSirtComport868MHz.Name = "cbxSirtComport868MHz"; + this.cbxSirtComport868MHz.Size = new System.Drawing.Size(121, 21); + this.cbxSirtComport868MHz.TabIndex = 9; + // + // cbxSirtComport433MHz + // + this.cbxSirtComport433MHz.FormattingEnabled = true; + this.cbxSirtComport433MHz.Location = new System.Drawing.Point(142, 75); + this.cbxSirtComport433MHz.Name = "cbxSirtComport433MHz"; + this.cbxSirtComport433MHz.Size = new System.Drawing.Size(121, 21); + this.cbxSirtComport433MHz.TabIndex = 8; + // + // tbxSirtBoxNo + // + this.tbxSirtBoxNo.Location = new System.Drawing.Point(142, 44); + this.tbxSirtBoxNo.Name = "tbxSirtBoxNo"; + this.tbxSirtBoxNo.Size = new System.Drawing.Size(100, 20); + this.tbxSirtBoxNo.TabIndex = 7; + // + // tbxSirtStationId + // + this.tbxSirtStationId.Location = new System.Drawing.Point(142, 17); + this.tbxSirtStationId.Name = "tbxSirtStationId"; + this.tbxSirtStationId.Size = new System.Drawing.Size(100, 20); + this.tbxSirtStationId.TabIndex = 6; + // + // lblSirtComport868MHz + // + this.lblSirtComport868MHz.AutoSize = true; + this.lblSirtComport868MHz.Location = new System.Drawing.Point(22, 106); + this.lblSirtComport868MHz.Name = "lblSirtComport868MHz"; + this.lblSirtComport868MHz.Size = new System.Drawing.Size(103, 13); + this.lblSirtComport868MHz.TabIndex = 5; + this.lblSirtComport868MHz.Text = "RSSI Port 868 MHz:"; + // + // lblSirtComport433MHz + // + this.lblSirtComport433MHz.AutoSize = true; + this.lblSirtComport433MHz.Location = new System.Drawing.Point(22, 78); + this.lblSirtComport433MHz.Name = "lblSirtComport433MHz"; + this.lblSirtComport433MHz.Size = new System.Drawing.Size(103, 13); + this.lblSirtComport433MHz.TabIndex = 4; + this.lblSirtComport433MHz.Text = "RSSI Port 433 MHz:"; + // + // lblSirtBoxNo + // + this.lblSirtBoxNo.AutoSize = true; + this.lblSirtBoxNo.Location = new System.Drawing.Point(22, 51); + this.lblSirtBoxNo.Name = "lblSirtBoxNo"; + this.lblSirtBoxNo.Size = new System.Drawing.Size(45, 13); + this.lblSirtBoxNo.TabIndex = 3; + this.lblSirtBoxNo.Text = "Box No:"; + // + // lblSirtStation + // + this.lblSirtStation.AutoSize = true; + this.lblSirtStation.Location = new System.Drawing.Point(22, 24); + this.lblSirtStation.Name = "lblSirtStation"; + this.lblSirtStation.Size = new System.Drawing.Size(57, 13); + this.lblSirtStation.TabIndex = 2; + this.lblSirtStation.Text = "Station ID:"; + // + // FrmSetup + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(780, 671); + this.Controls.Add(this.tabControl1); + this.Controls.Add(this.btnStore); + this.Controls.Add(this.btnReload); + this.MinimumSize = new System.Drawing.Size(755, 410); + this.Name = "FrmSetup"; + this.Text = "Setup"; + this.Load += new System.EventHandler(this.FrmSetup_Load); + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvConfig)).EndInit(); + this.tabPage2.ResumeLayout(false); + this.tabPage2.PerformLayout(); + this.tabPage3.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dgvofflinePw)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.offlinePaswordItemBindingSource)).EndInit(); + this.tabPage4.ResumeLayout(false); + this.tabPage4.PerformLayout(); + this.tabPage5.ResumeLayout(false); + this.tabPage5.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Button btnReload; + private System.Windows.Forms.Button btnStore; + private System.Windows.Forms.DataGridViewTextBoxColumn pcbIDDataGridViewTextBoxColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn passwordDataGridViewTextBoxColumn; + private System.Windows.Forms.BindingSource offlinePaswordItemBindingSource; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.Button btnAddRow; + private System.Windows.Forms.DataGridView dgvConfig; + private System.Windows.Forms.DataGridViewTextBoxColumn tbcSlot; + private System.Windows.Forms.DataGridViewComboBoxColumn cbcRequestPort; + private System.Windows.Forms.DataGridViewComboBoxColumn cbcRequestType; + private System.Windows.Forms.DataGridViewComboBoxColumn cbcStreamingPort; + private System.Windows.Forms.DataGridViewCheckBoxColumn cbcSlotType; + private System.Windows.Forms.DataGridViewButtonColumn btcDetectRequest; + private System.Windows.Forms.DataGridViewButtonColumn btcDetectStreaming; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.CheckBox cbxProductionMode; + private System.Windows.Forms.CheckBox cbUpdateFiles; + private System.Windows.Forms.CheckBox cbUseMinMaxCheck; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox txtWachSeriveUrl; + private System.Windows.Forms.CheckBox cbUseRegisterWatch; + private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.Button cmdAddOffline; + private System.Windows.Forms.DataGridView dgvofflinePw; + private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn1; + private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn2; + private System.Windows.Forms.TabPage tabPage4; + private System.Windows.Forms.Button btnLocalDefaultLocal; + private System.Windows.Forms.Label lblLocalPath; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button btnLocalSearch; + private System.Windows.Forms.Button btnLocalDefaultLan; + private System.Windows.Forms.Label lblLocalCurrentPath; + private System.Windows.Forms.Label lblGlobalCurrentPath; + private System.Windows.Forms.Button btnGlobalSearch; + private System.Windows.Forms.Button btnGlobalDefaultLan; + private System.Windows.Forms.Button btnGlobalDefaultLocal; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TabPage tabPage5; + private System.Windows.Forms.Label lblSirtComport868MHz; + private System.Windows.Forms.Label lblSirtComport433MHz; + private System.Windows.Forms.Label lblSirtBoxNo; + private System.Windows.Forms.Label lblSirtStation; + private System.Windows.Forms.TextBox tbxSirtBoxNo; + private System.Windows.Forms.TextBox tbxSirtStationId; + private System.Windows.Forms.ComboBox cbxSirtComport868MHz; + private System.Windows.Forms.ComboBox cbxSirtComport433MHz; + private System.Windows.Forms.ComboBox cbxSirtService868MHz; + private System.Windows.Forms.ComboBox cbxSirtService433MHz; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label7; + } +} \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmSetup.cs b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmSetup.cs new file mode 100644 index 000000000..dee7c4502 --- /dev/null +++ b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmSetup.cs @@ -0,0 +1,862 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Data; +using System.Drawing; +using System.IO; +using System.IO.Ports; +using System.Linq; +using System.Threading; +using System.Windows.Forms; +using System.Xml.Linq; +using Xylem.Common.CommonCore.Consts; +using Xylem.Common.Hardware.Interfaces.Ports.PortCore; +using Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments; +using Xylem.Common.Hardware.Interfaces.Ports.SerialPorts; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; +using Xylem.Common.Utils.Logging; +using NLog; +using GenesisCordonelInterface.API; + +namespace GenesisCordonelInterface.UI.LaatzenAPI_GenesisToolBox +{ + /// + /// Setup of GTB + /// + public partial class FrmSetup : Form + { + private static readonly NLog.ILogger Logger = NLog.LogManager.GetLogger("GenesisCordonelInterface"); + private readonly InterfaceGCIToLaatzen interfaceToLaatzen = new InterfaceGCIToLaatzen(); + + private const String RequestPortString = "RequestPort"; + private const String RequestTypeString = "RequestType"; + private const String StreamingPortString = "StreamingPort"; + private const String SlotTypeString = "RefTemperature"; + private const String SlotString = "Slot"; + private const String StreamingDetectString = "DetectStreaming"; + private const String RequestDetectString = "DetectRequest"; + private const String ValueString = "Value"; + private const String TextString = "Text"; + + private String _fileString; + private readonly String _serialConfigFilePathName; + private readonly String _offlinePwdPathName; + private readonly DataTable _slotConfigDataTable = new DataTable(); + private readonly SirtConfig _sirtConfig = new SirtConfig(); + private readonly ProcessConfig _configuration = new ProcessConfig(); + + private ConcurrentBag _countRawData = new ConcurrentBag(); + private List _listOfOfflinePasswords = new List(); + + /// + /// Ctor + /// + public FrmSetup() + { + _serialConfigFilePathName = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "Genesis", + ProgramConfig.SerialConfigFileName); + + _offlinePwdPathName = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "Genesis", + ProgramConfig.OfflineInfoFile); + + if (!File.Exists(_offlinePwdPathName)) + { + _listOfOfflinePasswords.Add(new OfflinePasswordItem("", "")); + File.WriteAllText(_offlinePwdPathName, JsonConvert.SerializeObject(_listOfOfflinePasswords)); + } + + _slotConfigDataTable.Columns.Add(SlotString, typeof(String)); + _slotConfigDataTable.Columns.Add(StreamingPortString, typeof(String)); + _slotConfigDataTable.Columns.Add(RequestPortString, typeof(String)); + _slotConfigDataTable.Columns.Add(RequestTypeString, typeof(String)); + _slotConfigDataTable.Columns.Add(SlotTypeString, typeof(String)); + + InitializeComponent(); + + tbcSlot.Name = SlotString; + cbcRequestPort.Name = RequestPortString; + cbcRequestType.Name = RequestTypeString; + cbcStreamingPort.Name = StreamingPortString; + cbcSlotType.Name = SlotTypeString; + btcDetectStreaming.Name = StreamingDetectString; + btcDetectRequest.Name = RequestDetectString; + btcDetectStreaming.Name = StreamingDetectString; + + tbcSlot.HeaderText = SlotString; + cbcRequestPort.HeaderText = RequestPortString; + cbcRequestType.HeaderText = RequestTypeString; + cbcStreamingPort.HeaderText = StreamingPortString; + btcDetectRequest.HeaderText = RequestDetectString; + btcDetectStreaming.HeaderText = StreamingDetectString; + cbcSlotType.HeaderText = SlotTypeString; + + LoadFromFile(); + _configuration.ReadProcessConfig(); + cbUseMinMaxCheck.Checked = _configuration.UseMinMaxCheck; + cbUseRegisterWatch.Checked = _configuration.UseRegisterWatchService; + txtWachSeriveUrl.Text = _configuration.RegisterWatchServiceUrl; + cbUpdateFiles.Checked = _configuration.AutoUpdateFiles; + cbxProductionMode.Checked = _configuration.ProductionMode; + + _sirtConfig.ReadSirtConfig(); + tbxSirtStationId.Text = _sirtConfig.StationId?.ToString(); + tbxSirtBoxNo.Text = _sirtConfig.SirtBoxNo?.ToString(); + + if (_sirtConfig.SirtComport433MHz != null) + cbxSirtComport433MHz.Items.Add(_sirtConfig.SirtComport433MHz); + if (_sirtConfig.SirtComport868MHz != null) + cbxSirtComport868MHz.Items.Add(_sirtConfig.SirtComport868MHz); + + var comPorts = SerialPort.GetPortNames().ToList(); + foreach (var comPort in comPorts.Where(comPort => !cbxSirtComport433MHz.Items.Contains(comPort))) + { + cbxSirtComport433MHz.Items.Add(comPort); + } + foreach (var comPort in comPorts.Where(comPort => !cbxSirtComport868MHz.Items.Contains(comPort))) + { + cbxSirtComport868MHz.Items.Add(comPort); + } + + if (cbxSirtComport433MHz.Items.Count > 0) + cbxSirtComport433MHz.Text = cbxSirtComport433MHz.Items[0].ToString(); + if (cbxSirtComport868MHz.Items.Count > 0) + cbxSirtComport868MHz.Text = cbxSirtComport868MHz.Items[0].ToString(); + + if (_sirtConfig.ServiceSirtComport433MHz != null) + cbxSirtService433MHz.Items.Add(_sirtConfig.ServiceSirtComport433MHz); + if (_sirtConfig.ServiceSirtComport868MHz != null) + cbxSirtService868MHz.Items.Add(_sirtConfig.ServiceSirtComport868MHz); + + foreach (var comPort in comPorts.Where(comPort => !cbxSirtService433MHz.Items.Contains(comPort))) + { + cbxSirtService433MHz.Items.Add(comPort); + } + foreach (var comPort in comPorts.Where(comPort => !cbxSirtService868MHz.Items.Contains(comPort))) + { + cbxSirtService868MHz.Items.Add(comPort); + } + + if (cbxSirtService433MHz.Items.Count > 0) + cbxSirtService433MHz.Text = cbxSirtService433MHz.Items[0].ToString(); + if (cbxSirtService868MHz.Items.Count > 0) + cbxSirtService868MHz.Text = cbxSirtService868MHz.Items[0].ToString(); + + Logger.Trace("CONFIG: Setup loaded."); + } + + private void BtnReload_Click(Object sender, EventArgs e) + { + Logger.Trace("CONFIG: Reload setup requested."); + + LoadFromFile(); + LoadOfflineFile(); + + Logger.Trace("CONFIG: Setup reloaded."); + } + + private void BtnStore_Click(Object sender, EventArgs e) + { + Logger.Trace("CONFIG: Save setup requested."); + + StoreToPc(); + StoreOfflineFile(); + StoreSirtSettings(); + + Logger.Trace("CONFIG: Setup saved."); + } + + private void StoreSirtSettings() + { + if (int.TryParse(tbxSirtStationId.Text, out var intNo)) + { + _sirtConfig.StationId = intNo; + } + + if (int.TryParse(tbxSirtBoxNo.Text, out intNo)) + { + _sirtConfig.SirtBoxNo = intNo; + } + + _sirtConfig.SirtComport433MHz = cbxSirtComport433MHz.Text; + _sirtConfig.SirtComport868MHz = cbxSirtComport868MHz.Text; + _sirtConfig.ServiceSirtComport433MHz = cbxSirtService433MHz.Text; + _sirtConfig.ServiceSirtComport868MHz = cbxSirtService868MHz.Text; + + _sirtConfig.Update(); + Logger.Trace("CONFIG: SIRT settings stored."); + } + + private void StoreToPc() + { + Logger.Trace("CONFIG: Storing slot configuration to PC."); + + var newFileContent = new List(); + + for (var row = 0; row < dgvConfig.Rows.Count; row++) + { + var slotStr = (String)dgvConfig.Rows[row].Cells[SlotString].Value; + int.TryParse(slotStr, out var slot); + + var irdaType = typeof(IrdaSerialPort).FullName; + if (dgvConfig.Rows[row].Cells[RequestTypeString].Value != null) + { + irdaType = (String)dgvConfig.Rows[row].Cells[RequestTypeString].Value; + } + + var requestPort = new PortConfig() + { + PortName = (String)dgvConfig.Rows[row].Cells[RequestPortString].Value, + Type = irdaType + }; + + var streamingPort = new PortConfig() + { + PortName = (String)dgvConfig.Rows[row].Cells[StreamingPortString].Value, + Type = typeof(UartSerialPort).FullName + }; + + var slotType = SlotType.DutMeter; + + if (dgvConfig.Rows[row].Cells[SlotTypeString].Value != null) + { + var isChecked = dgvConfig.Rows[row].Cells[SlotTypeString].Value.ToString(); + if (bool.TrueString == isChecked) + { + slotType = SlotType.TemperatureMeter; + } + } + + if (!string.IsNullOrEmpty(slotStr)) + { + newFileContent.Add(new SlotConfig() + { + Slot = slot, + Request = requestPort, + Streaming = streamingPort, + Type = slotType + }); + } + } + + var text = JsonConvert.SerializeObject(newFileContent); + + if (text == _fileString) + { + Logger.Trace("CONFIG: No setup changes detected."); + LoadFromFile(); + return; + } + + if (File.Exists(_serialConfigFilePathName)) + { + var backupSerialConfigFile = + $"{Path.GetDirectoryName(_serialConfigFilePathName)}\\Backup_{DateTime.Now:yyyyMMdd}_{DateTime.Now:HHmmss}_{ProgramConfig.SerialConfigFileName}"; + File.Move(_serialConfigFilePathName, backupSerialConfigFile); + } + + File.WriteAllText(_serialConfigFilePathName, text); + LoadFromFile(); + LoadOfflineFile(); + + Logger.Trace("CONFIG: Slot configuration stored."); + } + + private void LoadFromFile() + { + Logger.Trace("CONFIG: Loading slot configuration from file."); + + _slotConfigDataTable.Clear(); + dgvConfig.Rows.Clear(); + + if (!File.Exists(_serialConfigFilePathName)) + { + Logger.Trace("CONFIG: Serial configuration file not found."); + return; + } + + SlotConfig[] meterConfigList; + using (var tr = new StreamReader(_serialConfigFilePathName)) + { + _fileString = tr.ReadToEnd(); + meterConfigList = JsonConvert.DeserializeObject(_fileString); + } + + foreach (var item in meterConfigList) + { + var row = _slotConfigDataTable.NewRow(); + row[SlotString] = item.Slot; + row[RequestPortString] = item.Request.PortName; + row[RequestTypeString] = item.Request.Type; + row[StreamingPortString] = item.Streaming.PortName; + row[SlotTypeString] = item.Type == SlotType.TemperatureMeter; + _slotConfigDataTable.Rows.Add(row); + } + + foreach (DataRow row in _slotConfigDataTable.Rows) + { + dgvConfig.Rows.Add(AddRowToGrid(row)); + } + + Logger.Trace("CONFIG: Slot configuration loaded."); + } + + private DataGridViewRow AddRowToGrid(DataRow row = null) + { + var newRow = new DataGridViewRow(); + + var slotCell = new DataGridViewTextBoxCell(); + newRow.Cells.Add(slotCell); + + var requestPortCell = new DataGridViewComboBoxCell + { + DataSource = GetPorts(), + DisplayMember = TextString, + ValueMember = ValueString + }; + newRow.Cells.Add(requestPortCell); + + var requestTypeCell = new DataGridViewComboBoxCell + { + DataSource = GetTypes(), + DisplayMember = TextString, + ValueMember = ValueString + }; + newRow.Cells.Add(requestTypeCell); + + var streamingPortCell = new DataGridViewComboBoxCell + { + DataSource = GetPorts(), + DisplayMember = TextString, + ValueMember = ValueString + }; + newRow.Cells.Add(streamingPortCell); + + var slotTypeCell = new DataGridViewCheckBoxCell(); + slotTypeCell.Value = false; + + if (row == null) + { + return newRow; + } + + slotCell.Value = row[SlotString]; + streamingPortCell.Value = row[StreamingPortString]; + requestPortCell.Value = row[RequestPortString]; + + try + { + requestTypeCell.Value = row[RequestTypeString]; + } + catch (Exception ex) + { + Logger.Error("Failed to set request type in grid: " + ex.Message); + } + + slotTypeCell.Value = row[SlotTypeString]; + newRow.Cells.Add(slotTypeCell); + return newRow; + } + + private DataTable GetSlotTypes() + { + var ret = new DataTable(); + ret.Columns.Add(TextString); + ret.Columns.Add(ValueString, typeof(Int32)); + + ret.Rows.Add("DutMeter", SlotType.DutMeter.GetHashCode()); + ret.Rows.Add("TemperatureMeter", SlotType.TemperatureMeter.GetHashCode()); + + return ret; + } + + private DataTable GetPorts() + { + var ret = new DataTable(); + ret.Columns.Add(ValueString); + ret.Columns.Add(TextString); + var portList = SerialPort.GetPortNames().ToList(); + + foreach (var item in portList) + { + ret.Rows.Add(item, item); + } + + foreach (DataRow row in _slotConfigDataTable.Rows) + { + if (portList.All(pl => pl != (String)row[StreamingPortString])) + { + ret.Rows.Add(row[StreamingPortString].ToString(), BaseSerialPort.PortNotAssigned); + } + if (portList.All(pl => pl != (String)row[RequestPortString])) + { + ret.Rows.Add(row[RequestPortString].ToString(), BaseSerialPort.PortNotAssigned); + } + } + + return ret; + } + + private static DataTable GetTypes() + { + var ret = new DataTable(); + ret.Columns.Add(ValueString); + ret.Columns.Add(TextString); + + ret.Rows.Add(typeof(UartSerialPort).FullName, nameof(UartSerialPort)); + ret.Rows.Add(typeof(RfidSerialPort).FullName, nameof(RfidSerialPort)); + ret.Rows.Add(typeof(IrdaSerialPort).FullName, nameof(IrdaSerialPort)); + + return ret; + } + + private void __DgvConfig_CellContentClick(Object sender, DataGridViewCellEventArgs e) + { + Logger.Trace("UI-CLICK: FrmSetup: DgvConfig_CellContentClick() use APILaatzen"); + + if (e.RowIndex < 0 || e.ColumnIndex < 0) + { + return; + } + + if (!dgvConfig.Columns[e.ColumnIndex].Name.Contains(StreamingDetectString) && + !dgvConfig.Columns[e.ColumnIndex].Name.Contains(RequestDetectString)) + { + return; + } + + StoreToPc(); + + var slotString = (String)dgvConfig.Rows[e.RowIndex].Cells[SlotString].Value; + int.TryParse(slotString, out var slot); + + using (var mb = new MeterBatch()) + { + using (var meter = new GenesisMeter()) + { + meter.SetupFromConfigFile(slot, false); + mb.AddMeter(meter); + + const String checkMark = "\u2714"; + + if (dgvConfig.Columns[e.ColumnIndex].Name.Contains(StreamingDetectString)) + { + Logger.Trace("COM: Detecting streaming port for slot " + slot + "..."); + + _countRawData = new ConcurrentBag(); + + meter.StreamingPort.OnRawRecordReceived += delegate (Object o, BasePortDataEventArgs rawMsg) + { + var data = (String)rawMsg.GetData(); + _countRawData.Add(data); + }; + + Thread.Sleep(500); + + if (_countRawData.Any()) + { + var text = $"SUCCESS\nSlot: {slot}\nStreaming port: {meter.StreamingPort.GetPortName()}\n\n{checkMark}"; + MessageBox.Show(text, @"SUCCESS", MessageBoxButtons.OK); + dgvConfig.Rows[e.RowIndex].Cells[StreamingDetectString].Style.BackColor = Color.Green; + + Logger.Info("COM: Streaming detection SUCCESS for slot " + slot + ", port " + meter.StreamingPort.GetPortName() + "."); + } + else + { + var text = $"FAILED\nSlot: {slot}\nStreaming port: {meter.StreamingPort.GetPortName()}"; + MessageBox.Show(text, @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error); + dgvConfig.Rows[e.RowIndex].Cells[StreamingDetectString].Style.BackColor = Color.Red; + + Logger.Error("COM: Streaming detection FAILED for slot " + slot + ", port " + meter.StreamingPort.GetPortName() + "."); + } + + _countRawData = new ConcurrentBag(); + } + else + { + meter.Logout(); + + var pcbId = meter.GetPcbId(); + + if (string.IsNullOrEmpty(pcbId)) + { + var text = $"FAILED\nSlot: {slot}\nRequest port: {meter.RequestPort.GetPortName()}"; + MessageBox.Show(text, @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error); + dgvConfig.Rows[e.RowIndex].Cells[RequestDetectString].Style.BackColor = Color.Red; + + Logger.Info("COM: Streaming detection SUCCESS for slot " + slot + ", port " + meter.StreamingPort.GetPortName() + "."); + } + else + { + var text = $"SUCCESS\nSlot: {slot}\nRequest port: {meter.RequestPort.GetPortName()}\n\n{checkMark}"; + MessageBox.Show(text, @"SUCCESS", MessageBoxButtons.OK); + dgvConfig.Rows[e.RowIndex].Cells[RequestDetectString].Style.BackColor = Color.Green; + + Logger.Error("COM: Streaming detection FAILED for slot " + slot + ", port " + meter.StreamingPort.GetPortName() + "."); + } + } + } + } + } + + private void DgvConfig_CellContentClick(object sender, DataGridViewCellEventArgs e) + { + Logger.Trace("UI-CLICK: FrmSetup: DgvConfig_CellContentClick() use API2"); + + if (e.RowIndex < 0 || e.ColumnIndex < 0) + return; + + var columnName = dgvConfig.Columns[e.ColumnIndex].Name; + + if (!columnName.Contains(StreamingDetectString) && + !columnName.Contains(RequestDetectString)) + { + return; + } + + StoreToPc(); + + var slotString = (string)dgvConfig.Rows[e.RowIndex].Cells[SlotString].Value; + if (!int.TryParse(slotString, out var slot)) + return; + + const string checkMark = "\u2714"; + + try + { + if (columnName.Contains(StreamingDetectString)) + { + Logger.Trace("COM: Detecting streaming port for slot " + slot + "..."); + + var result = interfaceToLaatzen.DetectStreamingPort(slot); + + if (result.Success) + { + var text = $"SUCCESS\nSlot: {result.Slot}\nStreaming port: {result.PortName}\n\n{checkMark}"; + MessageBox.Show(text, @"SUCCESS", MessageBoxButtons.OK); + dgvConfig.Rows[e.RowIndex].Cells[StreamingDetectString].Style.BackColor = Color.Green; + + Logger.Info("COM: Streaming detection SUCCESS for slot " + result.Slot + ", port " + result.PortName + "."); + } + else + { + var text = $"FAILED\nSlot: {result.Slot}\nStreaming port: {result.PortName}"; + MessageBox.Show(text, @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error); + dgvConfig.Rows[e.RowIndex].Cells[StreamingDetectString].Style.BackColor = Color.Red; + + Logger.Error("COM: Streaming detection FAILED for slot " + result.Slot + ", port " + result.PortName + "."); + } + } + else + { + var result = interfaceToLaatzen.DetectRequestPort(slot); + + if (result.Success) + { + var text = $"SUCCESS\nSlot: {result.Slot}\nRequest port: {result.PortName}\n\n{checkMark}"; + MessageBox.Show(text, @"SUCCESS", MessageBoxButtons.OK); + dgvConfig.Rows[e.RowIndex].Cells[RequestDetectString].Style.BackColor = Color.Green; + + Logger.Info("COM: Request detection SUCCESS for slot " + result.Slot + ", port " + result.PortName + "."); + } + else + { + var text = $"FAILED\nSlot: {result.Slot}\nRequest port: {result.PortName}"; + MessageBox.Show(text, @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error); + dgvConfig.Rows[e.RowIndex].Cells[RequestDetectString].Style.BackColor = Color.Red; + + Logger.Error("COM: Request detection FAILED for slot " + result.Slot + ", port " + result.PortName + "."); + } + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, @"ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); + Logger.Error(ex); + } + } + + private void dgvConfig_DataError(Object sender, DataGridViewDataErrorEventArgs e) + { + Logger.Error("CONFIG: DataGridView data error."); + } + + private void cbUseRegisterWatch_CheckedChanged(Object sender, EventArgs e) + { + _configuration.UseRegisterWatchService = cbUseRegisterWatch.Checked; + _configuration.Update(); + StoreToPc(); + + Logger.Trace("UseRegisterWatchService changed to " + cbUseRegisterWatch.Checked); + } + + private void cbUseMinMaxCheck_CheckedChanged(Object sender, EventArgs e) + { + _configuration.UseMinMaxCheck = cbUseMinMaxCheck.Checked; + _configuration.Update(); + StoreToPc(); + + Logger.Trace("UseMinMaxCheck changed to " + cbUseMinMaxCheck.Checked); + } + + private void textBox1_TextChanged(Object sender, EventArgs e) + { + _configuration.RegisterWatchServiceUrl = txtWachSeriveUrl.Text; + _configuration.Update(); + StoreToPc(); + + Logger.Trace("RegisterWatchServiceUrl changed."); + } + + private void cbUpdateFiles_CheckedChanged(Object sender, EventArgs e) + { + _configuration.AutoUpdateFiles = cbUpdateFiles.Checked; + _configuration.Update(); + StoreToPc(); + + Logger.Trace("CONFIG: AutoUpdateFiles changed to " + cbUpdateFiles.Checked); + } + + private void FrmSetup_Load(Object sender, EventArgs e) + { + LoadOfflineFile(); + cbxProductionMode.CheckedChanged += cbxProductionMode_CheckedChanged; + + Logger.Trace("FORM: FrmSetup loaded."); + } + + private void StoreOfflineFile() + { + try + { + var listToRemove = _listOfOfflinePasswords.Where(offlinePwd => string.IsNullOrEmpty(offlinePwd.PcbID)).ToList(); + foreach (var itemToRemove in listToRemove) + { + _listOfOfflinePasswords.Remove(itemToRemove); + } + _listOfOfflinePasswords.Add(new OfflinePasswordItem("", "")); + + File.WriteAllText(_offlinePwdPathName, JsonConvert.SerializeObject(_listOfOfflinePasswords)); + dgvofflinePw.CellValidated -= dgvofflinePw_CellValidated; + dgvofflinePw.DataSource = null; + dgvofflinePw.DataSource = _listOfOfflinePasswords; + dgvofflinePw.CellValidated += dgvofflinePw_CellValidated; + + Logger.Trace("CONFIG: Offline password file stored."); + } + catch (Exception ex) + { + Logger.Error("CONFIG: Failed to store offline password file: " + ex.Message); + } + } + + private void LoadOfflineFile() + { + try + { + _listOfOfflinePasswords = JsonConvert.DeserializeObject>(File.ReadAllText(_offlinePwdPathName)); + } + catch (Exception ex) + { + _listOfOfflinePasswords = new List(); + Logger.Error("CONFIG: Failed to load offline password file. New empty list created. " + ex.Message); + } + finally + { + if (!_listOfOfflinePasswords.Any()) + { + _listOfOfflinePasswords.Add(new OfflinePasswordItem("", "")); + } + + dgvofflinePw.CellValidated -= dgvofflinePw_CellValidated; + dgvofflinePw.DataSource = null; + dgvofflinePw.DataSource = _listOfOfflinePasswords; + dgvofflinePw.CellValidated += dgvofflinePw_CellValidated; + + Logger.Trace("CONFIG: Offline password file loaded."); + } + } + + private void dgvofflinePw_CellValidated(Object sender, DataGridViewCellEventArgs e) + { + StoreOfflineFile(); + } + + private void cmdAddOffline_Click(Object sender, EventArgs e) + { + _listOfOfflinePasswords.Add(new OfflinePasswordItem("", "")); + + dgvofflinePw.DataSource = null; + dgvofflinePw.DataSource = _listOfOfflinePasswords; + + Logger.Trace("TABLE: Offline password row added."); + } + + private void cbxProductionMode_CheckedChanged(Object sender, EventArgs e) + { + if (cbxProductionMode.Checked) + { + MessageBox.Show(@"Production mode! Configuration.json has to be the latest! "); + } + else + { + MessageBox.Show("Developer mode! Configuration.json can be exchanged on individual requirements.\n" + + "\nRISK:\n" + + "- Register ranges cannot be checked\n" + + "- Register may not be able to access"); + } + + _configuration.ProductionMode = cbxProductionMode.Checked; + _configuration.Update(); + StoreToPc(); + + Logger.Trace("CHECKBOX: ProductionMode changed to " + cbxProductionMode.Checked); + } + + private void tabPage4_Click(Object sender, EventArgs e) + { + Logger.Trace("TABPAGE4: Logging tab opened."); + + try + { + var path = NLogHelper.GetCurrentApplicationFolder(); + var a = XElement.Load(path); + lblLocalCurrentPath.Text = a.Elements() + .First(s => s.Name.LocalName == "variable") + .Attributes() + .First(s => s.Value == "BasePath") + .NextAttribute.Value; + } + catch (Exception ex) + { + lblLocalCurrentPath.Text = ex.Message; + Logger.Error("TABPAGE4: Failed to read local NLog path: " + ex.Message); + } + + try + { + var path = NLogHelper.GetApplicationDataPath(); + var b = XElement.Load(path); + lblGlobalCurrentPath.Text = b.Elements() + .First(s => s.Name.LocalName == "variable") + .Attributes() + .First(s => s.Value == "BasePath") + .NextAttribute.Value; + } + catch (Exception ex) + { + lblGlobalCurrentPath.Text = ex.Message; + Logger.Error("TABPAGE4: Failed to read global NLog path: " + ex.Message); + } + } + + private void Add(String path, String newDest) + { + try + { + var a = XElement.Load(path); + var firstIsVariable = a.Elements().First(); + + if (firstIsVariable.Name.LocalName != "variable") + { + var newElm = new XElement("variable", null); + newElm.SetAttributeValue("name", "BasePath"); + newElm.SetAttributeValue("value", newDest); + a.AddFirst(newElm); + } + else if (a.Elements().First(b => b.Name.LocalName == "variable").Attributes() + .All(s => s.Value != "BasePath")) + { + var newElm = new XElement("variable", null); + newElm.SetAttributeValue("name", "BasePath"); + newElm.SetAttributeValue("value", newDest); + a.AddFirst(newElm); + } + else + { + a.Elements().First(b => b.Name.LocalName == "variable").Attributes() + .First(s => s.Value == "BasePath").NextAttribute.Value = newDest; + } + + a.Save(path); + tabPage4_Click(this, null); + + Logger.Trace("Log path updated to: " + newDest); + } + catch (Exception ex) + { + Logger.Trace("Failed to update log path: " + ex.Message); + } + } + + private void btnLocalDefaultLocal_Click(Object sender, EventArgs e) + { + Add(NLogHelper.GetCurrentApplicationFolder(), "C:\\GenesisLog\\"); + Logger.Trace("Local log path set to default local."); + } + + private void btnLocalDefaultLan_Click(Object sender, EventArgs e) + { + Add(NLogHelper.GetCurrentApplicationFolder(), "\\\\sla12buma\\cordonelds$\\${machinename}"); + Logger.Trace("Local log path set to default LAN."); + } + + private void btnGlobalDefaultLocal_Click(Object sender, EventArgs e) + { + Add(NLogHelper.GetApplicationDataPath(), "C:\\GenesisLog\\"); + Logger.Trace("Global log path set to default local."); + } + + private void btnGlobalDefaultLan_Click(Object sender, EventArgs e) + { + Add(NLogHelper.GetApplicationDataPath(), "\\\\sla12buma\\cordonelds$\\${{machinename}}"); + Logger.Trace("Global log path set to default LAN."); + } + + private void btnGlobalSearch_Click(Object sender, EventArgs e) + { + var dia = new FolderBrowserDialog(); + dia.ShowDialog(); + + Add(NLogHelper.GetApplicationDataPath(), dia.SelectedPath); + Logger.Trace("Global log path selected by search dialog."); + } + + private void btnLocalSearch_Click(Object sender, EventArgs e) + { + var dia = new FolderBrowserDialog(); + dia.ShowDialog(); + + Add(NLogHelper.GetCurrentApplicationFolder(), dia.SelectedPath); + Logger.Trace("Local log path selected by search dialog."); + } + + private void btnAddRow_Click(Object sender, EventArgs e) + { + dgvConfig.Rows.Add(AddRowToGrid()); + Logger.Trace("TABLE: New slot row added."); + } + + public class OfflinePasswordItem + { + public OfflinePasswordItem() + { + } + + public OfflinePasswordItem(String pcbID, String password) + { + PcbID = pcbID; + Password = password; + } + + public String PcbID { get; set; } + public String Password { get; set; } + } + } +} \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmSetup.resx b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmSetup.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmSetup.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/MainForm.Designer.cs b/GenesisCordonelInterface/UI/MainForm.Designer.cs new file mode 100644 index 000000000..1185f1038 --- /dev/null +++ b/GenesisCordonelInterface/UI/MainForm.Designer.cs @@ -0,0 +1,333 @@ +namespace GenesisCordonelInterface.UI +{ + partial class MainForm + { + private System.ComponentModel.IContainer components = null; + + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem miFile; + private System.Windows.Forms.ToolStripMenuItem miExit; + private System.Windows.Forms.ToolStripMenuItem miView; + private System.Windows.Forms.ToolStripMenuItem miClearLog; + private System.Windows.Forms.ToolStripMenuItem miHelp; + private System.Windows.Forms.ToolStripMenuItem miHelpAbout; + + private System.Windows.Forms.Panel pnlLeftMenu; + private System.Windows.Forms.Panel pnlMain; + private System.Windows.Forms.RichTextBox rtbMainLog; + + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripStatusLabel tslStatus; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.miFile = new System.Windows.Forms.ToolStripMenuItem(); + this.miExit = new System.Windows.Forms.ToolStripMenuItem(); + this.miView = new System.Windows.Forms.ToolStripMenuItem(); + this.miClearLog = new System.Windows.Forms.ToolStripMenuItem(); + this.miHelp = new System.Windows.Forms.ToolStripMenuItem(); + this.miHelpAbout = new System.Windows.Forms.ToolStripMenuItem(); + this.pnlLeftMenu = new System.Windows.Forms.Panel(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.preadjustmentButton = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.btnPulseSetup = new System.Windows.Forms.Button(); + this.btnSetup = new System.Windows.Forms.Button(); + this.btnRegisterStore = new System.Windows.Forms.Button(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.pnlMain = new System.Windows.Forms.Panel(); + this.rtbMainLog = new System.Windows.Forms.RichTextBox(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.tslStatus = new System.Windows.Forms.ToolStripStatusLabel(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.button1 = new System.Windows.Forms.Button(); + this.menuStrip1.SuspendLayout(); + this.pnlLeftMenu.SuspendLayout(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.pnlMain.SuspendLayout(); + this.statusStrip1.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.SuspendLayout(); + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.miFile, + this.miView, + this.miHelp}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Padding = new System.Windows.Forms.Padding(5, 2, 0, 2); + this.menuStrip1.Size = new System.Drawing.Size(1309, 24); + this.menuStrip1.TabIndex = 0; + this.menuStrip1.Text = "menuStrip1"; + // + // miFile + // + this.miFile.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.miExit}); + this.miFile.Name = "miFile"; + this.miFile.Size = new System.Drawing.Size(37, 20); + this.miFile.Text = "File"; + // + // miExit + // + this.miExit.Name = "miExit"; + this.miExit.Size = new System.Drawing.Size(92, 22); + this.miExit.Text = "Exit"; + this.miExit.Click += new System.EventHandler(this.miExit_Click); + // + // miView + // + this.miView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.miClearLog}); + this.miView.Name = "miView"; + this.miView.Size = new System.Drawing.Size(44, 20); + this.miView.Text = "View"; + // + // miClearLog + // + this.miClearLog.Name = "miClearLog"; + this.miClearLog.Size = new System.Drawing.Size(124, 22); + this.miClearLog.Text = "Clear Log"; + this.miClearLog.Click += new System.EventHandler(this.miClearLog_Click); + // + // miHelp + // + this.miHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.miHelpAbout}); + this.miHelp.Name = "miHelp"; + this.miHelp.Size = new System.Drawing.Size(44, 20); + this.miHelp.Text = "Help"; + // + // miHelpAbout + // + this.miHelpAbout.Name = "miHelpAbout"; + this.miHelpAbout.Size = new System.Drawing.Size(107, 22); + this.miHelpAbout.Text = "About"; + this.miHelpAbout.Click += new System.EventHandler(this.miHelpAbout_Click); + // + // pnlLeftMenu + // + this.pnlLeftMenu.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pnlLeftMenu.Controls.Add(this.tabControl1); + this.pnlLeftMenu.Dock = System.Windows.Forms.DockStyle.Left; + this.pnlLeftMenu.Location = new System.Drawing.Point(0, 24); + this.pnlLeftMenu.Name = "pnlLeftMenu"; + this.pnlLeftMenu.Size = new System.Drawing.Size(190, 474); + this.pnlLeftMenu.TabIndex = 1; + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Location = new System.Drawing.Point(3, 5); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(186, 464); + this.tabControl1.TabIndex = 4; + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.groupBox2); + this.tabPage1.Controls.Add(this.groupBox1); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(178, 438); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "Laatzen API"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.preadjustmentButton); + this.groupBox2.Location = new System.Drawing.Point(6, 190); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(166, 66); + this.groupBox2.TabIndex = 5; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "CordonelPreadjustmentUI"; + // + // preadjustmentButton + // + this.preadjustmentButton.Location = new System.Drawing.Point(6, 19); + this.preadjustmentButton.Name = "preadjustmentButton"; + this.preadjustmentButton.Size = new System.Drawing.Size(153, 35); + this.preadjustmentButton.TabIndex = 3; + this.preadjustmentButton.Text = "Preadjustment"; + this.preadjustmentButton.UseVisualStyleBackColor = true; + this.preadjustmentButton.Click += new System.EventHandler(this.preadjustmentButton_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.btnPulseSetup); + this.groupBox1.Controls.Add(this.btnSetup); + this.groupBox1.Controls.Add(this.btnRegisterStore); + this.groupBox1.Location = new System.Drawing.Point(6, 17); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(166, 153); + this.groupBox1.TabIndex = 4; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "GenesisToolBox"; + // + // btnPulseSetup + // + this.btnPulseSetup.Location = new System.Drawing.Point(7, 101); + this.btnPulseSetup.Name = "btnPulseSetup"; + this.btnPulseSetup.Size = new System.Drawing.Size(153, 35); + this.btnPulseSetup.TabIndex = 2; + this.btnPulseSetup.Text = "Pulse Setup"; + this.btnPulseSetup.UseVisualStyleBackColor = true; + this.btnPulseSetup.Click += new System.EventHandler(this.btnPulseSetup_Click); + // + // btnSetup + // + this.btnSetup.Location = new System.Drawing.Point(7, 19); + this.btnSetup.Name = "btnSetup"; + this.btnSetup.Size = new System.Drawing.Size(153, 35); + this.btnSetup.TabIndex = 0; + this.btnSetup.Text = "Setup"; + this.btnSetup.UseVisualStyleBackColor = true; + this.btnSetup.Click += new System.EventHandler(this.btnSetup_Click); + // + // btnRegisterStore + // + this.btnRegisterStore.Location = new System.Drawing.Point(7, 60); + this.btnRegisterStore.Name = "btnRegisterStore"; + this.btnRegisterStore.Size = new System.Drawing.Size(153, 35); + this.btnRegisterStore.TabIndex = 1; + this.btnRegisterStore.Text = "Register Store"; + this.btnRegisterStore.UseVisualStyleBackColor = true; + this.btnRegisterStore.Click += new System.EventHandler(this.btnRegisterStore_Click); + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.groupBox3); + this.tabPage2.Location = new System.Drawing.Point(4, 22); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(3); + this.tabPage2.Size = new System.Drawing.Size(178, 438); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "GCI API"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // pnlMain + // + this.pnlMain.Controls.Add(this.rtbMainLog); + this.pnlMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlMain.Location = new System.Drawing.Point(190, 24); + this.pnlMain.Name = "pnlMain"; + this.pnlMain.Padding = new System.Windows.Forms.Padding(9); + this.pnlMain.Size = new System.Drawing.Size(1119, 474); + this.pnlMain.TabIndex = 2; + // + // rtbMainLog + // + this.rtbMainLog.Dock = System.Windows.Forms.DockStyle.Fill; + this.rtbMainLog.Font = new System.Drawing.Font("Consolas", 10F); + this.rtbMainLog.Location = new System.Drawing.Point(9, 9); + this.rtbMainLog.Name = "rtbMainLog"; + this.rtbMainLog.ReadOnly = true; + this.rtbMainLog.Size = new System.Drawing.Size(1101, 456); + this.rtbMainLog.TabIndex = 0; + this.rtbMainLog.Text = ""; + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tslStatus}); + this.statusStrip1.Location = new System.Drawing.Point(0, 498); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Padding = new System.Windows.Forms.Padding(1, 0, 12, 0); + this.statusStrip1.Size = new System.Drawing.Size(1309, 22); + this.statusStrip1.TabIndex = 3; + this.statusStrip1.Text = "statusStrip1"; + // + // tslStatus + // + this.tslStatus.Name = "tslStatus"; + this.tslStatus.Size = new System.Drawing.Size(39, 17); + this.tslStatus.Text = "Ready"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.button1); + this.groupBox3.Location = new System.Drawing.Point(6, 15); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(166, 66); + this.groupBox3.TabIndex = 6; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "GenesisCordonelInterface"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(6, 19); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(153, 35); + this.button1.TabIndex = 3; + this.button1.Text = "API"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1309, 520); + this.Controls.Add(this.pnlMain); + this.Controls.Add(this.pnlLeftMenu); + this.Controls.Add(this.statusStrip1); + this.Controls.Add(this.menuStrip1); + this.MainMenuStrip = this.menuStrip1; + this.MinimumSize = new System.Drawing.Size(774, 439); + this.Name = "MainForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Genesis Cordonel Interface"; + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.pnlLeftMenu.ResumeLayout(false); + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.tabPage2.ResumeLayout(false); + this.pnlMain.ResumeLayout(false); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.Button btnSetup; + private System.Windows.Forms.Button preadjustmentButton; + private System.Windows.Forms.Button btnRegisterStore; + private System.Windows.Forms.Button btnPulseSetup; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Button button1; + } +} \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/MainForm.cs b/GenesisCordonelInterface/UI/MainForm.cs new file mode 100644 index 000000000..3509b7d64 --- /dev/null +++ b/GenesisCordonelInterface/UI/MainForm.cs @@ -0,0 +1,290 @@ +using GenesisCordonelInterface.UI.LaatzenAPI_CordonelPreadjustmentUI; +using GenesisCordonelInterface.UI.StaraTuraAPI_GenesisCordonelInterface; +using System; +using System.Drawing; +using System.Linq; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using Xylem.Common.Ui.GenesisToolBox; +using Xylem.Common.Utils.Logging; + +namespace GenesisCordonelInterface.UI +{ + public partial class MainForm : Form + { + private static readonly NLog.ILogger Logger = NLog.LogManager.GetLogger("GenesisCordonelInterface"); + private static readonly Regex LogLevelRegex = new Regex(@"\|\s*(TRACE|DEBUG|INFO|WARN|ERROR|FATAL)\s*\|", RegexOptions.Compiled | RegexOptions.IgnoreCase); + + public MainForm() + { + InitializeComponent(); + + /*_logger = logger; + _logger.MessagePublished += OnLogMessagePublished;*/ + UiLogBus.MessageReceived += UiLogBus_MessageReceived; + + //TopRight position on screen + this.StartPosition = FormStartPosition.Manual; + this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - this.Width, 0); + + //black background + rtbMainLog.BackColor = Color.Black; + rtbMainLog.ForeColor = Color.Gainsboro; + rtbMainLog.Font = new Font("Consolas", 9f); + rtbMainLog.ReadOnly = true; + rtbMainLog.HideSelection = false; + } + + private void UiLogBus_MessageReceived(string msg) + { + if (InvokeRequired) + { + BeginInvoke(new Action(UiLogBus_MessageReceived), msg); + return; + } + + string[] lines = msg.Replace("\r\n", "\n").Split('\n'); + + foreach (string originalLine in lines) + { + if (string.IsNullOrWhiteSpace(originalLine)) + continue; + + string line = originalLine; + + // Find header (timestamp|LEVEL|) + Match m = LogLevelRegex.Match(line); + + string indent = ""; + if (m.Success) + { + int indentLength = m.Index + m.Length; + indent = new string(' ', indentLength); + } + + // Split long message manually if needed (optional) + string[] subLines = line.Split(new[] { " - " }, 2, StringSplitOptions.None); + + string firstLine = line; + string rest = null; + + if (subLines.Length == 2 && subLines[1].Length > 120) // heuristic + { + firstLine = subLines[0] + " - " + subLines[1].Substring(0, 120); + rest = subLines[1].Substring(120); + } + + AppendStyledLine(firstLine); + + if (!string.IsNullOrEmpty(rest)) + { + AppendStyledLine(indent + rest); + } + } + } + + private void AppendStyledLine(string line) + { + int start = rtbMainLog.TextLength; + + rtbMainLog.SelectionStart = start; + rtbMainLog.SelectionLength = 0; + rtbMainLog.SelectionColor = Color.Gainsboro; + rtbMainLog.AppendText(line + Environment.NewLine); + + Match m = LogLevelRegex.Match(line); + if (m.Success) + { + rtbMainLog.SelectionStart = start + m.Index; + rtbMainLog.SelectionLength = m.Length; + rtbMainLog.SelectionColor = GetLogLevelColor(m.Groups[1].Value); + } + + HighlightKeywordsInLine(line, start); + } + + private int MeasureTextWidthPx(string text) + { + if (string.IsNullOrEmpty(text)) + return 0; + + return TextRenderer.MeasureText(text, rtbMainLog.Font).Width; + } + + protected override void OnFormClosed(FormClosedEventArgs e) + { + //_logger.MessagePublished -= OnLogMessagePublished; + UiLogBus.MessageReceived -= UiLogBus_MessageReceived; + base.OnFormClosed(e); + } + + private void btnSetup_Click(object sender, EventArgs e) + { + Logger.Trace("FORM: ---------------------------------"); + Logger.Trace("FORM: Setup open"); + + using (FrmSetup frm = new FrmSetup()) + { + frm.ShowDialog(this); + } + + Logger.Trace("FORM: Setup closed."); + } + + private void btnRegisterStore_Click(object sender, EventArgs e) + { + Logger.Trace("FORM: ---------------------------------"); + Logger.Trace("FORM: Register Store open."); + + + using (FrmRegisterStore frm = new FrmRegisterStore()) + { + frm.ShowDialog(this); + } + + Logger.Trace("FORM: Register Store closed."); + } + + private void btnPulseSetup_Click(object sender, EventArgs e) + { + Logger.Trace("FORM: ---------------------------------"); + Logger.Trace("FORM: Pulse Setup open."); + + + using (FrmConfigurations frm = new FrmConfigurations()) + { + frm.ShowDialog(this); + } + + Logger.Trace("FORM: Pulse Setup closed."); + } + + private void miExit_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void miClearLog_Click(object sender, EventArgs e) + { + rtbMainLog.Clear(); + Logger.Trace("Log cleared."); + } + + private void miHelpAbout_Click(object sender, EventArgs e) + { + MessageBox.Show( + "Genesis Cordonel Tester", + "About", + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + + private Color GetLogLevelColor(string level) + { + switch (level.Trim().ToUpperInvariant()) + { + case "TRACE": return Color.Gray; + case "DEBUG": return Color.DeepSkyBlue; + case "INFO": return Color.LimeGreen; + case "WARN": return Color.Orange; + case "ERROR": return Color.Red; + case "FATAL": return Color.Magenta; + default: return Color.Gainsboro; + } + } + + private bool IsSeparatorLine(string text) + { + if (string.IsNullOrWhiteSpace(text)) + return false; + + string trimmed = text.Trim(); + + // Remove spaces and tab-like spacing + string compact = new string(trimmed.Where(c => !char.IsWhiteSpace(c)).ToArray()); + + if (compact.Length < 4) + return false; + + // Count non-letter/non-digit characters + int nonAlnumCount = compact.Count(c => !char.IsLetterOrDigit(c)); + + // Consider it a separator if most characters are non-alphanumeric + // Examples: + // -----CommandToMeter()----- + // ========================== + // ///////// + double ratio = (double)nonAlnumCount / compact.Length; + + return ratio >= 0.6; + } + + /// + /// special string highlighting + /// "TX FINAL" have to go before "TX" + /// else "TX" will highlighted in the middle of "TX FINAL" + /// + private static readonly (Color color, string[] keywords)[] KeywordGroups = + { + (Color.DeepSkyBlue, new[] { "REQUEST" }), + (Color.Lime, new[] { "RESPONSE" }), + //(Color.LightGreen, new[] { "START", "END" }), + //(Color.Cyan, new[] { "TX", "TX FINAL" }), + //(Color.DeepSkyBlue,new[] { "RX", "RX FINAL", "RX CHUNK" }), + (Color.Gold, new[] { "READ-REGISTER-SESSION", "UI-CLICK"}), + //(Color.Violet, new[] { "REGADDR" }), + //(Color.Khaki, new[] { "DEFAULT", "ALIGNED", "STRING" }) + }; + + /// + /// special string highlighting + /// + /// + /// + private void HighlightKeywordsInLine(string line, int lineStartIndex) + { + foreach (var group in KeywordGroups) + { + foreach (var keyword in group.keywords) + { + int index = 0; + + while ((index = line.IndexOf(keyword, index, StringComparison.Ordinal)) >= 0) + { + rtbMainLog.SelectionStart = lineStartIndex + index; + rtbMainLog.SelectionLength = keyword.Length; + rtbMainLog.SelectionColor = group.color; + + index += keyword.Length; + } + } + } + } + + private void preadjustmentButton_Click(object sender, EventArgs e) + { + Logger.Trace("FORM: ---------------------------------"); + Logger.Trace("FORM: Preadjustment open."); + + using (FrmCordonelPreadjustmentUI frm = new FrmCordonelPreadjustmentUI()) + { + frm.ShowDialog(this); + } + + Logger.Trace("FORM: Preadjustment closed."); + } + + private void button1_Click(object sender, EventArgs e) + { + Logger.Trace("FORM: ---------------------------------"); + Logger.Trace("FORM: GCI GUI interface open."); + + using (FrmGCIAPI frm = new FrmGCIAPI()) + { + frm.ShowDialog(this); + } + + Logger.Trace("FORM: GCI GUI interface closed."); + } + } +} \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/MainForm.resx b/GenesisCordonelInterface/UI/MainForm.resx new file mode 100644 index 000000000..b624c9cc7 --- /dev/null +++ b/GenesisCordonelInterface/UI/MainForm.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 132, 17 + + + 65 + + \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/FrmGCIAPI.Designer.cs b/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/FrmGCIAPI.Designer.cs new file mode 100644 index 000000000..781298ad1 --- /dev/null +++ b/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/FrmGCIAPI.Designer.cs @@ -0,0 +1,383 @@ +namespace GenesisCordonelInterface.UI.StaraTuraAPI_GenesisCordonelInterface +{ + partial class FrmGCIAPI + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support. + /// + private void InitializeComponent() + { + this.lblSlot = new System.Windows.Forms.Label(); + this.txtSlot = new System.Windows.Forms.TextBox(); + this.lblConfigSource = new System.Windows.Forms.Label(); + this.cmbConfigSource = new System.Windows.Forms.ComboBox(); + this.lblPasswordSource = new System.Windows.Forms.Label(); + this.cmbPasswordSource = new System.Windows.Forms.ComboBox(); + this.lblRequestPort = new System.Windows.Forms.Label(); + this.txtRequestPort = new System.Windows.Forms.TextBox(); + this.lblRequestBaudRate = new System.Windows.Forms.Label(); + this.txtRequestBaudRate = new System.Windows.Forms.TextBox(); + this.lblStreamingPort = new System.Windows.Forms.Label(); + this.txtStreamingPort = new System.Windows.Forms.TextBox(); + this.lblStreamingBaudRate = new System.Windows.Forms.Label(); + this.txtStreamingBaudRate = new System.Windows.Forms.TextBox(); + this.lblRegister = new System.Windows.Forms.Label(); + this.txtRegister = new System.Windows.Forms.TextBox(); + this.lblValue = new System.Windows.Forms.Label(); + this.txtValue = new System.Windows.Forms.TextBox(); + this.lblPassword = new System.Windows.Forms.Label(); + this.txtPassword = new System.Windows.Forms.TextBox(); + this.btnInit = new System.Windows.Forms.Button(); + this.btnConnectOne = new System.Windows.Forms.Button(); + this.btnConnectAll = new System.Windows.Forms.Button(); + this.btnDisconnect = new System.Windows.Forms.Button(); + this.btnGetPcbId = new System.Windows.Forms.Button(); + this.btnReadRegister = new System.Windows.Forms.Button(); + this.btnWriteRegister = new System.Windows.Forms.Button(); + this.btnSetPassword = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblSlot + // + this.lblSlot.AutoSize = true; + this.lblSlot.Location = new System.Drawing.Point(20, 20); + this.lblSlot.Name = "lblSlot"; + this.lblSlot.Size = new System.Drawing.Size(28, 13); + this.lblSlot.TabIndex = 0; + this.lblSlot.Text = "Slot:"; + // + // txtSlot + // + this.txtSlot.Location = new System.Drawing.Point(150, 17); + this.txtSlot.Name = "txtSlot"; + this.txtSlot.Size = new System.Drawing.Size(120, 20); + this.txtSlot.TabIndex = 1; + this.txtSlot.Text = "1"; + // + // lblConfigSource + // + this.lblConfigSource.AutoSize = true; + this.lblConfigSource.Location = new System.Drawing.Point(20, 55); + this.lblConfigSource.Name = "lblConfigSource"; + this.lblConfigSource.Size = new System.Drawing.Size(75, 13); + this.lblConfigSource.TabIndex = 2; + this.lblConfigSource.Text = "ConfigSource:"; + // + // cmbConfigSource + // + this.cmbConfigSource.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbConfigSource.FormattingEnabled = true; + this.cmbConfigSource.Location = new System.Drawing.Point(150, 52); + this.cmbConfigSource.Name = "cmbConfigSource"; + this.cmbConfigSource.Size = new System.Drawing.Size(180, 21); + this.cmbConfigSource.TabIndex = 3; + // + // lblPasswordSource + // + this.lblPasswordSource.AutoSize = true; + this.lblPasswordSource.Location = new System.Drawing.Point(20, 90); + this.lblPasswordSource.Name = "lblPasswordSource"; + this.lblPasswordSource.Size = new System.Drawing.Size(88, 13); + this.lblPasswordSource.TabIndex = 4; + this.lblPasswordSource.Text = "PasswordSource:"; + // + // cmbPasswordSource + // + this.cmbPasswordSource.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbPasswordSource.FormattingEnabled = true; + this.cmbPasswordSource.Location = new System.Drawing.Point(150, 87); + this.cmbPasswordSource.Name = "cmbPasswordSource"; + this.cmbPasswordSource.Size = new System.Drawing.Size(180, 21); + this.cmbPasswordSource.TabIndex = 5; + // + // lblRequestPort + // + this.lblRequestPort.AutoSize = true; + this.lblRequestPort.Location = new System.Drawing.Point(20, 125); + this.lblRequestPort.Name = "lblRequestPort"; + this.lblRequestPort.Size = new System.Drawing.Size(67, 13); + this.lblRequestPort.TabIndex = 6; + this.lblRequestPort.Text = "RequestPort:"; + // + // txtRequestPort + // + this.txtRequestPort.Location = new System.Drawing.Point(150, 122); + this.txtRequestPort.Name = "txtRequestPort"; + this.txtRequestPort.Size = new System.Drawing.Size(180, 20); + this.txtRequestPort.TabIndex = 7; + this.txtRequestPort.Text = "COM1"; + // + // lblRequestBaudRate + // + this.lblRequestBaudRate.AutoSize = true; + this.lblRequestBaudRate.Location = new System.Drawing.Point(360, 125); + this.lblRequestBaudRate.Name = "lblRequestBaudRate"; + this.lblRequestBaudRate.Size = new System.Drawing.Size(94, 13); + this.lblRequestBaudRate.TabIndex = 8; + this.lblRequestBaudRate.Text = "RequestBaudRate:"; + // + // txtRequestBaudRate + // + this.txtRequestBaudRate.Location = new System.Drawing.Point(480, 122); + this.txtRequestBaudRate.Name = "txtRequestBaudRate"; + this.txtRequestBaudRate.Size = new System.Drawing.Size(120, 20); + this.txtRequestBaudRate.TabIndex = 9; + this.txtRequestBaudRate.Text = "115200"; + // + // lblStreamingPort + // + this.lblStreamingPort.AutoSize = true; + this.lblStreamingPort.Location = new System.Drawing.Point(20, 160); + this.lblStreamingPort.Name = "lblStreamingPort"; + this.lblStreamingPort.Size = new System.Drawing.Size(74, 13); + this.lblStreamingPort.TabIndex = 10; + this.lblStreamingPort.Text = "StreamingPort:"; + // + // txtStreamingPort + // + this.txtStreamingPort.Location = new System.Drawing.Point(150, 157); + this.txtStreamingPort.Name = "txtStreamingPort"; + this.txtStreamingPort.Size = new System.Drawing.Size(180, 20); + this.txtStreamingPort.TabIndex = 11; + this.txtStreamingPort.Text = "COM2"; + // + // lblStreamingBaudRate + // + this.lblStreamingBaudRate.AutoSize = true; + this.lblStreamingBaudRate.Location = new System.Drawing.Point(360, 160); + this.lblStreamingBaudRate.Name = "lblStreamingBaudRate"; + this.lblStreamingBaudRate.Size = new System.Drawing.Size(101, 13); + this.lblStreamingBaudRate.TabIndex = 12; + this.lblStreamingBaudRate.Text = "StreamingBaudRate:"; + // + // txtStreamingBaudRate + // + this.txtStreamingBaudRate.Location = new System.Drawing.Point(480, 157); + this.txtStreamingBaudRate.Name = "txtStreamingBaudRate"; + this.txtStreamingBaudRate.Size = new System.Drawing.Size(120, 20); + this.txtStreamingBaudRate.TabIndex = 13; + this.txtStreamingBaudRate.Text = "115200"; + // + // lblRegister + // + this.lblRegister.AutoSize = true; + this.lblRegister.Location = new System.Drawing.Point(20, 195); + this.lblRegister.Name = "lblRegister"; + this.lblRegister.Size = new System.Drawing.Size(49, 13); + this.lblRegister.TabIndex = 14; + this.lblRegister.Text = "Register:"; + // + // txtRegister + // + this.txtRegister.Location = new System.Drawing.Point(150, 192); + this.txtRegister.Name = "txtRegister"; + this.txtRegister.Size = new System.Drawing.Size(450, 20); + this.txtRegister.TabIndex = 15; + this.txtRegister.Text = "GENESISFLOW_TriggerTest"; + // + // lblValue + // + this.lblValue.AutoSize = true; + this.lblValue.Location = new System.Drawing.Point(20, 230); + this.lblValue.Name = "lblValue"; + this.lblValue.Size = new System.Drawing.Size(37, 13); + this.lblValue.TabIndex = 16; + this.lblValue.Text = "Value:"; + // + // txtValue + // + this.txtValue.Location = new System.Drawing.Point(150, 227); + this.txtValue.Name = "txtValue"; + this.txtValue.Size = new System.Drawing.Size(450, 20); + this.txtValue.TabIndex = 17; + this.txtValue.Text = "1"; + // + // lblPassword + // + this.lblPassword.AutoSize = true; + this.lblPassword.Location = new System.Drawing.Point(20, 265); + this.lblPassword.Name = "lblPassword"; + this.lblPassword.Size = new System.Drawing.Size(56, 13); + this.lblPassword.TabIndex = 18; + this.lblPassword.Text = "Password:"; + // + // txtPassword + // + this.txtPassword.Location = new System.Drawing.Point(150, 262); + this.txtPassword.Name = "txtPassword"; + this.txtPassword.Size = new System.Drawing.Size(450, 20); + this.txtPassword.TabIndex = 19; + this.txtPassword.Text = "1234"; + // + // btnInit + // + this.btnInit.Location = new System.Drawing.Point(23, 310); + this.btnInit.Name = "btnInit"; + this.btnInit.Size = new System.Drawing.Size(180, 32); + this.btnInit.TabIndex = 20; + this.btnInit.Text = "Init One Meter From Extern"; + this.btnInit.UseVisualStyleBackColor = true; + this.btnInit.Click += new System.EventHandler(this.btnInit_Click); + // + // btnConnectOne + // + this.btnConnectOne.Location = new System.Drawing.Point(220, 310); + this.btnConnectOne.Name = "btnConnectOne"; + this.btnConnectOne.Size = new System.Drawing.Size(180, 32); + this.btnConnectOne.TabIndex = 21; + this.btnConnectOne.Text = "Connect One Meter"; + this.btnConnectOne.UseVisualStyleBackColor = true; + this.btnConnectOne.Click += new System.EventHandler(this.btnConnectOne_Click); + // + // btnConnectAll + // + this.btnConnectAll.Location = new System.Drawing.Point(417, 310); + this.btnConnectAll.Name = "btnConnectAll"; + this.btnConnectAll.Size = new System.Drawing.Size(180, 32); + this.btnConnectAll.TabIndex = 22; + this.btnConnectAll.Text = "Connect All Meters"; + this.btnConnectAll.UseVisualStyleBackColor = true; + this.btnConnectAll.Click += new System.EventHandler(this.btnConnectAll_Click); + // + // btnDisconnect + // + this.btnDisconnect.Location = new System.Drawing.Point(23, 355); + this.btnDisconnect.Name = "btnDisconnect"; + this.btnDisconnect.Size = new System.Drawing.Size(180, 32); + this.btnDisconnect.TabIndex = 23; + this.btnDisconnect.Text = "Disconnect"; + this.btnDisconnect.UseVisualStyleBackColor = true; + this.btnDisconnect.Click += new System.EventHandler(this.btnDisconnect_Click); + // + // btnGetPcbId + // + this.btnGetPcbId.Location = new System.Drawing.Point(220, 355); + this.btnGetPcbId.Name = "btnGetPcbId"; + this.btnGetPcbId.Size = new System.Drawing.Size(180, 32); + this.btnGetPcbId.TabIndex = 24; + this.btnGetPcbId.Text = "Get PCB ID"; + this.btnGetPcbId.UseVisualStyleBackColor = true; + this.btnGetPcbId.Click += new System.EventHandler(this.btnGetPcbId_Click); + // + // btnReadRegister + // + this.btnReadRegister.Location = new System.Drawing.Point(417, 355); + this.btnReadRegister.Name = "btnReadRegister"; + this.btnReadRegister.Size = new System.Drawing.Size(180, 32); + this.btnReadRegister.TabIndex = 25; + this.btnReadRegister.Text = "Read Register"; + this.btnReadRegister.UseVisualStyleBackColor = true; + this.btnReadRegister.Click += new System.EventHandler(this.btnReadRegister_Click); + // + // btnWriteRegister + // + this.btnWriteRegister.Location = new System.Drawing.Point(23, 400); + this.btnWriteRegister.Name = "btnWriteRegister"; + this.btnWriteRegister.Size = new System.Drawing.Size(180, 32); + this.btnWriteRegister.TabIndex = 26; + this.btnWriteRegister.Text = "Write Register"; + this.btnWriteRegister.UseVisualStyleBackColor = true; + this.btnWriteRegister.Click += new System.EventHandler(this.btnWriteRegister_Click); + // + // btnSetPassword + // + this.btnSetPassword.Location = new System.Drawing.Point(220, 400); + this.btnSetPassword.Name = "btnSetPassword"; + this.btnSetPassword.Size = new System.Drawing.Size(180, 32); + this.btnSetPassword.TabIndex = 27; + this.btnSetPassword.Text = "Set Meter Password"; + this.btnSetPassword.UseVisualStyleBackColor = true; + this.btnSetPassword.Click += new System.EventHandler(this.btnSetPassword_Click); + // + // FrmGCIAPI + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(624, 455); + this.Controls.Add(this.btnSetPassword); + this.Controls.Add(this.btnWriteRegister); + this.Controls.Add(this.btnReadRegister); + this.Controls.Add(this.btnGetPcbId); + this.Controls.Add(this.btnDisconnect); + this.Controls.Add(this.btnConnectAll); + this.Controls.Add(this.btnConnectOne); + this.Controls.Add(this.btnInit); + this.Controls.Add(this.txtPassword); + this.Controls.Add(this.lblPassword); + this.Controls.Add(this.txtValue); + this.Controls.Add(this.lblValue); + this.Controls.Add(this.txtRegister); + this.Controls.Add(this.lblRegister); + this.Controls.Add(this.txtStreamingBaudRate); + this.Controls.Add(this.lblStreamingBaudRate); + this.Controls.Add(this.txtStreamingPort); + this.Controls.Add(this.lblStreamingPort); + this.Controls.Add(this.txtRequestBaudRate); + this.Controls.Add(this.lblRequestBaudRate); + this.Controls.Add(this.txtRequestPort); + this.Controls.Add(this.lblRequestPort); + this.Controls.Add(this.cmbPasswordSource); + this.Controls.Add(this.lblPasswordSource); + this.Controls.Add(this.cmbConfigSource); + this.Controls.Add(this.lblConfigSource); + this.Controls.Add(this.txtSlot); + this.Controls.Add(this.lblSlot); + this.Name = "FrmGCIAPI"; + this.Text = "GCI API Test Panel"; + this.ResumeLayout(false); + this.PerformLayout(); + } + + #endregion + + private System.Windows.Forms.Label lblSlot; + private System.Windows.Forms.TextBox txtSlot; + private System.Windows.Forms.Label lblConfigSource; + private System.Windows.Forms.ComboBox cmbConfigSource; + private System.Windows.Forms.Label lblPasswordSource; + private System.Windows.Forms.ComboBox cmbPasswordSource; + private System.Windows.Forms.Label lblRequestPort; + private System.Windows.Forms.TextBox txtRequestPort; + private System.Windows.Forms.Label lblRequestBaudRate; + private System.Windows.Forms.TextBox txtRequestBaudRate; + private System.Windows.Forms.Label lblStreamingPort; + private System.Windows.Forms.TextBox txtStreamingPort; + private System.Windows.Forms.Label lblStreamingBaudRate; + private System.Windows.Forms.TextBox txtStreamingBaudRate; + private System.Windows.Forms.Label lblRegister; + private System.Windows.Forms.TextBox txtRegister; + private System.Windows.Forms.Label lblValue; + private System.Windows.Forms.TextBox txtValue; + private System.Windows.Forms.Label lblPassword; + private System.Windows.Forms.TextBox txtPassword; + private System.Windows.Forms.Button btnInit; + private System.Windows.Forms.Button btnConnectOne; + private System.Windows.Forms.Button btnConnectAll; + private System.Windows.Forms.Button btnDisconnect; + private System.Windows.Forms.Button btnGetPcbId; + private System.Windows.Forms.Button btnReadRegister; + private System.Windows.Forms.Button btnWriteRegister; + private System.Windows.Forms.Button btnSetPassword; + } +} \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/FrmGCIAPI.cs b/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/FrmGCIAPI.cs new file mode 100644 index 000000000..5ba4b7042 --- /dev/null +++ b/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/FrmGCIAPI.cs @@ -0,0 +1,193 @@ +using System; +using System.Windows.Forms; +using GenesisCordonelInterface.API; +using Xylem.Common.Hardware.Interfaces.Ports.PortCore; +using static Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.GenesisMeter; + +namespace GenesisCordonelInterface.UI.StaraTuraAPI_GenesisCordonelInterface +{ + public partial class FrmGCIAPI : Form + { + private readonly InterfaceOutsideToGCI _api = new InterfaceOutsideToGCI(); + + public FrmGCIAPI() + { + InitializeComponent(); + InitializeDefaults(); + } + + private void InitializeDefaults() + { + cmbConfigSource.DataSource = Enum.GetValues(typeof(ConfigSource)); + cmbPasswordSource.DataSource = Enum.GetValues(typeof(PasswordSource)); + + cmbConfigSource.SelectedItem = ConfigSource.ExternStorage; + cmbPasswordSource.SelectedItem = PasswordSource.OfflineFile; + } + + private void ExecuteApiAction(Action action) + { + try + { + action(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "API call failed", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private int GetSlot() + { + if (!int.TryParse(txtSlot.Text, out int slot)) + throw new Exception("Invalid slot number."); + + return slot; + } + + private object ParseValue(string input) + { + if (int.TryParse(input, out int intValue)) + return intValue; + + if (uint.TryParse(input, out uint uintValue)) + return uintValue; + + if (bool.TryParse(input, out bool boolValue)) + return boolValue; + + return input; + } + + private PortConfig? CreatePortConfig(string portName, string baudRateText) + { + if (string.IsNullOrWhiteSpace(portName)) + return null; + + if (!int.TryParse(baudRateText, out int baudRate)) + throw new Exception($"Invalid baud rate for port {portName}."); + + var cfg = new PortConfig + { + PortName = portName, + Type = "Serial" + }; + + var sp = cfg.GetSerialPort(); + if (sp == null) + throw new Exception($"Serial port object was not created for {portName}."); + + sp.BaudRate = baudRate; + + return cfg; + } + + private ConfigSource GetConfigSource() + { + if (cmbConfigSource.SelectedItem == null) + throw new Exception("ConfigSource is not selected."); + + return (ConfigSource)cmbConfigSource.SelectedItem; + } + + private PasswordSource GetPasswordSource() + { + if (cmbPasswordSource.SelectedItem == null) + throw new Exception("PasswordSource is not selected."); + + return (PasswordSource)cmbPasswordSource.SelectedItem; + } + + private void btnInit_Click(object sender, EventArgs e) + { + ExecuteApiAction(() => + { + int slot = GetSlot(); + + var requestPort = CreatePortConfig(txtRequestPort.Text, txtRequestBaudRate.Text); + var streamingPort = CreatePortConfig(txtStreamingPort.Text, txtStreamingBaudRate.Text); + + _api.InitOneMeterFromExtern( + slot, + GetConfigSource(), + GetPasswordSource(), + requestPort, + streamingPort); + }); + } + + private void btnConnectOne_Click(object sender, EventArgs e) + { + ExecuteApiAction(() => + { + _api.ConnectOneMeter(GetSlot()); + }); + } + + private void btnConnectAll_Click(object sender, EventArgs e) + { + ExecuteApiAction(() => + { + _api.ConnectAllMeters(GetSlot()); + }); + } + + private void btnDisconnect_Click(object sender, EventArgs e) + { + ExecuteApiAction(() => + { + _api.Disconnect(); + }); + } + + private void btnGetPcbId_Click(object sender, EventArgs e) + { + ExecuteApiAction(() => + { + _api.GetPcbId(GetSlot()); + }); + } + + private void btnReadRegister_Click(object sender, EventArgs e) + { + ExecuteApiAction(() => + { + string registerName = txtRegister.Text; + + if (string.IsNullOrWhiteSpace(registerName)) + throw new Exception("Register name is empty."); + + _api.ReadRegister(registerName); + }); + } + + private void btnWriteRegister_Click(object sender, EventArgs e) + { + ExecuteApiAction(() => + { + string registerName = txtRegister.Text; + string valueText = txtValue.Text; + + if (string.IsNullOrWhiteSpace(registerName)) + throw new Exception("Register name is empty."); + + object value = ParseValue(valueText); + + _api.WriteRegister(registerName, value, false, false); + }); + } + + private void btnSetPassword_Click(object sender, EventArgs e) + { + ExecuteApiAction(() => + { + string password = txtPassword.Text; + + if (string.IsNullOrWhiteSpace(password)) + throw new Exception("Password is empty."); + + _api.SetMeterPassword(password); + }); + } + } +} \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/FrmGCIAPI.resx b/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/FrmGCIAPI.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/FrmGCIAPI.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/GenesisCordonelInterface/nlog.config b/GenesisCordonelInterface/nlog.config new file mode 100644 index 000000000..b065c5314 --- /dev/null +++ b/GenesisCordonelInterface/nlog.config @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/GenesisCordonelInterface/packages.config b/GenesisCordonelInterface/packages.config new file mode 100644 index 000000000..e07979d08 --- /dev/null +++ b/GenesisCordonelInterface/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/TBF.sln b/TBF.sln index 8a859de4a..68a640124 100644 --- a/TBF.sln +++ b/TBF.sln @@ -123,7 +123,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NfcC7_DLL", "NfcC7_DLL\NfcC EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NfcC7_DLL.Tests", "NfcC7_DLL.Tests\NfcC7_DLL.Tests.csproj", "{715605C5-568B-48D6-9C09-2DC5F2E81F66}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GenesisCordonelInterface", "GenesisCordonelTester\GenesisCordonelInterface.csproj", "{C955D8AC-76B8-42D8-A83F-8AEB56CF2567}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GenesisCordonelInterface", "GenesisCordonelInterface\GenesisCordonelInterface.csproj", "{C955D8AC-76B8-42D8-A83F-8AEB56CF2567}" ProjectSection(ProjectDependencies) = postProject {04201E95-90A0-4B73-A72F-379739B2A3AE} = {04201E95-90A0-4B73-A72F-379739B2A3AE} {1B02C79E-0B19-43E2-8F6B-71EF0C786C97} = {1B02C79E-0B19-43E2-8F6B-71EF0C786C97} diff --git a/TBF/Rig/BridgeComponents/GciBridge/Factory.cs b/TBF/Rig/BridgeComponents/GciBridge/Factory.cs index b827c68ad..b53284e28 100644 --- a/TBF/Rig/BridgeComponents/GciBridge/Factory.cs +++ b/TBF/Rig/BridgeComponents/GciBridge/Factory.cs @@ -24,7 +24,7 @@ namespace TBF.Rig.BridgeComponents.GciBridge public IComponentCfg DefaultConfig() { - return new GciBridgeCfg("GCI", this); + return new GciBridgeCfg("GCI Bridge", this); } public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) diff --git a/TBF/Rig/BridgeComponents/GciBridge/GciBridge.cs b/TBF/Rig/BridgeComponents/GciBridge/GciBridge.cs index 3e5635ebf..60f5dfddc 100644 --- a/TBF/Rig/BridgeComponents/GciBridge/GciBridge.cs +++ b/TBF/Rig/BridgeComponents/GciBridge/GciBridge.cs @@ -5,8 +5,10 @@ using System; using System.Collections.Generic; using log4net; using TBF.Rig.Generic; -using UdsReaderType = TBF.Rig.Input.DataStorage.UniDataStorageReader.UniDataStorageReader; -using UdsWriterType = TBF.Rig.Output.DataStorage.UniDataStorageWriter.UniDataStorageWriter; +using UdsReaderType = TBF.Rig.Input.DataStorage.UniDataStorageReader.Reader; +using UdsWriterType = TBF.Rig.Output.DataStorage.UniDataStorageWriter.Writer; +using ExternalInterfaceType = GenesisCordonelInterface.API.InterfaceOutsideToGCI; +using ExternalInterfaceGUIType = GenesisCordonelInterface.UI.MainForm; namespace TBF.Rig.BridgeComponents.GciBridge { @@ -35,17 +37,17 @@ namespace TBF.Rig.BridgeComponents.GciBridge /// Placeholder for GCI GUI entry point. /// Replace object with real GCI MainForm type later. /// - object gciMainForm; + ExternalInterfaceGUIType gciGUI; /// /// Placeholder for GCI external/public interface. /// Replace object with real GCI interface type later. /// - object gciExternalInterface; + ExternalInterfaceType gciExternalInterface; public bool HasReader { get { return reader != null; } } public bool HasWriter { get { return writer != null; } } - public bool IsGuiInitialized { get { return gciMainForm != null; } } + public bool IsGuiInitialized { get { return gciGUI != null; } } public bool IsExternalInitialized { get { return gciExternalInterface != null; } } public GciBridge() { } @@ -97,9 +99,10 @@ namespace TBF.Rig.BridgeComponents.GciBridge { try { - /// TODO: - /// Replace with real GCI MainForm initialization. - gciMainForm = new object(); + using (gciGUI = new ExternalInterfaceGUIType()) + { + gciGUI.ShowDialog(/*this*/); + } log.InfoFormat("{0}: GCI GUI initialized.", Name); } @@ -117,9 +120,7 @@ namespace TBF.Rig.BridgeComponents.GciBridge { try { - /// TODO: - /// Replace with real GCI external interface initialization. - gciExternalInterface = new object(); + gciExternalInterface = new ExternalInterfaceType(); log.InfoFormat("{0}: GCI external interface initialized.", Name); } @@ -141,8 +142,6 @@ namespace TBF.Rig.BridgeComponents.GciBridge TryInitializeGui(); } - /// TODO: - /// Replace with real MainForm.Show() call. log.InfoFormat("{0}: ShowGui invoked.", Name); } @@ -154,8 +153,10 @@ namespace TBF.Rig.BridgeComponents.GciBridge if (!gciBridgeCfg.EnableGuiAccess) return; if (!IsGuiInitialized) return; - /// TODO: - /// Replace with real MainForm.Hide() call. + using (gciGUI) + { + gciGUI.Hide(/*this*/); + } log.InfoFormat("{0}: HideGui invoked.", Name); } diff --git a/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.Designer.cs b/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.Designer.cs index db8c26c11..86e63ade4 100644 --- a/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.Designer.cs +++ b/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.Designer.cs @@ -69,7 +69,7 @@ this.nameTextBox.Enabled = false; this.nameTextBox.Location = new System.Drawing.Point(139, 40); this.nameTextBox.Name = "nameTextBox"; - this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.Size = new System.Drawing.Size(290, 20); this.nameTextBox.TabIndex = 2; // // readerNameLabel @@ -77,7 +77,7 @@ this.readerNameLabel.AutoSize = true; this.readerNameLabel.Location = new System.Drawing.Point(28, 70); this.readerNameLabel.Name = "readerNameLabel"; - this.readerNameLabel.Size = new System.Drawing.Size(70, 13); + this.readerNameLabel.Size = new System.Drawing.Size(73, 13); this.readerNameLabel.TabIndex = 3; this.readerNameLabel.Text = "Reader Name"; // @@ -87,7 +87,7 @@ this.readerNameComboBox.FormattingEnabled = true; this.readerNameComboBox.Location = new System.Drawing.Point(139, 67); this.readerNameComboBox.Name = "readerNameComboBox"; - this.readerNameComboBox.Size = new System.Drawing.Size(130, 21); + this.readerNameComboBox.Size = new System.Drawing.Size(465, 21); this.readerNameComboBox.TabIndex = 4; // // writerNameLabel @@ -95,7 +95,7 @@ this.writerNameLabel.AutoSize = true; this.writerNameLabel.Location = new System.Drawing.Point(28, 97); this.writerNameLabel.Name = "writerNameLabel"; - this.writerNameLabel.Size = new System.Drawing.Size(67, 13); + this.writerNameLabel.Size = new System.Drawing.Size(66, 13); this.writerNameLabel.TabIndex = 5; this.writerNameLabel.Text = "Writer Name"; // @@ -105,7 +105,7 @@ this.writerNameComboBox.FormattingEnabled = true; this.writerNameComboBox.Location = new System.Drawing.Point(139, 94); this.writerNameComboBox.Name = "writerNameComboBox"; - this.writerNameComboBox.Size = new System.Drawing.Size(130, 21); + this.writerNameComboBox.Size = new System.Drawing.Size(465, 21); this.writerNameComboBox.TabIndex = 6; // // enableGuiCheckBox @@ -114,7 +114,7 @@ this.enableGuiCheckBox.Enabled = false; this.enableGuiCheckBox.Location = new System.Drawing.Point(31, 129); this.enableGuiCheckBox.Name = "enableGuiCheckBox"; - this.enableGuiCheckBox.Size = new System.Drawing.Size(114, 17); + this.enableGuiCheckBox.Size = new System.Drawing.Size(118, 17); this.enableGuiCheckBox.TabIndex = 7; this.enableGuiCheckBox.Text = "Enable GUI access"; this.enableGuiCheckBox.UseVisualStyleBackColor = true; @@ -125,7 +125,7 @@ this.enableExternalCheckBox.Enabled = false; this.enableExternalCheckBox.Location = new System.Drawing.Point(31, 152); this.enableExternalCheckBox.Name = "enableExternalCheckBox"; - this.enableExternalCheckBox.Size = new System.Drawing.Size(134, 17); + this.enableExternalCheckBox.Size = new System.Drawing.Size(136, 17); this.enableExternalCheckBox.TabIndex = 8; this.enableExternalCheckBox.Text = "Enable external access"; this.enableExternalCheckBox.UseVisualStyleBackColor = true; @@ -136,7 +136,7 @@ this.showGuiOnInitializeCheckBox.Enabled = false; this.showGuiOnInitializeCheckBox.Location = new System.Drawing.Point(31, 175); this.showGuiOnInitializeCheckBox.Name = "showGuiOnInitializeCheckBox"; - this.showGuiOnInitializeCheckBox.Size = new System.Drawing.Size(132, 17); + this.showGuiOnInitializeCheckBox.Size = new System.Drawing.Size(129, 17); this.showGuiOnInitializeCheckBox.TabIndex = 9; this.showGuiOnInitializeCheckBox.Text = "Show GUI on initialize"; this.showGuiOnInitializeCheckBox.UseVisualStyleBackColor = true; @@ -146,7 +146,7 @@ this.externalTypeNameLabel.AutoSize = true; this.externalTypeNameLabel.Location = new System.Drawing.Point(28, 205); this.externalTypeNameLabel.Name = "externalTypeNameLabel"; - this.externalTypeNameLabel.Size = new System.Drawing.Size(103, 13); + this.externalTypeNameLabel.Size = new System.Drawing.Size(105, 13); this.externalTypeNameLabel.TabIndex = 10; this.externalTypeNameLabel.Text = "External type / name"; // @@ -155,16 +155,16 @@ this.externalTypeNameTextBox.Enabled = false; this.externalTypeNameTextBox.Location = new System.Drawing.Point(139, 202); this.externalTypeNameTextBox.Name = "externalTypeNameTextBox"; - this.externalTypeNameTextBox.Size = new System.Drawing.Size(130, 20); + this.externalTypeNameTextBox.Size = new System.Drawing.Size(290, 20); this.externalTypeNameTextBox.TabIndex = 11; // // groupBox1 // this.groupBox1.Controls.Add(this.connectExternalButton); this.groupBox1.Controls.Add(this.showGuiButton); - this.groupBox1.Location = new System.Drawing.Point(10, 527); + this.groupBox1.Location = new System.Drawing.Point(31, 241); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(280, 60); + this.groupBox1.Size = new System.Drawing.Size(573, 60); this.groupBox1.TabIndex = 12; this.groupBox1.TabStop = false; this.groupBox1.Text = "GCI bridge"; @@ -181,7 +181,7 @@ // // showGuiButton // - this.showGuiButton.Location = new System.Drawing.Point(160, 19); + this.showGuiButton.Location = new System.Drawing.Point(449, 19); this.showGuiButton.Name = "showGuiButton"; this.showGuiButton.Size = new System.Drawing.Size(107, 28); this.showGuiButton.TabIndex = 1; @@ -207,7 +207,7 @@ this.Controls.Add(this.nameLabel); this.Controls.Add(this.classNameLabel); this.Name = "GciBridgeCfgCtrl"; - this.Size = new System.Drawing.Size(300, 700); + this.Size = new System.Drawing.Size(618, 323); this.Load += new System.EventHandler(this.GciBridgeCfgCtrl_Load); this.groupBox1.ResumeLayout(false); this.ResumeLayout(false); diff --git a/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.resx b/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF/TBF.csproj b/TBF/TBF.csproj index e872797b6..57078664c 100644 --- a/TBF/TBF.csproj +++ b/TBF/TBF.csproj @@ -3232,6 +3232,9 @@ + + GciBridgeCfgCtrl.cs + PumpCfgCtrl.cs @@ -4349,7 +4352,7 @@ {32817bf9-e380-4467-9c7f-936f4b122bc7} GenCode128 - + {c955d8ac-76b8-42d8-a83f-8aeb56cf2567} GenesisCordonelInterface