diff --git a/ExternalProjects_backup.zip b/ExternalProjects_backup.zip new file mode 100644 index 000000000..fea08ab44 Binary files /dev/null and b/ExternalProjects_backup.zip differ diff --git a/GenesisCordonelInterface/API/InterfaceGCIToLaatzen.cs b/GenesisCordonelInterface/API/InterfaceGCIToLaatzen.cs index e0fdc31e6..1db232733 100644 --- a/GenesisCordonelInterface/API/InterfaceGCIToLaatzen.cs +++ b/GenesisCordonelInterface/API/InterfaceGCIToLaatzen.cs @@ -3,15 +3,21 @@ using NLog; using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Drawing; using System.Linq; +using System.Reflection; using System.Threading; using System.Threading.Tasks; +using System.Windows.Forms; using Xylem.Common.Hardware.Interfaces.Ports.PortCore; +using Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; -using static GenesisCordonelInterface.API.GciPublicModels; +using Xylem.Common.Hardware.WaterMeter.WaterMeterRegisters; +using static GenesisCordonelInterface.API.PublicModels; using static Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.GenesisMeter; +using static Xylem.Common.Hardware.WaterMeter.Genesis.Registers.Register; namespace GenesisCordonelInterface.API { @@ -24,11 +30,9 @@ namespace GenesisCordonelInterface.API private readonly MeterBatch _meterBatch = new MeterBatch(); - private readonly ConcurrentDictionary _workers = - new ConcurrentDictionary(); + private readonly ConcurrentDictionary _workers = new ConcurrentDictionary(); - private readonly ConcurrentDictionary _selectedSlots = - new ConcurrentDictionary(); + private readonly ConcurrentDictionary _selectedSlots = new ConcurrentDictionary(); #endregion @@ -45,51 +49,30 @@ namespace GenesisCordonelInterface.API #endregion #region ================================== Worker Debug ================================== - public class WorkerDebugStatus - { - public int Slot { get; set; } - public string Name { get; set; } - public int QueueLength { get; set; } - public bool IsBusy { get; set; } - public string CurrentOperation { get; set; } - public string LastError { get; set; } - public DateTime LastActivity { get; set; } - } - public List GetWorkerDebugStatuses() + public List GetWorkerDebugStatuses() { return _workers - .Select(x => new WorkerDebugStatus + .OrderBy(x => x.Key) + .Select(x => new PublicModels.WorkerDebugStatus { Slot = x.Key, Name = x.Value.Name, - QueueLength = x.Value.QueueLength, - IsBusy = x.Value.IsBusy, - CurrentOperation = x.Value.CurrentOperation, + QueueLength = x.Value.IsDisposed ? 0 : x.Value.QueueLength, + IsBusy = !x.Value.IsDisposed && x.Value.IsBusy, + CurrentOperation = x.Value.IsDisposed ? null : x.Value.CurrentOperation, LastError = x.Value.LastError, LastActivity = x.Value.LastActivity }) - .OrderBy(x => x.Slot) .ToList(); } #endregion #region ================================== MeterBatch Debug ================================== - public class MeterBatchDebugStatus - { - public int Slot { get; set; } - public bool Selected { get; set; } - public string PcbId { get; set; } - public bool IsLoggedOn { get; set; } - public string RequestPort { get; set; } - public string StreamingPort { get; set; } - public string FwVersion { get; set; } - public string InterfaceVersion { get; set; } - } public List GetMeterBatchDebugStatuses() { - return _meterBatch.ListOfMeters + return _meterBatch.ListOfMeters .OfType() .Select(m => new MeterBatchDebugStatus { @@ -99,6 +82,11 @@ namespace GenesisCordonelInterface.API IsLoggedOn = m.IsLoggedOn, RequestPort = m.RequestPort?.GetPortName(), StreamingPort = m.StreamingPort?.GetPortName(), + RequestPortType = + m.RequestPort is Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.RfidSerialPort ? "RFID" : + m.RequestPort is Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.UartSerialPort ? "UART" : + m.RequestPort is Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.IrdaSerialPort ? "IRDA" : + null, FwVersion = m.FwVersion, InterfaceVersion = m.InterfaceInfo?.InterfaceVersion }) @@ -143,8 +131,8 @@ namespace GenesisCordonelInterface.API .OfType() .FirstOrDefault(m => m.Slot == slot); - if (meter == null) - throw new InvalidOperationException($"Meter for slot {slot} not initialized."); + //if (meter == null) + // throw new InvalidOperationException($"Meter for slot {slot} not initialized."); return meter; } @@ -181,7 +169,7 @@ namespace GenesisCordonelInterface.API #region ================================== INIT ================================== - public Task InitOneMeterFromExternAsync( + /*public Task InitOneMeterFromExternAsync( int slot, ConfigSource cfg, PasswordSource pwd, @@ -192,12 +180,12 @@ namespace GenesisCordonelInterface.API return GetWorker(slot).RunAsync(() => InitOneMeterFromExtern(slot, cfg, pwd, req, str), token); } - public GciPublicModels.GciInitSlotResult InitOneMeterFromExtern( - int slot, - ConfigSource cfg, - PasswordSource pwd, - PortConfig? req, - PortConfig? str) + public PublicModels.GciInitSlotResult InitOneMeterFromExtern( + int slot, + ConfigSource cfg, + PasswordSource pwd, + PortConfig? req, + PortConfig? str) { const string operation = nameof(InitOneMeterFromExtern); @@ -208,86 +196,304 @@ namespace GenesisCordonelInterface.API $"RequestPort={(req.HasValue ? req.Value.PortName.ToString() : "")}, " + $"StreamingPort={(str.HasValue ? str.Value.PortName.ToString() : "")}"); - var meter = new GenesisMeter + var meter = GetMeter(slot); + + bool created = false; + + if (meter == null) { - useConfigSource = cfg, - usePasswordSource = pwd + meter = new GenesisMeter(); + created = true; + } + + meter.useConfigSource = cfg; + meter.usePasswordSource = pwd; + + //meter.SetupFromExternConfig(slot, req, str, true); + meter.SetupGenesisMeter(slot, req, str, true); + + if (created) + _meterBatch.AddMeter(meter); + + //SetSlotSelected(slot, true); + + LogInfo(operation, + $"Success. Slot={slot}, Created={created}, MeterBatchCount={_meterBatch.ListOfMeters.Count}"); + + return new PublicModels.GciInitSlotResult + { + Success = true, + SlotId = slot, + Message = created ? "Slot created." : "Slot updated." }; - - meter.SetupFromExternConfig(slot, req, str, true); - - _meterBatch.AddMeter(meter); - - LogInfo(operation, $"Success. Slot={slot}, MeterBatchCount={_meterBatch.ListOfMeters.Count}"); - - return new GciPublicModels.GciInitSlotResult { Success = true, SlotId = slot }; } catch (Exception ex) { LogError(operation, ex); - return new GciPublicModels.GciInitSlotResult + return new PublicModels.GciInitSlotResult { Success = false, SlotId = slot, Message = ex.Message }; } + }*/ + + public Task InitSlotAsync( + int slot, + ConfigSource cfg, + PasswordSource pwd, + PortConfig? req, + PortConfig? str, + CancellationToken token = default) + { + return GetWorker(slot).RunAsync(() => InitSlot(slot, cfg, pwd, req, str), token); } - public Task GetOneMeterInfo( + public PublicModels.GciInitSlotResult InitSlot( + int slot, + ConfigSource cfg, + PasswordSource pwd, + PortConfig? req, + PortConfig? str) + { + const string operation = nameof(InitSlot); + + try + { + LogInfo(operation, + string.Format( + "Start. Slot={0}, ConfigSource={1}, PasswordSource={2}, RequestPort={3}, StreamingPort={4}", + slot, + cfg, + pwd, + req.HasValue ? req.Value.PortName : "", + str.HasValue ? str.Value.PortName : "")); + + var existingMeter = GetMeter(slot); + + if (existingMeter != null) + { + return SlotAlreadyExists(slot, existingMeter); + } + + var meter = CreateMeterForSlot(slot, cfg, pwd, req, str); + + //AddMeter(slot, meter); + + return SlotCreated(slot, meter); + } + catch (Exception ex) + { + LogError(operation, ex); + return SlotFailed(slot, ex.Message); + } + } + + public Task UpdateSlotAsync( + int slot, + ConfigSource cfg, + PasswordSource pwd, + PortConfig? req, + PortConfig? str, + CancellationToken token = default) + { + return GetWorker(slot).RunAsync(() => UpdateSlot(slot, cfg, pwd, req, str), token); + } + + public PublicModels.GciInitSlotResult UpdateSlot( + int slot, + ConfigSource cfg, + PasswordSource pwd, + PortConfig? req, + PortConfig? str) + { + const string operation = nameof(UpdateSlot); + + try + { + LogInfo(operation, + string.Format( + "Start. Slot={0}, ConfigSource={1}, PasswordSource={2}, RequestPort={3}, StreamingPort={4}", + slot, + cfg, + pwd, + req.HasValue ? req.Value.PortName : "", + str.HasValue ? str.Value.PortName : "")); + + var meter = GetMeter(slot); + + if (meter == null) + { + return SlotFailed(slot, "Meter does not exist for this slot."); + } + + UpdateMeterForSlot(meter, slot, cfg, pwd, req, str); + + return SlotUpdated(slot, meter); + } + catch (Exception ex) + { + LogError(operation, ex); + return SlotFailed(slot, ex.Message); + } + } + + private GenesisMeter CreateMeterForSlot( + int slot, + ConfigSource cfg, + PasswordSource pwd, + PortConfig? req, + PortConfig? str) + { + GenesisMeter meter = new GenesisMeter(); + + meter.Slot = slot; + + meter.useConfigSource = cfg; + meter.usePasswordSource = pwd; + + meter.SetupGenesisMeter(slot, req, str, true); + _meterBatch.AddMeter2(meter); + + return meter; + } + + private void UpdateMeterForSlot( + GenesisMeter meter, + int slot, + ConfigSource cfg, + PasswordSource pwd, + PortConfig? req, + PortConfig? str) + { + if (meter == null) + throw new ArgumentNullException(nameof(meter)); + + meter.Slot = slot; + + meter.useConfigSource = cfg; + meter.usePasswordSource = pwd; + + meter.SetupGenesisMeter(slot, req, str, true); + //meter.ConnectMeter(); + + + } + + private PublicModels.GciInitSlotResult SlotCreated(int slot, GenesisMeter meter) + { + return new PublicModels.GciInitSlotResult + { + SlotId = slot, + Success = true, + Message = "Meter initialized.", + PcbId = meter != null ? meter.SerialNumber : null, + Created = true, + Updated = false, + AlreadyExists = false + }; + } + + private PublicModels.GciInitSlotResult SlotUpdated(int slot, GenesisMeter meter) + { + return new PublicModels.GciInitSlotResult + { + SlotId = slot, + Success = true, + Message = "Meter updated.", + PcbId = meter != null ? meter.SerialNumber : null, + Created = false, + Updated = true, + AlreadyExists = false + }; + } + + private PublicModels.GciInitSlotResult SlotAlreadyExists(int slot, GenesisMeter meter) + { + return new PublicModels.GciInitSlotResult + { + SlotId = slot, + Success = true, + Message = "Meter already exists.", + PcbId = meter != null ? meter.SerialNumber : null, + Created = false, + Updated = false, + AlreadyExists = true + }; + } + + private PublicModels.GciInitSlotResult SlotFailed(int slot, string message) + { + return new PublicModels.GciInitSlotResult + { + SlotId = slot, + Success = false, + Message = message, + PcbId = null, + Created = false, + Updated = false, + AlreadyExists = false + }; + } + + #endregion + + #region ================================== Slot INFO ================================== + + public Task GetOneMeterInfo( int slot, CancellationToken token = default) { return GetWorker(slot).RunAsync(() => GetOneMeterInfo(slot), token); } - public GciPublicModels.GciSlotInfo GetOneMeterInfo(int slotId) + public PublicModels.GciSlotInfo GetOneMeterInfo(int slot) { const string operation = nameof(GetOneMeterInfo); try { - LogInfo(operation, $"Start. Slot={slotId}"); + LogInfo(operation, $"Start. Slot={slot}"); - var meter = _meterBatch.ListOfMeters - .OfType() - .FirstOrDefault(m => m.Slot == slotId); + var meter = GetMeter(slot); if (meter == null) { - return new GciPublicModels.GciSlotInfo + return new PublicModels.GciSlotInfo { - SlotId = slotId, + SlotId = slot, Success = true, Exists = false, Message = "Slot is empty." }; } - return new GciPublicModels.GciSlotInfo + return new PublicModels.GciSlotInfo { - SlotId = slotId, + SlotId = slot, Success = true, Exists = true, Message = "Slot found.", - // PcbId = meter.PcbId, + PcbId = meter.PcbId, + Password = meter.Password, - ConfigSource = GciPublicModels.MapConfigSourceBack(meter.useConfigSource), - PasswordSource = GciPublicModels.MapPasswordSourceBack(meter.usePasswordSource), + ConfigSource = ModelsMapping.MapConfigSourceBack(meter.useConfigSource), + PasswordSource = ModelsMapping.MapPasswordSourceBack(meter.usePasswordSource), - RequestPort = GciPublicModels.MapPortBack(meter.RequestPort), - StreamingPort = GciPublicModels.MapPortBack(meter.StreamingPort) + RequestPort = ModelsMapping.MapPortBack(meter.RequestPort), + StreamingPort = ModelsMapping.MapPortBack(meter.StreamingPort) }; } catch (Exception ex) { LogError(operation, ex); - return new GciPublicModels.GciSlotInfo + return new PublicModels.GciSlotInfo { - SlotId = slotId, + SlotId = slot, Success = false, Exists = false, Message = ex.Message @@ -295,13 +501,63 @@ namespace GenesisCordonelInterface.API } } - public Task CleanSlotsAsync( + public Task GetAllMetersInfo( + CancellationToken token = default) + { + return Task.Run(() => GetAllMetersInfo(), token); + } + + public PublicModels.GciAllSlotsInfo GetAllMetersInfo() + { + const string operation = nameof(GetAllMetersInfo); + + try + { + LogInfo(operation, "Start."); + + var result = new PublicModels.GciAllSlotsInfo + { + Success = true, + Message = "Slots read.", + Slots = _meterBatch.ListOfMeters + .OfType() + .Select(meter => new PublicModels.GciSlotInfo + { + SlotId = meter.Slot, + Success = true, + Exists = true, + Message = "Slot found.", + PcbId = meter.PcbId, + ConfigSource = ModelsMapping.MapConfigSourceBack(meter.useConfigSource), + PasswordSource = ModelsMapping.MapPasswordSourceBack(meter.usePasswordSource), + RequestPort = ModelsMapping.MapPortBack(meter.RequestPort), + StreamingPort = ModelsMapping.MapPortBack(meter.StreamingPort) + }) + .ToList() + }; + + return result; + } + catch (Exception ex) + { + LogError(operation, ex); + + return new PublicModels.GciAllSlotsInfo + { + Success = false, + Message = ex.Message, + Slots = new List() + }; + } + } + + public Task CleanSlotsAsync( CancellationToken token = default) { return Task.Run(() => CleanSlots(), token); } - public GciPublicModels.GciCleanSlotsResult CleanSlots() + public PublicModels.GciCleanSlotsResult CleanSlots() { const string operation = nameof(CleanSlots); @@ -310,18 +566,18 @@ namespace GenesisCordonelInterface.API LogInfo(operation, "Start."); _meterBatch.ListOfMeters.Clear(); - _selectedSlots.Clear(); - foreach (var worker in _workers.Values) + foreach (var pair in _workers.ToList()) { - worker.Dispose(); + ApiWorker worker; + + if (_workers.TryRemove(pair.Key, out worker)) + { + worker.Dispose(); + } } - _workers.Clear(); - - LogInfo(operation, "Success. Meter batch, selected slots and workers cleared."); - - return new GciPublicModels.GciCleanSlotsResult + return new PublicModels.GciCleanSlotsResult { Success = true, Message = "Slots cleaned." @@ -331,7 +587,7 @@ namespace GenesisCordonelInterface.API { LogError(operation, ex); - return new GciPublicModels.GciCleanSlotsResult + return new PublicModels.GciCleanSlotsResult { Success = false, Message = ex.Message @@ -343,15 +599,6 @@ namespace GenesisCordonelInterface.API #region ================================== PORT DETECTION ================================== - public class PortDetectionResult - { - public bool Success { get; set; } - public int Slot { get; set; } - public string PortName { get; set; } - public string PcbId { get; set; } - public string ErrorMessage { get; set; } - } - public Task DetectStreamingPortAsync( int slot, CancellationToken token = default(CancellationToken)) @@ -458,14 +705,73 @@ namespace GenesisCordonelInterface.API #endregion + #region ================================== LOGIN ================================== + public Task LoginOneSlotAsync(int slot, CancellationToken token = default) + { + return GetWorker(slot).RunAsync(() => LoginOneSlot(slot), token); + } + + public PublicModels.GciLoginResult LoginOneSlot(int slot) + { + const string operation = nameof(LoginOneSlot); + + try + { + LogInfo(operation, $"Start. Slot={slot}"); + + var meter = GetMeter(slot); + + meter.Login(); + + if (!meter.IsLoggedOn) + { + var failedResult = new PublicModels.GciLoginResult + { + Success = false, + SlotId = slot, + IsLoggedOn = false, + Message = "Login failed." + }; + + LogInfo(operation, $"Failed. {failedResult}"); + + return failedResult; + } + + var result = new PublicModels.GciLoginResult + { + Success = true, + SlotId = slot, + IsLoggedOn = true + }; + + LogInfo(operation, $"Success. {result}"); + + return result; + } + catch (Exception ex) + { + LogError(operation, ex); + + return new PublicModels.GciLoginResult + { + Success = false, + SlotId = slot, + IsLoggedOn = false, + Message = ex.Message + }; + } + } + #endregion + #region ================================== CONNECT ================================== - public Task ConnectOneSlotAsync(int slot, CancellationToken token = default) + public Task ConnectOneSlotAsync(int slot, CancellationToken token = default) { return GetWorker(slot).RunAsync(() => ConnectOneSlot(slot), token); } - public GciPublicModels.GciConnectResult ConnectOneSlot(int slot) + public PublicModels.GciConnectResult ConnectOneSlot(int slot) { const string operation = nameof(ConnectOneSlot); @@ -475,13 +781,15 @@ namespace GenesisCordonelInterface.API var meter = GetMeter(slot); - _meterBatch.MetersLogin(); + meter.SoftDispose(); + + meter.ConnectMeter(); if (!meter.IsLoggedOn) { LogInfo(operation, $"Failed. Slot={slot}, Reason=Login failed."); - return new GciPublicModels.GciConnectResult + return new PublicModels.GciConnectResult { Success = false, SlotId = slot, @@ -489,7 +797,7 @@ namespace GenesisCordonelInterface.API }; } - var result = new GciPublicModels.GciConnectResult + var result = new PublicModels.GciConnectResult { Success = true, SlotId = slot, @@ -498,13 +806,13 @@ namespace GenesisCordonelInterface.API FwVersion = meter.FwVersion, InterfaceVersion = meter.InterfaceInfo?.InterfaceVersion, InterfaceSupportsFwVersion = meter.InterfaceSupportsFwVersion, - Registers = BuildRegisters(meter) + Registers = null//BuildRegisters(meter) }; LogInfo(operation, $"Success. Slot={slot}, PcbId={result.PcbId ?? ""}, " + $"FwVersion={result.FwVersion ?? ""}, InterfaceVersion={result.InterfaceVersion ?? ""}, " + - $"Registers={result.Registers.Count}"); + $"Registers={result.Registers?.Count}"); return result; } @@ -512,7 +820,7 @@ namespace GenesisCordonelInterface.API { LogError(operation, ex); - return new GciPublicModels.GciConnectResult + return new PublicModels.GciConnectResult { Success = false, SlotId = slot, @@ -521,7 +829,7 @@ namespace GenesisCordonelInterface.API } } - private List BuildRegisters(GenesisMeter meter) + private List BuildRegisters(GenesisMeter meter) { var list = new List(); @@ -551,14 +859,14 @@ namespace GenesisCordonelInterface.API #region ================================== DISCONNECT ================================== - public Task DisconnectAsync( + public Task DisconnectAsync( int slot, CancellationToken token = default) { return GetWorker(slot).RunAsync(() => Disconnect(slot), token); } - public GciPublicModels.GciDisconnectResult Disconnect(int slot) + public PublicModels.GciDisconnectResult Disconnect(int slot) { const string operation = nameof(Disconnect); @@ -571,11 +879,12 @@ namespace GenesisCordonelInterface.API if (meter.IsLoggedOn) meter.Logout(); - meter.DisposeMeter(); + //meter.DisposeMeter(); + meter.SoftDispose(); LogInfo(operation, $"Success. Slot={slot}"); - return new GciPublicModels.GciDisconnectResult + return new PublicModels.GciDisconnectResult { SlotId = slot, Success = true, @@ -586,7 +895,7 @@ namespace GenesisCordonelInterface.API { LogError(operation, ex); - return new GciPublicModels.GciDisconnectResult + return new PublicModels.GciDisconnectResult { SlotId = slot, Success = false, @@ -607,20 +916,59 @@ namespace GenesisCordonelInterface.API #region ================================== PCB ================================== - public Task GetPcbIdAsync( + public Task GetPcbIdAsync( int slot, CancellationToken token = default(CancellationToken)) { return GetWorker(slot).RunAsync(() => GetPcbId(slot), token, "GetPcbId"); } - public GciPublicModels.GciGetPcbIdResult GetPcbId(int slot) + public PublicModels.GciGetPcbIdResult GetPcbId(int slot) { const string operation = nameof(GetPcbId); try { - LogInfo(operation, $"Start. Slot={slot}"); + /*const String checkMark = "\u2714"; + using (var mb = new MeterBatch()) + { + using (var meter = new GenesisMeter()) + { + meter.SetupFromConfigFile(slot, false); + mb.AddMeter(meter); + + 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); + + 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); + + Logger.Error("COM: Streaming detection FAILED for slot " + slot + ", port " + meter.StreamingPort.GetPortName() + "."); + } + + return new PublicModels.GciGetPcbIdResult + { + SlotId = slot, + Success = !string.IsNullOrWhiteSpace(pcbId), + PcbId = pcbId, + Message = !string.IsNullOrWhiteSpace(pcbId) + ? "PCB ID read successfully." + : "PCB ID is empty." + }; + } + }*/ + //toto ide!!! + /*LogInfo(operation, $"Start. Slot={slot}"); using (var mb = new MeterBatch()) using (var meter = new GenesisMeter()) @@ -633,7 +981,7 @@ namespace GenesisCordonelInterface.API LogInfo(operation, $"Finish. Slot={slot}, PcbId={pcbId ?? ""}"); - return new GciPublicModels.GciGetPcbIdResult + return new PublicModels.GciGetPcbIdResult { SlotId = slot, Success = !string.IsNullOrWhiteSpace(pcbId), @@ -643,12 +991,49 @@ namespace GenesisCordonelInterface.API : "PCB ID is empty." }; } + */ + LogInfo(operation, $"Start. Slot={slot}"); + + var meter = GetMeter(slot); + + meter.Logout(); + + string pcbId = meter.GetPcbId(); + + LogInfo(operation, $"Finish. Slot={slot}, PcbId={pcbId ?? ""}"); + + return new PublicModels.GciGetPcbIdResult + { + SlotId = slot, + Success = !string.IsNullOrWhiteSpace(pcbId), + PcbId = pcbId, + Message = !string.IsNullOrWhiteSpace(pcbId) + ? "PCB ID read successfully." + : "PCB ID is empty." + }; + /*var meter = new GenesisMeter();// GetMeter(slot); + meter.SetupFromConfigFile(slot, true); + meter.Logout(); + + string pcbId = meter.GetPcbId(); + + LogInfo(operation, $"Finish. Slot={slot}, PcbId={pcbId ?? ""}"); + + return new PublicModels.GciGetPcbIdResult + { + SlotId = slot, + Success = !string.IsNullOrWhiteSpace(pcbId), + PcbId = pcbId, + Message = !string.IsNullOrWhiteSpace(pcbId) + ? "PCB ID read successfully." + : "PCB ID is empty." + };*/ } catch (Exception ex) { LogError(operation, ex); - return new GciPublicModels.GciGetPcbIdResult + return new PublicModels.GciGetPcbIdResult { SlotId = slot, Success = false, @@ -662,14 +1047,6 @@ namespace GenesisCordonelInterface.API #region ================================== REGISTER READ ================================== - public class RegisterReadResult - { - public bool Success { get; set; } - public string RegisterName { get; set; } - public string RawHex { get; set; } - public string ErrorMessage { get; set; } - } - public Task ReadRegisterAsync(int slot, string name, CancellationToken token = default) { return GetWorker(slot).RunAsync(() => ReadRegister(slot, name), token); @@ -716,16 +1093,6 @@ namespace GenesisCordonelInterface.API #region ================================== REGISTER WRITE ================================== - public class RegisterWriteResult - { - public bool Success { get; set; } - public string RegisterName { get; set; } - public object WrittenValue { get; set; } - public bool StoreToDevice { get; set; } - public bool RefreshSystemState { get; set; } - public string ErrorMessage { get; set; } - } - public Task WriteRegisterAsync( int slot, string registerName, @@ -843,36 +1210,56 @@ namespace GenesisCordonelInterface.API #region ================================== PASSWORD ================================== - public Task SetMeterPasswordAsync( - int slot, - string password, - CancellationToken token = default(CancellationToken)) + public Task SetMeterPasswordAsync( + int slot, + string password, + CancellationToken token = default) { - return GetWorker(slot).RunAsync( - () => SetMeterPassword(slot, password), + return GetWorker(slot).RunAsync(() => SetMeterPassword(slot, password), token, "SetMeterPassword"); } - public bool SetMeterPassword(int slot, string password) + public PublicModels.GciSetPasswordResult SetMeterPassword( + int slot, + string password) { const string operation = nameof(SetMeterPassword); - if (string.IsNullOrWhiteSpace(password)) - throw new ArgumentException("Password cannot be empty.", nameof(password)); + try + { + if (string.IsNullOrWhiteSpace(password)) + throw new ArgumentException("Password cannot be empty.", nameof(password)); - LogInfo(operation, $"Start. Slot={slot}"); + LogInfo(operation, $"Start. Slot={slot}"); - var result = WriteRegister( - slot, - "SECURITY_Password", - password, - true, - true); + GenesisMeter meter = GetMeter(slot); - LogInfo(operation, $"Finish. Slot={slot}, Success={result.Success}"); + meter?.SetPassword(password);//SetupFromExternConfig(); - return result.Success; + var result = new PublicModels.GciSetPasswordResult + { + SlotId = slot, + Success = true, + Password = meter.GetPassword_out(), + Message = "Password set successfully." + }; + + LogInfo(operation, $"Finish. Slot={slot}, Success={result.Success}"); + + return result; + } + catch (Exception ex) + { + LogError(operation, ex); + + return new PublicModels.GciSetPasswordResult + { + SlotId = slot, + Success = false, + Message = ex.Message + }; + } } #endregion @@ -952,6 +1339,26 @@ namespace GenesisCordonelInterface.API } } + private List _cachedRegisters; + + public List GetAllRegisterNames() + { + if (_cachedRegisters != null) + return _cachedRegisters; + + _cachedRegisters = typeof(Register) + .GetNestedTypes(BindingFlags.Public) + .SelectMany(t => t.GetFields(BindingFlags.Public | BindingFlags.Static)) + .Where(f => f.FieldType == typeof(string)) + .Select(f => f.GetValue(null)?.ToString()) + .Where(x => !string.IsNullOrWhiteSpace(x)) + .Distinct() + .OrderBy(x => x) + .ToList(); + + return _cachedRegisters; + } + // ---------------------------------------------------- #endregion } diff --git a/GenesisCordonelInterface/API/InterfaceOutsideToGCI.cs b/GenesisCordonelInterface/API/InterfaceOutsideToGCI.cs index e29aa1e92..0c719ac99 100644 --- a/GenesisCordonelInterface/API/InterfaceOutsideToGCI.cs +++ b/GenesisCordonelInterface/API/InterfaceOutsideToGCI.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO.Ports; using System.Threading; using System.Threading.Tasks; +using static GenesisCordonelInterface.API.PublicModels; namespace GenesisCordonelInterface.API { @@ -12,9 +13,9 @@ namespace GenesisCordonelInterface.API /// public class InterfaceOutsideToGCI { - private readonly InterfaceGCIToLaatzen _innerMeterAPI; + public readonly InterfaceGCIToLaatzen _innerMeterAPI; - public event Action> MeterBatchStatusChanged; + public event Action> MeterBatchStatusChanged; public InterfaceOutsideToGCI() { @@ -23,14 +24,14 @@ namespace GenesisCordonelInterface.API #region ================================== PORT DETECTION ================================== - public InterfaceGCIToLaatzen.PortDetectionResult DetectStreamingPort(int slot) + public PortDetectionResult DetectStreamingPort(int slot) { var result = _innerMeterAPI.DetectStreamingPort(slot); RaiseMeterBatchStatusChanged(); return result; } - public async Task DetectStreamingPortAsync( + public async Task DetectStreamingPortAsync( int slot, CancellationToken token = default(CancellationToken)) { @@ -39,14 +40,14 @@ namespace GenesisCordonelInterface.API return result; } - public InterfaceGCIToLaatzen.PortDetectionResult DetectRequestPort(int slot) + public PortDetectionResult DetectRequestPort(int slot) { var result = _innerMeterAPI.DetectRequestPort(slot); RaiseMeterBatchStatusChanged(); return result; } - public async Task DetectRequestPortAsync( + public async Task DetectRequestPortAsync( int slot, CancellationToken token = default(CancellationToken)) { @@ -59,17 +60,36 @@ namespace GenesisCordonelInterface.API #region ================================== INIT ================================== - public async Task InitSlotAsync(GciPublicModels.GciInitSlotRequest request, CancellationToken token = default) + /*public async Task InitSlotAsync(GciInitSlotRequest request, CancellationToken token = default) { if (request == null) throw new ArgumentNullException(nameof(request)); var result = await _innerMeterAPI.InitOneMeterFromExternAsync( request.SlotId, - GciPublicModels.MapConfigSource(request.ConfigSource), - GciPublicModels.MapPasswordSource(request.PasswordSource), - GciPublicModels.MapPort(request.RequestPort), - GciPublicModels.MapPort(request.StreamingPort), + ModelsMapping.MapConfigSource(request.ConfigSource), + ModelsMapping.MapPasswordSource(request.PasswordSource), + ModelsMapping.MapPort(request.RequestPort), + ModelsMapping.MapPort(request.StreamingPort), + token); + + RaiseMeterBatchStatusChanged(); + + return result; + }*/ + public async Task InitSlotAsync( + GciInitSlotRequest request, + CancellationToken token = default) + { + if (request == null) + throw new ArgumentNullException(nameof(request)); + + var result = await _innerMeterAPI.InitSlotAsync( + request.SlotId, + ModelsMapping.MapConfigSource(request.ConfigSource), + ModelsMapping.MapPasswordSource(request.PasswordSource), + ModelsMapping.MapPort(request.RequestPort), + ModelsMapping.MapPort(request.StreamingPort), token); RaiseMeterBatchStatusChanged(); @@ -77,7 +97,27 @@ namespace GenesisCordonelInterface.API return result; } - public async Task GetSlotAsync( + public async Task UpdateSlotAsync( + GciInitSlotRequest request, + CancellationToken token = default) + { + if (request == null) + throw new ArgumentNullException(nameof(request)); + + var result = await _innerMeterAPI.UpdateSlotAsync( + request.SlotId, + ModelsMapping.MapConfigSource(request.ConfigSource), + ModelsMapping.MapPasswordSource(request.PasswordSource), + ModelsMapping.MapPort(request.RequestPort), + ModelsMapping.MapPort(request.StreamingPort), + token); + + RaiseMeterBatchStatusChanged(); + + return result; + } + + public async Task GetSlotAsync( int slotId, CancellationToken token = default) { @@ -89,7 +129,15 @@ namespace GenesisCordonelInterface.API return result; } - public async Task CleanSlotsAsync( + public async Task GetAllSlotsAsync( + CancellationToken token = default) + { + var result = await _innerMeterAPI.GetAllMetersInfo(token); + + return result; + } + + public async Task CleanSlotsAsync( CancellationToken token = default) { var result = await _innerMeterAPI.CleanSlotsAsync(token); @@ -100,20 +148,50 @@ namespace GenesisCordonelInterface.API } #endregion - #region ================================== CONNECTION ================================== - - public async Task ConnectOneSlotAsync( - int slot, - CancellationToken token = default) + #region ================================== PASSWORD ================================== + public async Task SetPasswordAsync( + int slot, + string password, + CancellationToken token = default) { - GciPublicModels.GciConnectResult result = await _innerMeterAPI.ConnectOneSlotAsync(slot, token); + if (slot <= 0) + throw new ArgumentException("Invalid slot id."); + + if (string.IsNullOrWhiteSpace(password)) + throw new ArgumentException("Password is empty."); + + GciSetPasswordResult result = await _innerMeterAPI.SetMeterPasswordAsync(slot, password, token); RaiseMeterBatchStatusChanged(); return result; } - public async Task DisconnectAsync( + #endregion + + #region ================================== LOGIN ================================== + public Task LoginOneSlotAsync( + int slot, + CancellationToken token = default) + { + return _innerMeterAPI.LoginOneSlotAsync(slot, token); + } + #endregion + + #region ================================== CONNECTION ================================== + + public async Task ConnectOneSlotAsync( + int slot, + CancellationToken token = default) + { + GciConnectResult result = await _innerMeterAPI.ConnectOneSlotAsync(slot, token); + + RaiseMeterBatchStatusChanged(); + + return result; + } + + public async Task DisconnectAsync( int slot, CancellationToken token = default) { @@ -129,7 +207,7 @@ namespace GenesisCordonelInterface.API #endregion #region ================================== PCB ================================== - public async Task GetPcbIdAsync( + public async Task GetPcbIdAsync( int slot, CancellationToken token = default) { @@ -145,14 +223,14 @@ namespace GenesisCordonelInterface.API #region ================================== READ ================================== // ---------------------------------------------------- - public InterfaceGCIToLaatzen.RegisterReadResult ReadRegister( + public RegisterReadResult ReadRegister( int slot, string registerName) { return _innerMeterAPI.ReadRegister(slot, registerName); } - public Task ReadRegisterAsync( + public Task ReadRegisterAsync( int slot, string registerName, CancellationToken token = default(CancellationToken)) @@ -166,25 +244,27 @@ namespace GenesisCordonelInterface.API #region ================================== WRITE ================================== // ---------------------------------------------------- - public async Task WriteRegisterAsync( + public async Task WriteRegisterAsync( int slot, string registerName, object value, bool storeToDevice = false, - bool refreshSystemState = false) + bool refreshSystemState = false, + CancellationToken token = default) { var result = await _innerMeterAPI.WriteRegisterAsync( slot, registerName, value, storeToDevice, - refreshSystemState); + refreshSystemState, + token); RaiseMeterBatchStatusChanged(); return result; } - public InterfaceGCIToLaatzen.RegisterWriteResult WriteRegister( + public RegisterWriteResult WriteRegister( int slot, string registerName, object value, @@ -202,14 +282,14 @@ namespace GenesisCordonelInterface.API return result; } - public async Task SetMeterPasswordAsync(int slot, string password) + public async Task SetMeterPasswordAsync(int slot, string password) { var result = await _innerMeterAPI.SetMeterPasswordAsync(slot, password); RaiseMeterBatchStatusChanged(); return result; } - public bool SetMeterPassword(int slot, string password) + public GciSetPasswordResult SetMeterPassword(int slot, string password) { var result = _innerMeterAPI.SetMeterPassword(slot, password); RaiseMeterBatchStatusChanged(); @@ -222,12 +302,12 @@ namespace GenesisCordonelInterface.API #region ================================== DEBUG STATUS ================================== // ---------------------------------------------------- - public List GetWorkerDebugStatuses() + public List GetWorkerDebugStatuses() { return _innerMeterAPI.GetWorkerDebugStatuses(); } - public List GetMeterBatchDebugStatuses() + public List GetMeterBatchDebugStatuses() { return _innerMeterAPI.GetMeterBatchDebugStatuses(); } @@ -347,7 +427,7 @@ namespace GenesisCordonelInterface.API RaiseMeterBatchStatusChanged(); } - public void SaveSlotSetup(List data) + public void SaveSlotSetup(List data) { _innerMeterAPI.SaveSlotSetup(data); RaiseMeterBatchStatusChanged(); @@ -355,5 +435,10 @@ namespace GenesisCordonelInterface.API // ---------------------------------------------------- #endregion + + public List GetAllRegisterNames() + { + return _innerMeterAPI.GetAllRegisterNames(); + } } } \ No newline at end of file diff --git a/GenesisCordonelInterface/API/ModelsMapping.cs b/GenesisCordonelInterface/API/ModelsMapping.cs new file mode 100644 index 000000000..a47a5305f --- /dev/null +++ b/GenesisCordonelInterface/API/ModelsMapping.cs @@ -0,0 +1,160 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xylem.Common.Hardware.Interfaces.Ports.PortCore; +using static GenesisCordonelInterface.API.InterfaceOutsideToGCI; +using static GenesisCordonelInterface.API.PublicModels; +using static Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.GenesisMeter; + +namespace GenesisCordonelInterface.API +{ + /// + /// Public data contract layer for the Genesis Cordonel Interface (GCI). + /// + /// This class defines all Data Transfer Objects (DTOs) that are exposed + /// to external consumers (e.g. TBF, UI, or other integration layers). + /// + /// Responsibilities: + /// - Provide stable, dependency-free models for external usage + /// - Decouple internal GCI implementation (GenesisMeter, Xylem libraries) + /// from external systems + /// - Define request/response contracts for all supported operations + /// - Contain mapping methods between public DTOs and internal domain models + /// + /// Architecture: + /// External world (TBF / UI) + /// ↓ + /// GciPublicModels (this layer) + /// ↓ + /// Internal GCI API (InterfaceGCIToLaatzen, GenesisMeter, etc.) + /// + /// Notes: + /// - Public models must NOT expose internal types (e.g. GenesisMeter, IPort, etc.) + /// - All mapping between internal and external representations must be done here + /// - DTOs are designed to be simple, serializable, and stable over time + /// - Any change in internal implementation should not affect these models + /// + /// Pattern: + /// Each operation follows a consistent structure: + /// Request → Operation → Result + /// + /// Example: + /// GciInitSlotRequest → InitSlot → GciInitSlotResult + /// GetSlot → GciSlotInfo + /// GetPcbId → GciGetPcbIdResult + /// + /// This layer acts as a boundary between domain logic and integration logic. + /// + public class ModelsMapping + { + /// + /// Mapping methods between public DTOs and internal GCI models. + /// Ensures separation between external contracts and internal domain objects. + /// + #region ================================== OUTERN/INTERN and back models mapping ================================== + public static PasswordSource MapPasswordSource(PublicModels.GciPasswordSource src) + { + return (PasswordSource)src; + } + + public static ConfigSource MapConfigSource(PublicModels.GciConfigSource src) + { + return (ConfigSource)src; + } + + public static Xylem.Common.Hardware.Interfaces.Ports.PortCore.PortConfig? MapPort(PublicModels.GciPortConfig port) + { + if (port == null) + return null; + + Xylem.Common.Hardware.Interfaces.Ports.PortCore.PortConfig result = new Xylem.Common.Hardware.Interfaces.Ports.PortCore.PortConfig(); + + result.PortName = port.PortName; + result.Type = port.Type; + + return result; + } + + public static PublicModels.GciInitSlotResult MapInitResult(PublicModels.GciInitSlotResult result) + { + if (result == null) + return null; + + return new PublicModels.GciInitSlotResult + { + SlotId = result.SlotId, + Success = result.Success, + Message = result.Message + }; + } + + public static PublicModels.GciPasswordSource MapPasswordSourceBack(PasswordSource src) + { + return (PublicModels.GciPasswordSource)src; + } + + public static PublicModels.GciConfigSource MapConfigSourceBack(ConfigSource src) + { + return (PublicModels.GciConfigSource)src; + } + + public static PublicModels.GciPortConfig MapPortBack(PortConfig? port) + { + if (!port.HasValue) + return null; + + PortConfig value = port.Value; + + return new PublicModels.GciPortConfig + { + PortName = value.PortName, + Type = value.Type + }; + } + + public static PublicModels.GciPortConfig MapPortBack(IPort port) + { + if (port == null) + return null; + + return new PublicModels.GciPortConfig + { + PortName = port.GetPortName(), + Type = port.GetType().Name + }; + } + + public static MeterBatchDebugStatus ToMeterBatchDebugStatus(GciSlotInfo slot) + { + if (slot == null) + return null; + + return new MeterBatchDebugStatus + { + Slot = slot.SlotId, + Selected = true, + PcbId = slot.PcbId, + IsLoggedOn = false, + RequestPort = slot.RequestPort == null ? "" : slot.RequestPort.PortName, + StreamingPort = slot.StreamingPort == null ? "" : slot.StreamingPort.PortName, + FwVersion = "", + InterfaceVersion = "" + }; + } + + public static List ToMeterBatchDebugStatusList( + IEnumerable slots) + { + if (slots == null) + return new List(); + + return slots + .Where(x => x != null) + .Select(ToMeterBatchDebugStatus) + .ToList(); + } + #endregion + } +} diff --git a/GenesisCordonelInterface/API/GciPublicModels.cs b/GenesisCordonelInterface/API/PublicModels.cs similarity index 53% rename from GenesisCordonelInterface/API/GciPublicModels.cs rename to GenesisCordonelInterface/API/PublicModels.cs index aee36896a..6104fc4bc 100644 --- a/GenesisCordonelInterface/API/GciPublicModels.cs +++ b/GenesisCordonelInterface/API/PublicModels.cs @@ -3,9 +3,10 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Windows.Forms; +using Xylem.Common.Hardware.Interfaces.Ports.PortCore; using static GenesisCordonelInterface.API.InterfaceOutsideToGCI; using static Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.GenesisMeter; -using Xylem.Common.Hardware.Interfaces.Ports.PortCore; namespace GenesisCordonelInterface.API { @@ -46,7 +47,7 @@ namespace GenesisCordonelInterface.API /// /// This layer acts as a boundary between domain logic and integration logic. /// - public class GciPublicModels + public class PublicModels { /// /// Public DTOs exposed to external systems. @@ -55,6 +56,87 @@ namespace GenesisCordonelInterface.API /// #region ================================== PUBLIC MODELS =========================================== + public class RegisterReadResult + { + public bool Success { get; set; } + public string RegisterName { get; set; } + public string RawHex { get; set; } + public string ErrorMessage { get; set; } + + public override string ToString() + { + return string.Format( + "Success={0}, RegisterName={1}, RawHex={2}, ErrorMessage={3}", + Success, + RegisterName, + RawHex, + ErrorMessage); + } + } + + public class WorkerDebugStatus + { + public int Slot { get; set; } + public string Name { get; set; } + public int QueueLength { get; set; } + public bool IsBusy { get; set; } + public string CurrentOperation { get; set; } + public string LastError { get; set; } + public DateTime LastActivity { get; set; } + } + + public class MeterBatchDebugStatus + { + public int Slot { get; set; } + public bool Selected { get; set; } + public string PcbId { get; set; } + public bool IsLoggedOn { get; set; } + public string RequestPort { get; set; } + public string StreamingPort { get; set; } + public string RequestPortType { get; set; } + public string FwVersion { get; set; } + public string InterfaceVersion { get; set; } + } + public class RegisterWriteResult + { + public bool Success { get; set; } + public string RegisterName { get; set; } + public object WrittenValue { get; set; } + public bool StoreToDevice { get; set; } + public bool RefreshSystemState { get; set; } + public string ErrorMessage { get; set; } + + public override string ToString() + { + return $"Success={Success}, " + + $"Register={RegisterName ?? ""}, " + + $"Value={WrittenValue ?? ""}, " + + $"StoreToDevice={StoreToDevice}, " + + $"RefreshSystemState={RefreshSystemState}, " + + $"Error={ErrorMessage ?? ""}"; + } + } + + public class PortDetectionResult + { + public bool Success { get; set; } + public int Slot { get; set; } + public string PortName { get; set; } + public string PcbId { get; set; } + public string ErrorMessage { get; set; } + + public override string ToString() + { + return string.Format( + "Slot={0}, Success={1}, PortName={2}, PcbId={3}, ErrorMessage={4}", + Slot, + Success, + PortName, + PcbId, + ErrorMessage); + } + } + public class GciSlotInfo { public int SlotId { get; set; } @@ -63,12 +145,42 @@ namespace GenesisCordonelInterface.API public bool Success { get; set; } public string Message { get; set; } public string PcbId { get; set; } + public string Password { get; set; } public GciConfigSource ConfigSource { get; set; } public GciPasswordSource PasswordSource { get; set; } public GciPortConfig RequestPort { get; set; } public GciPortConfig StreamingPort { get; set; } + + public override string ToString() + { + return string.Format( + "SlotId={0}, Exists={1}, Success={2}, Message={3}, PcbId={4}, Password={5}, ConfigSource={6}, PasswordSource={7}, RequestPort={8}, StreamingPort={9}", + SlotId, + Exists, + Success, + Message, + PcbId, + Password, + ConfigSource, + PasswordSource, + RequestPort, + StreamingPort); + } + } + + public class GciAllSlotsInfo + { + public bool Success { get; set; } + public string Message { get; set; } + + public List Slots { get; set; } + + public override string ToString() + { + return $"Success={Success}, Count={Slots?.Count ?? 0}, Message={Message}"; + } } public class Result @@ -113,6 +225,36 @@ namespace GenesisCordonelInterface.API } } + public static GciPortConfig CreatePortConfig(string portName, string type) + { + if (string.IsNullOrWhiteSpace(portName)) + return null; + + return new GciPortConfig + { + PortName = portName, + Type = MapPortType(type) + }; + } + + private static string MapPortType(string type) + { + switch ((type ?? "").Trim().ToUpperInvariant()) + { + case "RFID": + return "Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.RfidSerialPort"; + + case "UART": + return "Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.UartSerialPort"; + + case "IRDA": + return "Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.IrdaSerialPort"; + + default: + return "Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.IrdaSerialPort"; + } + } + public class GciInitSlotRequest { public int SlotId { get; set; } @@ -120,11 +262,12 @@ namespace GenesisCordonelInterface.API public GciPasswordSource PasswordSource { get; set; } public GciPortConfig RequestPort { get; set; } public GciPortConfig StreamingPort { get; set; } + public string Password { get; set; } public override string ToString() { return string.Format( - "SlotId={0}, GciConfigSource={1}, PasswordSource={2}, RequestPort={3}, StreamingPort={4}", + "SlotId={0}, GciConfigSource={1}, PasswordSource={2}, RequestPort={3}, StreamingPort={4}, Password=hidden", SlotId, ConfigSource, PasswordSource, @@ -143,14 +286,23 @@ namespace GenesisCordonelInterface.API public string PcbId { get; set; } + public bool Created { get; set; } + + public bool Updated { get; set; } + + public bool AlreadyExists { get; set; } + public override string ToString() { return string.Format( - "SlotId={0}, Success={1}, Message={2}, PcbId={3}", + "SlotId={0}, Success={1}, Message={2}, PcbId={3}, Created={4}, Updated={5}, AlreadyExists={6}", SlotId, Success, Message, - PcbId); + PcbId, + Created, + Updated, + AlreadyExists); } } @@ -171,13 +323,9 @@ namespace GenesisCordonelInterface.API public class GciGetPcbIdResult { public int SlotId { get; set; } - public bool Success { get; set; } - public string PcbId { get; set; } - public string Message { get; set; } - public override string ToString() { return string.Format( @@ -199,6 +347,34 @@ namespace GenesisCordonelInterface.API public bool InterfaceSupportsFwVersion { get; set; } public List Registers { get; set; } = new List(); public string Message { get; set; } + + public override string ToString() + { + return string.Format( + "SlotId={0}, Success={1}, IsLoggedOn={2}, PcbId={3}, FwVersion={4}, InterfaceVersion={5}, InterfaceSupportsFwVersion={6}, Registers={7}, Message={8}", + SlotId, + Success, + IsLoggedOn, + PcbId, + FwVersion, + InterfaceVersion, + InterfaceSupportsFwVersion, + Registers == null ? 0 : Registers.Count, + Message); + } + } + + public class GciLoginResult + { + public bool Success { get; set; } + public int SlotId { get; set; } + public bool IsLoggedOn { get; set; } + public string Message { get; set; } + + public override string ToString() + { + return $"Slot={SlotId}, Success={Success}, IsLoggedOn={IsLoggedOn}, Message={Message ?? ""}"; + } } public class GciRegisterSnapshot @@ -229,83 +405,24 @@ namespace GenesisCordonelInterface.API Message); } } - #endregion - /// - /// Mapping methods between public DTOs and internal GCI models. - /// Ensures separation between external contracts and internal domain objects. - /// - #region ================================== OUTERN/INTERN and back models mapping ================================== - public static PasswordSource MapPasswordSource(GciPasswordSource src) + public class GciSetPasswordResult { - return (PasswordSource)src; - } + public int SlotId { get; set; } + public bool Success { get; set; } + public string Password { get; set; } + public string Message { get; set; } - public static ConfigSource MapConfigSource(GciConfigSource src) - { - return (ConfigSource)src; - } - public static Xylem.Common.Hardware.Interfaces.Ports.PortCore.PortConfig? MapPort(GciPortConfig port) - { - if (port == null) - return null; - - Xylem.Common.Hardware.Interfaces.Ports.PortCore.PortConfig result = new Xylem.Common.Hardware.Interfaces.Ports.PortCore.PortConfig(); - - result.PortName = port.PortName; - result.Type = port.Type; - - return result; - } - - public static GciInitSlotResult MapInitResult(GciInitSlotResult result) - { - if (result == null) - return null; - - return new GciInitSlotResult + public override string ToString() { - SlotId = result.SlotId, - Success = result.Success, - Message = result.Message - }; - } - - public static GciPasswordSource MapPasswordSourceBack(PasswordSource src) - { - return (GciPasswordSource)src; - } - - public static GciConfigSource MapConfigSourceBack(ConfigSource src) - { - return (GciConfigSource)src; - } - - public static GciPortConfig MapPortBack(PortConfig? port) - { - if (!port.HasValue) - return null; - - PortConfig value = port.Value; - - return new GciPortConfig - { - PortName = value.PortName, - Type = value.Type - }; - } - - public static GciPortConfig MapPortBack(IPort port) - { - if (port == null) - return null; - - return new GciPortConfig - { - PortName = port.GetPortName(), - Type = port.GetType().Name - }; + return string.Format( + "SlotId={0}, Success={1}, Password={2}, Message={3}", + SlotId, + Success, + Password, + Message); + } } #endregion } diff --git a/GenesisCordonelInterface/Core/Threading/ApiWorker/ApiWorker.cs b/GenesisCordonelInterface/Core/Threading/ApiWorker/ApiWorker.cs index 6d6ba7c31..3cdbc03e6 100644 --- a/GenesisCordonelInterface/Core/Threading/ApiWorker/ApiWorker.cs +++ b/GenesisCordonelInterface/Core/Threading/ApiWorker/ApiWorker.cs @@ -189,11 +189,31 @@ namespace GenesisCordonelInterface.Core.Threading private bool disposed; public string Name { get; private set; } - public int QueueLength { get { return queue.Count; } } + public int QueueLength + { + get + { + if (disposed || queue == null) + return 0; + + try + { + return queue.Count; + } + catch (ObjectDisposedException) + { + return 0; + } + } + } public bool IsBusy { get; private set; } public string CurrentOperation { get; private set; } public string LastError { get; private set; } public DateTime LastActivity { get; private set; } + public bool IsDisposed + { + get { return disposed; } + } /// /// Creates a new ApiWorker with its own background thread. @@ -238,24 +258,44 @@ namespace GenesisCordonelInterface.Core.Threading try { - IsBusy = true; - CurrentOperation = operationName ?? action.Method.Name; - LastActivity = DateTime.Now; - LastError = null; + queue.Add(() => + { + if (token.IsCancellationRequested) + { + tcs.TrySetCanceled(); + return; + } - var result = action(); - tcs.TrySetResult(result); + try + { + IsBusy = true; + CurrentOperation = operationName ?? action.Method.Name; + LastActivity = DateTime.Now; + LastError = null; + + var result = action(); + tcs.TrySetResult(result); + } + catch (Exception ex) + { + LastError = ex.Message; + tcs.TrySetException(ex); + } + finally + { + IsBusy = false; + CurrentOperation = null; + LastActivity = DateTime.Now; + } + }, token); } - catch (Exception ex) + catch (ObjectDisposedException ex) { - LastError = ex.Message; tcs.TrySetException(ex); } - finally + catch (InvalidOperationException ex) { - IsBusy = false; - CurrentOperation = null; - LastActivity = DateTime.Now; + tcs.TrySetException(new ObjectDisposedException(nameof(ApiWorker), ex)); } }, token); @@ -291,9 +331,19 @@ namespace GenesisCordonelInterface.Core.Threading /// private void WorkerLoop() { - foreach (var item in queue.GetConsumingEnumerable()) + try { - item(); + foreach (var item in queue.GetConsumingEnumerable()) + { + if (item == null) + continue; + + item(); + } + } + catch (ObjectDisposedException) + { + // worker is shutting down } } @@ -308,6 +358,10 @@ namespace GenesisCordonelInterface.Core.Threading disposed = true; queue.CompleteAdding(); + + if (Thread.CurrentThread != thread && thread.IsAlive) + thread.Join(1000); + queue.Dispose(); } } diff --git a/GenesisCordonelInterface/GenesisCordonelInterface.csproj b/GenesisCordonelInterface/GenesisCordonelInterface.csproj index b9ba6997d..5602bc870 100644 --- a/GenesisCordonelInterface/GenesisCordonelInterface.csproj +++ b/GenesisCordonelInterface/GenesisCordonelInterface.csproj @@ -56,9 +56,10 @@ + - + diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Common.dll b/GenesisCordonelInterface/RuntimePackage/Package/Common.dll new file mode 100644 index 000000000..3a0ca2782 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Common.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/GMH3x32E.dll b/GenesisCordonelInterface/RuntimePackage/Package/GMH3x32E.dll new file mode 100644 index 000000000..28b685563 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/GMH3x32E.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/GenesisCordonelInterface.exe b/GenesisCordonelInterface/RuntimePackage/Package/GenesisCordonelInterface.exe new file mode 100644 index 000000000..65d355290 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/GenesisCordonelInterface.exe differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/GenesisCordonelInterface.exe.config b/GenesisCordonelInterface/RuntimePackage/Package/GenesisCordonelInterface.exe.config new file mode 100644 index 000000000..36d3dd4fb --- /dev/null +++ b/GenesisCordonelInterface/RuntimePackage/Package/GenesisCordonelInterface.exe.config @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Logic.ProductionToProductMapper.dll b/GenesisCordonelInterface/RuntimePackage/Package/Logic.ProductionToProductMapper.dll new file mode 100644 index 000000000..a44b26686 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Logic.ProductionToProductMapper.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Logic.ProductionToProductMapper.dll.config b/GenesisCordonelInterface/RuntimePackage/Package/Logic.ProductionToProductMapper.dll.config new file mode 100644 index 000000000..c764f5323 --- /dev/null +++ b/GenesisCordonelInterface/RuntimePackage/Package/Logic.ProductionToProductMapper.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/GenesisCordonelInterface/RuntimePackage/Package/MeterFilesEraseRestore.json b/GenesisCordonelInterface/RuntimePackage/Package/MeterFilesEraseRestore.json new file mode 100644 index 000000000..47413deb6 --- /dev/null +++ b/GenesisCordonelInterface/RuntimePackage/Package/MeterFilesEraseRestore.json @@ -0,0 +1,15 @@ +{ + "Erase": [ + "1\\tstfile", + "1\\fdrdata", + "1\\logdata", + "1\\blklist", + "1\\pulsedbg", + "1\\upg*", + "1\\img*" + ], + "Restore": [ + { + } + ] +} \ No newline at end of file diff --git a/GenesisCordonelInterface/RuntimePackage/Package/NLog.dll b/GenesisCordonelInterface/RuntimePackage/Package/NLog.dll new file mode 100644 index 000000000..d519ffc52 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/NLog.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Newtonsoft.Json.dll b/GenesisCordonelInterface/RuntimePackage/Package/Newtonsoft.Json.dll new file mode 100644 index 000000000..341d08fc8 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Newtonsoft.Json.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/PdfSharp.dll b/GenesisCordonelInterface/RuntimePackage/Package/PdfSharp.dll new file mode 100644 index 000000000..4fcde52f1 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/PdfSharp.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/QRCoder.dll b/GenesisCordonelInterface/RuntimePackage/Package/QRCoder.dll new file mode 100644 index 000000000..6cfbf076e Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/QRCoder.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/RegAsm4.exe b/GenesisCordonelInterface/RuntimePackage/Package/RegAsm4.exe new file mode 100644 index 000000000..b157462fe Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/RegAsm4.exe differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/RestSharp.dll b/GenesisCordonelInterface/RuntimePackage/Package/RestSharp.dll new file mode 100644 index 000000000..ce4ed3839 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/RestSharp.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/TempFlansh.exe b/GenesisCordonelInterface/RuntimePackage/Package/TempFlansh.exe new file mode 100644 index 000000000..4ac8b87ed Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/TempFlansh.exe differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/TempFlansh.exe.config b/GenesisCordonelInterface/RuntimePackage/Package/TempFlansh.exe.config new file mode 100644 index 000000000..4bfa00561 --- /dev/null +++ b/GenesisCordonelInterface/RuntimePackage/Package/TempFlansh.exe.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.CommonCore.Configuration.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.CommonCore.Configuration.dll new file mode 100644 index 000000000..25f68e6db Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.CommonCore.Configuration.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.CommonCore.ThreadWatcher.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.CommonCore.ThreadWatcher.dll new file mode 100644 index 000000000..cafde6486 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.CommonCore.ThreadWatcher.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.CommonCore.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.CommonCore.dll new file mode 100644 index 000000000..c69d0853f Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.CommonCore.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.Interfaces.Ports.PortCore.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.Interfaces.Ports.PortCore.dll new file mode 100644 index 000000000..538266b49 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.Interfaces.Ports.PortCore.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.dll new file mode 100644 index 000000000..43ee61d40 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.Interfaces.Protocols.ProtocolCore.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.Interfaces.Protocols.ProtocolCore.dll new file mode 100644 index 000000000..b7a881017 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.Interfaces.Protocols.ProtocolCore.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.Interfaces.Protocols.TransmitProtocol.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.Interfaces.Protocols.TransmitProtocol.dll new file mode 100644 index 000000000..1a01bc8a4 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.Interfaces.Protocols.TransmitProtocol.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.ERegister.DataPackages.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.ERegister.DataPackages.dll new file mode 100644 index 000000000..9c4253906 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.ERegister.DataPackages.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll new file mode 100644 index 000000000..52337a62c Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll.config b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll.config new file mode 100644 index 000000000..c764f5323 --- /dev/null +++ b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.dll new file mode 100644 index 000000000..10895e3f6 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig.dll new file mode 100644 index 000000000..a4a3ca94e Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll new file mode 100644 index 000000000..135bdac67 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll.config b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll.config new file mode 100644 index 000000000..c764f5323 --- /dev/null +++ b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll new file mode 100644 index 000000000..f15f3ed83 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll.config b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll.config new file mode 100644 index 000000000..c764f5323 --- /dev/null +++ b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd.dll new file mode 100644 index 000000000..8bf4ebdac Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.ProtocolCore.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.ProtocolCore.dll new file mode 100644 index 000000000..8660a2540 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.ProtocolCore.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.dll new file mode 100644 index 000000000..e24ea601e Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.dll new file mode 100644 index 000000000..e3af64124 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Registers.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Registers.dll new file mode 100644 index 000000000..e99a1caf8 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.Genesis.Registers.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.MagFlux.DataPackages.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.MagFlux.DataPackages.dll new file mode 100644 index 000000000..ad1316027 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.MagFlux.DataPackages.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxConfig.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxConfig.dll new file mode 100644 index 000000000..e91910d86 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxConfig.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore.dll new file mode 100644 index 000000000..bfd721bfb Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.MagFlux.Protocols.RequestProtocol.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.MagFlux.Protocols.RequestProtocol.dll new file mode 100644 index 000000000..da78f17b3 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.MagFlux.Protocols.RequestProtocol.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.MagFlux.Protocols.StreamingProtocol.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.MagFlux.Protocols.StreamingProtocol.dll new file mode 100644 index 000000000..15e944356 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.MagFlux.Protocols.StreamingProtocol.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.WaterMeterCore.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.WaterMeterCore.dll new file mode 100644 index 000000000..7f0cd30c9 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.WaterMeterCore.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.WaterMeterRegisters.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.WaterMeterRegisters.dll new file mode 100644 index 000000000..80fed6541 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.WaterMeterRegisters.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.eRegister.Protocols.StreamingProtocol.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.eRegister.Protocols.StreamingProtocol.dll new file mode 100644 index 000000000..cfda2974c Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.eRegister.Protocols.StreamingProtocol.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.eRegister.eRegisterCore.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.eRegister.eRegisterCore.dll new file mode 100644 index 000000000..26a98f33f Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Hardware.WaterMeter.eRegister.eRegisterCore.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Logic.ProductionOrderCore.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Logic.ProductionOrderCore.dll new file mode 100644 index 000000000..00996f7eb Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Logic.ProductionOrderCore.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Logic.RelatePcb.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Logic.RelatePcb.dll new file mode 100644 index 000000000..f64f03918 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Logic.RelatePcb.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Logic.ServiceCore.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Logic.ServiceCore.dll new file mode 100644 index 000000000..04a73e2fc Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Logic.ServiceCore.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Logic.SoftwareAccessHelper.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Logic.SoftwareAccessHelper.dll new file mode 100644 index 000000000..32d3bb7d6 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Logic.SoftwareAccessHelper.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Metrology.Measurements.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Metrology.Measurements.dll new file mode 100644 index 000000000..5a9eec1a4 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Metrology.Measurements.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Ui.CordonelPreadjustmentUi.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Ui.CordonelPreadjustmentUi.dll new file mode 100644 index 000000000..ad38ae101 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Ui.CordonelPreadjustmentUi.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Ui.CordonelPreadjustmentUi.dll.config b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Ui.CordonelPreadjustmentUi.dll.config new file mode 100644 index 000000000..1ff53b0cd --- /dev/null +++ b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Ui.CordonelPreadjustmentUi.dll.config @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Ui.GenesisToolBox.exe b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Ui.GenesisToolBox.exe new file mode 100644 index 000000000..e346ec7c4 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Ui.GenesisToolBox.exe differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Ui.GenesisToolBox.exe.config b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Ui.GenesisToolBox.exe.config new file mode 100644 index 000000000..0e4e85051 --- /dev/null +++ b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Ui.GenesisToolBox.exe.config @@ -0,0 +1,46 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Utils.ByteArrayStyle.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Utils.ByteArrayStyle.dll new file mode 100644 index 000000000..1bbc296b2 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Utils.ByteArrayStyle.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Utils.Crc16Ccitt.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Utils.Crc16Ccitt.dll new file mode 100644 index 000000000..b2abafae4 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Utils.Crc16Ccitt.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Utils.Logging.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Utils.Logging.dll new file mode 100644 index 000000000..b91c2647b Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Utils.Logging.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Utils.ProcessExec.dll b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Utils.ProcessExec.dll new file mode 100644 index 000000000..6e67bfbe4 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/Xylem.Common.Utils.ProcessExec.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/XylemCommonUiLegacyGenCtl.dll b/GenesisCordonelInterface/RuntimePackage/Package/XylemCommonUiLegacyGenCtl.dll new file mode 100644 index 000000000..90c6a770b Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/XylemCommonUiLegacyGenCtl.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/XylemCommonUiLegacyGenCtl.dll.config b/GenesisCordonelInterface/RuntimePackage/Package/XylemCommonUiLegacyGenCtl.dll.config new file mode 100644 index 000000000..c764f5323 --- /dev/null +++ b/GenesisCordonelInterface/RuntimePackage/Package/XylemCommonUiLegacyGenCtl.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/GenesisCordonelInterface/RuntimePackage/Package/configuration.json b/GenesisCordonelInterface/RuntimePackage/Package/configuration.json new file mode 100644 index 000000000..66a2b2a21 --- /dev/null +++ b/GenesisCordonelInterface/RuntimePackage/Package/configuration.json @@ -0,0 +1,24132 @@ +{ + "CONFIGEXCHANGE": { + "id": 4, + "version": { + "first": 3, + "last": 245 + }, + "registers": { + "Privilege": { + "id": 0, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Written to set the login level, followed by the password. Note, this can be read at any login level including 0.", + "version": { + "first": 3, + "last": 245 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 8 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Used at the same time as Password so probably wants to have column S indicated.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "Password": { + "id": 1, + "details": [ + { + "type": "uint96_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Password for logging in, requires 3 consecutive writes", + "version": { + "first": 3, + "last": 245 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "Used in login.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "FOpen": { + "id": 2, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to open a file on the meter, handle returned", + "version": { + "first": 20, + "last": 245 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Firmware upgrade may well use these.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "FClose": { + "id": 3, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to close a file on the meter", + "version": { + "first": 20, + "last": 245 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Firmware upgrade may well use these.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "FRead": { + "id": 4, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to read bytes from an open file", + "version": { + "first": 20, + "last": 245 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Firmware upgrade may well use these.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "FWrite": { + "id": 5, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to write bytes to an open file", + "version": { + "first": 20, + "last": 245 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Firmware upgrade may well use these.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "FSeek": { + "id": 6, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to seek within an open file", + "version": { + "first": 20, + "last": 245 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Firmware upgrade may well use these.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "FTell": { + "id": 7, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to determine position within an open file", + "version": { + "first": 20, + "last": 245 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Firmware upgrade may well use these.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "Remove": { + "id": 8, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to delete a file", + "version": { + "first": 20, + "last": 245 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Firmware upgrade may well use these.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "FEOF": { + "id": 9, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this determine whether the current position in an open file is the end of the file", + "version": { + "first": 20, + "last": 245 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Firmware upgrade may well use these.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "Catalogue": { + "id": 10, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Returns a list of files in the filesystem that matches a string containing wildcards passed in", + "version": { + "first": 49, + "last": 245 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Firmware upgrade may well use these.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "PCBSerialNumber": { + "id": 12, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "String containing the PCB serial number. Note, this can be read at any login level including 0", + "version": { + "first": 59, + "last": 245 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": true, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "Used for identification and login.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "ConfigAccessRights": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bitmask of login levels permitted to manipulate dangerous files", + "version": { + "first": 59, + "last": 245 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "I don't expect this to be changed.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "FFlush": { + "id": 14, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Remote file operations, use this to flush write buffers to an open file", + "version": { + "first": 66, + "last": 245 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Firmware upgrade may well use these.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + } + }, + "status": { + "LOCKED_OUT": { + "id": 0 + }, + "AUTHENTICATION_FAILURE": { + "id": 1 + }, + "ACCESS_DENIED": { + "id": 2 + }, + "UNKNOWN_PARAMETER": { + "id": 3 + }, + "IN_USE": { + "id": 4 + }, + "SIZES_DONT_MATCH": { + "id": 5 + }, + "CANT_READ_CONFIG_FILE": { + "id": 6 + }, + "USER_NOT_KNOWN": { + "id": 7 + }, + "CANT_CREATE_CONFIG_FILE": { + "id": 8 + }, + "STORE_DIDNT_STORE": { + "id": 9 + }, + "STORE_CORRUPT": { + "id": 10 + }, + "EXPECTED_WRITE": { + "id": 11 + }, + "EXPECTED_READ": { + "id": 12 + }, + "STOP_CYCLING": { + "id": 13 + }, + "TOO_MANY_OPEN": { + "id": 14 + }, + "NEVER_OPENED": { + "id": 15 + }, + "FILE_PROTECTED": { + "id": 16 + }, + "PARTIAL_RECALL": { + "id": 17 + }, + "DEFAULT_PASSWORD_USED": { + "id": 18 + } + } + }, + "CUSTOMER": { + "id": 9, + "version": { + "first": 1, + "last": 167 + }, + "registers": { + "AlarmStatus0": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 0-3.", + "version": { + "first": 1, + "last": 167 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "AlarmStatus1": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 4-7.", + "version": { + "first": 1, + "last": 167 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "TriggerAlarmCancel": { + "id": 2, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Any set bits manually clear the corresponding alarm.", + "version": { + "first": 1, + "last": 110 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Any set bits manually clear the corresponding alarm.", + "version": { + "first": 111, + "last": 167 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [], + "remarks": "Cancel all alarms at the end of production.", + "region": { + "emea": { + "values": { + "default": 4294967295 + } + }, + "na": { + "values": { + "default": 4294967295 + } + } + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "AlarmStatus2": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 8-11.", + "version": { + "first": 26, + "last": 167 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "AlarmStatus3": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 12-15.", + "version": { + "first": 26, + "last": 167 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "AlarmStatus4": { + "id": 5, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 16-19.", + "version": { + "first": 26, + "last": 167 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "AlarmStatus5": { + "id": 6, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 20-23.", + "version": { + "first": 26, + "last": 167 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "AlarmStatus6": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 24-27.", + "version": { + "first": 26, + "last": 167 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "AlarmStatus7": { + "id": 8, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "8 bit counts corresponding to alarms 28-31.", + "version": { + "first": 26, + "last": 167 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "AlarmEnableMask": { + "id": 9, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are being monitored.", + "version": { + "first": 26, + "last": 110 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are being monitored.", + "version": { + "first": 111, + "last": 162 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Bitmask�of the alarms that we are interested in. I can imagine some customers may have different requirements to others. The radio does change this.", + "region": { + "emea": { + "values": { + "default": 32851 + } + }, + "na": { + "values": { + "default": 0 + } + } + } + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are being monitored.", + "version": { + "first": 163, + "last": 163 + }, + "values": { + "default": 49235, + "minimum": 2, + "maximum": 654915 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Bitmask�of the alarms that we are interested in. I can imagine some customers may have different requirements to others. The radio does change this.", + "region": { + "emea": { + "values": { + "default": 49235 + } + }, + "na": { + "values": { + "default": 0 + } + } + } + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are being monitored.", + "version": { + "first": 164, + "last": 167 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Bitmask�of the alarms that we are interested in. I can imagine some customers may have different requirements to others. The radio does change this.", + "region": { + "emea": { + "values": { + "default": 49235 + } + }, + "na": { + "values": { + "default": 0 + } + } + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "AlarmBroadcastMask": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which will generate events.", + "version": { + "first": 26, + "last": 110 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which will generate events.", + "version": { + "first": 111, + "last": 167 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "custom", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "This updates the same value as�AlarmEnableMask, best to avoid changing it.", + "region": { + "emea": { + "values": { + "default": 32851 + } + }, + "na": { + "values": { + "default": 0 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "AlarmVisualMask": { + "id": 11, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are displayed with IDs and the alarm icon.", + "version": { + "first": 110, + "last": 110 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are displayed with IDs and the alarm icon.", + "version": { + "first": 111, + "last": 162 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "custom", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Bitmask of the alarms that will be shown on the display (both the alarm ID and the flag icon). Again, I can imagine different customers wanting different things. The radio seems to set this but it seems to be a hardwired value.", + "region": { + "emea": { + "values": { + "default": 8156 + } + }, + "na": { + "values": { + "default": 0 + } + } + } + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are displayed with IDs and the alarm icon.", + "version": { + "first": 163, + "last": 163 + }, + "values": { + "default": 16382, + "minimum": 16382, + "maximum": 16382 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Bitmask of the alarms that will be shown on the display (both the alarm ID and the flag icon). Again, I can imagine different customers wanting different things. The radio seems to set this but it seems to be a hardwired value.", + "region": { + "emea": { + "values": { + "default": 16382 + } + }, + "na": { + "values": { + "default": 0 + } + } + } + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit set of those alarms which are displayed with IDs and the alarm icon.", + "version": { + "first": 164, + "last": 167 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Bitmask of the alarms that will be shown on the display (both the alarm ID and the flag icon). Again, I can imagine different customers wanting different things. The radio seems to set this but it seems to be a hardwired value.", + "region": { + "emea": { + "values": { + "DN40": 8156, + "DN50": 8156, + "DN65": 8156, + "DN80": 8156, + "DN100": 8156, + "DN125": 8156, + "DN150": 8156, + "DN200": 16382, + "DN250": 16382, + "DN300": 16382 + } + }, + "na": { + "values": { + "default": 0 + } + } + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "AlarmVisualAutoClearMask": { + "id": 12, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Alarms that have their display automatically cleared", + "version": { + "first": 110, + "last": 110 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Alarms that have their display automatically cleared", + "version": { + "first": 111, + "last": 167 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Not in use, ignore.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "ExcessFlowVolumeThreshold": { + "id": 13, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which broken pipe alarm is set in 1/256 l/h. Due to rounding the value read back may not be exactly the value written. This is why the statictype is given as 'approximate'", + "version": { + "first": 61, + "last": 110 + }, + "values": { + "default": 639590, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "approximate" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which broken pipe alarm is set in 1/256 l/h. Due to rounding the value read back may not be exactly the value written. This is why the statictype is given as 'approximate'", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 639590, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "approximate" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which broken pipe alarm is set in 1/256 l/h. Due to rounding the value read back may not be exactly the value written. This is why the statictype is given as 'approximate'", + "version": { + "first": 119, + "last": 132 + }, + "values": { + "default": 639590, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "approximate" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which broken pipe alarm is set in 1/256 l/h. Due to rounding the value read back may not be exactly the value written. This is why the statictype is given as 'approximate'", + "version": { + "first": 133, + "last": 167 + }, + "si_transform": { + "remarks": "Cubic Meters per Second: conversion of 1/256 l/h flow rate units, the volume (liters = (1 / 256) * 10^-3 m^3 = 3.90625 * 10^-6 m^3) and time (hours = 3600 s) into SI base units. Flow rate = (3.90625 * 10^-6 m^3) / (3600 s) = 1.085069444 * 10^-9 m^3/s.", + "units": "m^3/s", + "scale_float_mult": 1.0, + "scale_power_2": -8, + "scale_power_10": -3, + "scale_float_div": 3600.0, + "offset": 0 + }, + "values": { + "default": 639999, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "approximate", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "This is just the flow rate above which you'll get a broken pipe alarm (assuming it is above for ExcessFlowTimeThreshold). This, along with all the alarm configuration settings seem like things that different customers might want different settings for. However I believe most can be changed via the radio. A.F.: Register is for the EMEA alarms so we don't need them for any NA meter sizes. NA alarms are configured at uniontown using UI-1236. Should NA columns be cleared?", + "region": { + "emea": { + "values": { + "DN40": 6400000, + "DN50": 12800000, + "DN65": 16000000, + "DN80": 22400000, + "DN100": 32000000, + "DN125": 64000000, + "DN150": 96000000, + "DN200": 128000000, + "DN250": 192000000, + "DN300": 256000000 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "LeakTimeThreshold": { + "id": 14, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for leak alarm in minutes", + "version": { + "first": 61, + "last": 110 + }, + "values": { + "default": 10080, + "minimum": 0, + "maximum": 69632 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for leak alarm in minutes", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 10080, + "minimum": 0, + "maximum": 69632 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for leak alarm in minutes", + "version": { + "first": 119, + "last": 167 + }, + "si_transform": { + "remarks": "Seconds: time in minutes ...", + "units": "s", + "scale_float_mult": 60.0, + "scale_power_2": 0, + "scale_power_10": 0, + "scale_float_div": 1.0, + "offset": 0 + }, + "values": { + "default": 360, + "minimum": 0, + "maximum": 69632 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "custom", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Default for J.S. is 20160. A.F.: Register is for the EMEA alarms so we don't need them for any NA meter sizes. NA alarms are configured at uniontown using UI-1236. Should NA columns be cleared?", + "region": { + "emea": { + "values": { + "default": 20160 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "ReverseFlowTimeThreshold": { + "id": 15, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of minutes of reverse flow required to set reverse flow alarm", + "version": { + "first": 61, + "last": 110 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of minutes of reverse flow required to set reverse flow alarm", + "version": { + "first": 111, + "last": 142 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of minutes of reverse flow required to set reverse flow alarm", + "version": { + "first": 143, + "last": 167 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "custom", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "15 mins for EMEA", + "region": { + "emea": { + "values": { + "default": 15 + } + }, + "na": { + "values": { + "default": 60 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "Locale": { + "id": 18, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Timezone in which this application is set to run.", + "version": { + "first": 24, + "last": 167 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": true, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "VaKo?? We need a seperation of Timezone an display view. A.F.: There are a lot of locales, not just one per time zone. Using the correct locale should set the display and the timezone correctly.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "AppArrangement": { + "id": 19, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "A name for the arrangement of applications on the meter", + "version": { + "first": 130, + "last": 167 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "This is a readonly register that gives the firmware a hint about whether it is set up as an EMEA or NA meter (or neither). You can ignore or use it to check the value is as expected. Might be worth checking it.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "RebootCount": { + "id": 20, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of times the meter has rebooted", + "version": { + "first": 73, + "last": 110 + }, + "values": { + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of times the meter has rebooted", + "version": { + "first": 111, + "last": 167 + }, + "values": { + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "ExcessFlowTimeThreshold": { + "id": 21, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for broken pipe alarm in minutes", + "version": { + "first": 80, + "last": 110 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 69632 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for broken pipe alarm in minutes", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 69632 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for broken pipe alarm in minutes", + "version": { + "first": 119, + "last": 167 + }, + "values": { + "default": 180, + "minimum": 0, + "maximum": 69632 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Default for J.S. is 5.", + "region": { + "emea": { + "values": { + "default": 5 + } + }, + "na": { + "values": { + "default": 5 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "LeakFlowThreshold": { + "id": 22, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which leak alarm can be set in 1/256 l/h. Due to rounding the value read back may not be exactly the value written. This is why the statictype is given as 'approximate'", + "version": { + "first": 80, + "last": 110 + }, + "values": { + "default": 12800, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "approximate" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which leak alarm can be set in 1/256 l/h. Due to rounding the value read back may not be exactly the value written. This is why the statictype is given as 'approximate'", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 12800, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "approximate" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which leak alarm can be set in 1/256 l/h. Due to rounding the value read back may not be exactly the value written. This is why the statictype is given as 'approximate'", + "version": { + "first": 119, + "last": 132 + }, + "values": { + "default": 5529, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "approximate" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Flow rate above which leak alarm can be set in 1/256 l/h. Due to rounding the value read back may not be exactly the value written. This is why the statictype is given as 'approximate'", + "version": { + "first": 133, + "last": 167 + }, + "values": { + "default": 6399, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "approximate", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "This is just the flow rate above which you'll get a leak alarm (assuming it is above for LeakTimeThreshold). A.F.: Register is for the EMEA alarms so we don't need them for any NA meter sizes. NA alarms are configured at uniontown using UI-1236. Should NA columns be cleared?", + "region": { + "emea": { + "values": { + "DN40": 64000, + "DN50": 96000, + "DN65": 160000, + "DN80": 224000, + "DN100": 320000, + "DN125": 640000, + "DN150": 960000, + "DN200": 1280000, + "DN250": 2240000, + "DN300": 2560000 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "MfgCharge": { + "id": 23, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Charge in uAs available in manufacturing (read only)", + "version": { + "first": 84, + "last": 167 + }, + "si_transform": { + "remarks": "Coulombs: charge in uAs ...", + "units": "C", + "scale_float_mult": 1.0, + "scale_power_2": 0, + "scale_power_10": -6, + "scale_float_div": 1.0, + "offset": 0 + }, + "values": { + "default": 181440000 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [], + "remarks": "Check totalusedcharge against this to ensure battery usage in manufacturing isn't too high", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "TemperatureHighThreshold": { + "id": 24, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High temperature alarm threshold in 0.1�C", + "version": { + "first": 88, + "last": 100 + }, + "values": { + "default": 500, + "minimum": 0, + "maximum": 800 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High temperature alarm threshold in 0.1�C", + "version": { + "first": 101, + "last": 110 + }, + "values": { + "default": 500, + "minimum": 0, + "maximum": 800 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High temperature alarm threshold in 0.1�C", + "version": { + "first": 111, + "last": 167 + }, + "si_transform": { + "remarks": "Degrees Celsius: temperature in 0.1 degrees C ...", + "units": "�C", + "scale_float_mult": 1.0, + "scale_power_2": 0, + "scale_power_10": -1, + "scale_float_div": 1.0, + "offset": 0 + }, + "values": { + "default": 500, + "minimum": 0, + "maximum": 800 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Checked from J.S.", + "region": { + "emea": { + "values": { + "default": 500 + } + }, + "na": { + "values": { + "default": 270 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "TemperatureHighDelay": { + "id": 25, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high temperature alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high temperature alarm in seconds", + "version": { + "first": 111, + "last": 167 + }, + "si_transform": { + "remarks": "Seconds: time in seconds ...", + "units": "s", + "scale_float_mult": 60.0, + "scale_power_2": 0, + "scale_power_10": 0, + "scale_float_div": 1.0, + "offset": 0 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Checked from J.S.", + "region": { + "emea": { + "values": { + "default": 300 + } + }, + "na": { + "values": { + "default": 60 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "TemperatureLowThreshold": { + "id": 26, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low temperature alarm threshold in 0.1�C", + "version": { + "first": 88, + "last": 100 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low temperature alarm threshold in 0.1�C", + "version": { + "first": 101, + "last": 110 + }, + "values": { + "default": 20, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low temperature alarm threshold in 0.1�C", + "version": { + "first": 111, + "last": 167 + }, + "values": { + "default": 20, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Checked from J.S.", + "region": { + "emea": { + "values": { + "default": 20 + } + }, + "na": { + "values": { + "default": 20 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "TemperatureLowDelay": { + "id": 27, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low temperature alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low temperature alarm in seconds", + "version": { + "first": 111, + "last": 167 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Checked from J.S.", + "region": { + "emea": { + "values": { + "default": 300 + } + }, + "na": { + "values": { + "default": 60 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureHighThreshold": { + "id": 28, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High pressure alarm threshold in Pa", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 1600000, + "minimum": 0, + "maximum": 2550000 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High pressure alarm threshold in Pa", + "version": { + "first": 111, + "last": 121 + }, + "values": { + "default": 1600000, + "minimum": 0, + "maximum": 2550000 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "High pressure alarm threshold in Pa", + "version": { + "first": 122, + "last": 167 + }, + "values": { + "default": 1600000, + "minimum": 0, + "maximum": 2550000 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": "custom", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Absolute or relative? A.F.: gauge pressure.", + "region": { + "emea": { + "values": { + "default": 1600000 + } + }, + "na": { + "values": { + "default": 1380000 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureHighDelay": { + "id": 29, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high pressure alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high pressure alarm in seconds", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for high pressure alarm in seconds", + "version": { + "first": 119, + "last": 167 + }, + "si_transform": { + "remarks": "Seconds: ...", + "units": "s", + "scale_float_mult": 60.0, + "scale_power_2": 0, + "scale_power_10": 0, + "scale_float_div": 1.0, + "offset": 0 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Checked from J.S.", + "region": { + "emea": { + "values": { + "default": 300 + } + }, + "na": { + "values": { + "default": 60 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureLowThreshold": { + "id": 30, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low pressure alarm threshold in Pa", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 30000, + "minimum": 0, + "maximum": 2550000 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low pressure alarm threshold in Pa", + "version": { + "first": 111, + "last": 121 + }, + "values": { + "default": 30000, + "minimum": 0, + "maximum": 2550000 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Low pressure alarm threshold in Pa", + "version": { + "first": 122, + "last": 167 + }, + "values": { + "default": 30000, + "minimum": 0, + "maximum": 2550000 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Absolute or relative? A.F.: gauge pressure.", + "region": { + "emea": { + "values": { + "default": 30000 + } + }, + "na": { + "values": { + "default": 240000 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureLowDelay": { + "id": 31, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low pressure alarm in seconds", + "version": { + "first": 88, + "last": 110 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low pressure alarm in seconds", + "version": { + "first": 111, + "last": 118 + }, + "values": { + "default": 300, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time threshold for low pressure alarm in seconds", + "version": { + "first": 119, + "last": 167 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 10800 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Checked from J.S.", + "region": { + "emea": { + "values": { + "default": 300 + } + }, + "na": { + "values": { + "default": 60 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "StoreConfiguration": { + "id": 32, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Store all configuration items in non-volatile memory.", + "version": { + "first": 88, + "last": 130 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Store all configuration items in non-volatile memory.", + "version": { + "first": 131, + "last": 167 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "You do need to use this if you change any parameters in CUSTOMER and want to keep them.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "finalize" + } + } + ] + }, + "SerialNumber": { + "id": 33, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Customer serial number string", + "version": { + "first": 139, + "last": 167 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "BackupCalendarSeconds": { + "id": 34, + "details": [ + { + "type": "time_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "NA", + "lvl8": "NA" + }, + "description": "Internal backup of calendar seconds", + "version": { + "first": 145, + "last": 167 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "Internal use in firmware only", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "InstallationTime": { + "id": 35, + "details": [ + { + "type": "time_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Datetime in seconds since 1/1/2000 00:00:00. Time meter was determined to have been installed. 0 means not installed.", + "version": { + "first": 147, + "last": 167 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "Write to zero before leaving manufacturing to ensure not marked as 'installed'.", + "region": { + "emea": { + "values": { + "default": 0 + } + }, + "na": { + "values": { + "default": 0 + } + } + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "LocaleDecimalPoint": { + "id": 36, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Read to view the string used as a decimal point for this locale", + "version": { + "first": 151, + "last": 167 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "LocaleThousandsSeparator": { + "id": 37, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Read to view the string used as a thousands separarator for this locale", + "version": { + "first": 151, + "last": 167 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "InternalLoginTest": { + "id": 38, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Test whether the internal login works. Start test by writing '1' then log out to enable the test to run. Log back in and read back this register for result (see status codes)", + "version": { + "first": 157, + "last": 167 + }, + "values": { + "minimum": 0, + "maximum": 65535 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [], + "remarks": "Helper function to test the configexchange login at the internal level will succeed (that is, that the password is as expected). This should be tested after installation of password file at end of line. Add to production test if register present in firmware.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "NoFlowLimit": { + "id": 39, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "time threshold in Minutes for NoFlowAlarm trigger NoFlowAlarm trigger; 251002 Clemens: clamp the �last� field to 161 and may need to use the �exclude� versions mechanism if 1.3 development includes work for CORDHW-3124.", + "version": { + "first": 161, + "last": 167 + }, + "values": { + "default": 43200, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "This has default setting for DEWA customer. Unsupported.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "NoFlowAlarmResetHysteresis": { + "id": 40, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "number of consecutive samples (Minutes) before NoFlow Alarm gets cleared; 251002 Clemens: clamp the �last� field to 161 and may need to use the �exclude� versions mechanism if 1.3 development includes work for CORDHW-3124.", + "version": { + "first": 161, + "last": 167 + }, + "values": { + "default": 5, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "This has default setting for DEWA customer. Unsupported.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "Gradient_Averaging_Samples": { + "id": 41, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "number of samples for moving average (window size)", + "version": { + "first": 165, + "last": 167 + }, + "values": { + "default": 5, + "minimum": 1, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "This has default setting for Canal de Isabel customer. Unsupported.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "Gradient_Pos_Granularity_Steps": { + "id": 42, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Unitless granularity steps for positive pressure Gradient alarm threshold", + "version": { + "first": 165, + "last": 167 + }, + "values": { + "default": 200, + "minimum": 1, + "maximum": 1600 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "This has default setting for Canal de Isabel customer. Unsupported.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "Gradient_Neg_Granularity_Steps": { + "id": 43, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Unitless granularity steps for negative pressure Gradient alarm threshold", + "version": { + "first": 165, + "last": 167 + }, + "values": { + "default": 200, + "minimum": 1, + "maximum": 1600 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "This has default setting for Canal de Isabel customer. Unsupported.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "Gradient_Samples_Alarmtrigger": { + "id": 44, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of consecutive samples above threshold before Alarm gets triggered", + "version": { + "first": 165, + "last": 167 + }, + "values": { + "default": 3, + "minimum": 1, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "This has default setting for Canal de Isabel customer. Unsupported.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + } + }, + "status": { + "REBOOT": { + "id": 0 + }, + "REBOOT_STOP": { + "id": 1 + }, + "LOW_BATTERY": { + "id": 2 + }, + "LOW_BATTERY_STOP": { + "id": 3 + }, + "VERY_LOW_BATTERY": { + "id": 4 + }, + "VERY_LOW_BATTERY_STOP": { + "id": 5 + }, + "CONFIG_ERROR": { + "id": 6 + }, + "CONFIG_ERROR_STOP": { + "id": 7 + }, + "EMPTY_PIPE": { + "id": 8 + }, + "EMPTY_PIPE_STOP": { + "id": 9 + }, + "MAGNETIC_TAMPER": { + "id": 10 + }, + "MAGNETIC_TAMPER_STOP": { + "id": 11 + }, + "REVERSE_FLOW": { + "id": 12 + }, + "REVERSE_FLOW_STOP": { + "id": 13 + }, + "SUSPECT_LEAK": { + "id": 14 + }, + "SUSPECT_LEAK_STOP": { + "id": 15 + }, + "BROKEN_PIPE": { + "id": 16 + }, + "BROKEN_PIPE_STOP": { + "id": 17 + }, + "LOW_PRESSURE": { + "id": 18 + }, + "LOW_PRESSURE_STOP": { + "id": 19 + }, + "HIGH_PRESSURE": { + "id": 20 + }, + "HIGH_PRESSURE_STOP": { + "id": 21 + }, + "LOW_TEMPERATURE": { + "id": 22 + }, + "LOW_TEMPERATURE_STOP": { + "id": 23 + }, + "HIGH_TEMPERATURE": { + "id": 24 + }, + "HIGH_TEMPERATURE_STOP": { + "id": 25 + }, + "RADIO_ERROR": { + "id": 26 + }, + "RADIO_ERROR_STOP": { + "id": 27 + }, + "METROLOGY_PARAMS": { + "id": 28 + }, + "METROLOGY_PARAMS_STOP": { + "id": 29 + }, + "METROLOGY_MEASURE": { + "id": 30 + }, + "METROLOGY_MEASURE_STOP": { + "id": 31 + }, + "UNALLOCATED_6": { + "id": 32 + }, + "UNALLOCATED_6_STOP": { + "id": 33 + }, + "UNALLOCATED_7": { + "id": 34 + }, + "UNALLOCATED_7_STOP": { + "id": 35 + }, + "UNALLOCATED_8": { + "id": 36 + }, + "UNALLOCATED_8_STOP": { + "id": 37 + }, + "UNALLOCATED_9": { + "id": 38 + }, + "UNALLOCATED_9_STOP": { + "id": 39 + }, + "UNALLOCATED_10": { + "id": 40 + }, + "UNALLOCATED_10_STOP": { + "id": 41 + }, + "UNALLOCATED_11": { + "id": 42 + }, + "UNALLOCATED_11_STOP": { + "id": 43 + }, + "UNALLOCATED_12": { + "id": 44 + }, + "UNALLOCATED_12_STOP": { + "id": 45 + }, + "UNALLOCATED_13": { + "id": 46 + }, + "UNALLOCATED_13_STOP": { + "id": 47 + }, + "UNALLOCATED_14": { + "id": 48 + }, + "UNALLOCATED_14_STOP": { + "id": 49 + }, + "UNALLOCATED_15": { + "id": 50 + }, + "UNALLOCATED_15_STOP": { + "id": 51 + }, + "UNALLOCATED_16": { + "id": 52 + }, + "UNALLOCATED_16_STOP": { + "id": 53 + }, + "UNALLOCATED_17": { + "id": 54 + }, + "UNALLOCATED_17_STOP": { + "id": 55 + }, + "UNALLOCATED_18": { + "id": 56 + }, + "UNALLOCATED_18_STOP": { + "id": 57 + }, + "UNALLOCATED_19": { + "id": 58 + }, + "UNALLOCATED_19_STOP": { + "id": 59 + }, + "UNALLOCATED_20": { + "id": 60 + }, + "UNALLOCATED_20_STOP": { + "id": 61 + }, + "UNALLOCATED_21": { + "id": 62 + }, + "UNALLOCATED_21_STOP": { + "id": 63 + }, + "UNKNOWN_PARAMETER": { + "id": 64 + }, + "LOCALE_UNDEFINED": { + "id": 65 + }, + "NO_SUCH_ALARM": { + "id": 66 + }, + "OUT_OF_RANGE": { + "id": 67 + }, + "NOT_IMPLEMENTED": { + "id": 68 + }, + "BAD_CONFIG": { + "id": 69 + }, + "DID_NOT_STORE": { + "id": 70 + }, + "STORE_PENDING": { + "id": 71 + }, + "STRING_TOO_LONG": { + "id": 72 + }, + "TEST_PENDING": { + "id": 73 + }, + "TEST_STARTED": { + "id": 74 + }, + "TEST_OK_SKELETON": { + "id": 75 + }, + "TEST_OK": { + "id": 76 + }, + "DID_NOT_TEST": { + "id": 77 + } + } + }, + "FLEXNETSERIAL": { + "id": 26, + "version": { + "first": 1, + "last": 24 + }, + "registers": { + "UpgState": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "General UPG states.", + "version": { + "first": 2, + "last": 24 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Can be ignored, temporarily for FW upgrade.", + "region": { + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "FwdlState": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Specifies the Bootloader State of operation.", + "version": { + "first": 2, + "last": 24 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Can be ignored, temporarily for FW upgrade.", + "region": { + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + } + }, + "status": { + "UNKNOWN_PARAMETER": { + "id": 0 + }, + "TOO_MANY_APPS": { + "id": 1 + } + } + }, + "FLEXNETVERSION": { + "id": 24, + "version": { + "first": 1, + "last": 9999 + } + }, + "FUNCTEST": { + "id": 10, + "version": { + "first": 0, + "last": 1003 + }, + "registers": { + "GP30Test": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "GP30 test to run.", + "version": { + "first": 0, + "last": 1003 + }, + "statictype": null + } + ] + }, + "LCDTest": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "LCD test to run.", + "version": { + "first": 0, + "last": 1003 + }, + "statictype": null + } + ] + }, + "Iloop": { + "id": 2, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Test not supported.", + "version": { + "first": 0, + "last": 1003 + }, + "statictype": null + } + ] + }, + "Pulse": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Test not supported.", + "version": { + "first": 0, + "last": 1003 + }, + "statictype": null + } + ] + }, + "Pressure": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Test the pressure sensor.", + "version": { + "first": 0, + "last": 1003 + }, + "statictype": null + } + ] + }, + "BatteryVoltage": { + "id": 5, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Read CPU Vbat.", + "version": { + "first": 0, + "last": 1003 + }, + "statictype": null + } + ] + }, + "SupplyVoltage": { + "id": 6, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Read CPU Vcc.", + "version": { + "first": 0, + "last": 1003 + }, + "statictype": null + } + ] + }, + "Temperature": { + "id": 7, + "details": [ + { + "type": "int16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Read CPU Temperature.", + "version": { + "first": 0, + "last": 1003 + }, + "statictype": null + } + ] + }, + "RFID": { + "id": 8, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Test not supported.", + "version": { + "first": 0, + "last": 1003 + }, + "statictype": null + } + ] + }, + "OpticalOutput": { + "id": 9, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Test the pulse output LED.", + "version": { + "first": 0, + "last": 1003 + }, + "statictype": null + } + ] + }, + "Radio": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Test the Radio at basic SPI level.", + "version": { + "first": 0, + "last": 1003 + }, + "statictype": null + } + ] + }, + "MultiTest": { + "id": 11, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Run a list of basic tests and display results on LCD.", + "version": { + "first": 0, + "last": 1003 + }, + "statictype": null + } + ] + }, + "NFCUID": { + "id": 12, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Return the UID uint8_t array as a uint64_t.", + "version": { + "first": 0, + "last": 1003 + }, + "statictype": null + } + ] + }, + "CPUTest": { + "id": 13, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Test various aspects of the CPU.", + "version": { + "first": 0, + "last": 1003 + }, + "statictype": null + } + ] + } + }, + "status": { + "BAD_CONFIG": { + "id": 0 + }, + "BAD_TEST": { + "id": 1 + }, + "NO_RESULT": { + "id": 2 + } + } + }, + "GENESISFLOW": { + "id": 15, + "version": { + "first": 7, + "last": 606 + }, + "registers": { + "SampleRate": { + "id": 0, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 7, + "last": 203 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 204, + "last": 267 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 2 + } + }, + "na": { + "values": { + "default": 2 + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate in Hz that each GP30 takes measurements", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "FirstHitLvlUp1": { + "id": 1, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 1, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 1, units of 0.88mV", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 1, units of 0.88mV", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 1, units of 0.88mV", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 1, units of 0.88mV", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + } + ] + }, + "FirstHitLvlUp2": { + "id": 2, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 2, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 2, units of 0.88mV", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 2, units of 0.88mV", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 2, units of 0.88mV", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 2, units of 0.88mV", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + } + ] + }, + "FirstHitLvlUp3": { + "id": 3, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 3, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 3, units of 0.88mV", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 3, units of 0.88mV", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 3, units of 0.88mV", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the upstream direction for channel 3, units of 0.88mV", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + } + ] + }, + "FirstHitLvlDown1": { + "id": 4, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 1, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 1, units of 0.88mV", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 1, units of 0.88mV", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 1, units of 0.88mV", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 1, units of 0.88mV", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + } + ] + }, + "FirstHitLvlDown2": { + "id": 5, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 2, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 2, units of 0.88mV", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 2, units of 0.88mV", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 2, units of 0.88mV", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 2, units of 0.88mV", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + } + ] + }, + "FirstHitLvlDown3": { + "id": 6, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 3, units of 0.88mV", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 3, units of 0.88mV", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 3, units of 0.88mV", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 3, units of 0.88mV", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The first hit level in the downstream direction for channel 3, units of 0.88mV", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 20, + "minimum": -128, + "maximum": 127 + }, + "statictype": "dynamic" + } + ] + }, + "StartHit": { + "id": 7, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The hit number to consider as the first hit", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The hit number to consider as the first hit", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "Default is 6 and it should stay as 6 for all sizes.", + "region": { + "emea": { + "values": { + "default": 6 + } + }, + "na": { + "values": { + "default": 6 + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The hit number to consider as the first hit", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The hit number to consider as the first hit", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The hit number to consider as the first hit", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "AmplitudePeakDetectEnd": { + "id": 8, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Where to stop running the amplitude peak detection", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 19, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Where to stop running the amplitude peak detection", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 19, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "ben.davey@xylem.com" + ], + "remarks": "Not expecting to change this unless field trials say we should.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Where to stop running the amplitude peak detection", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 19, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Where to stop running the amplitude peak detection", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 19, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Where to stop running the amplitude peak detection", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 19, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "NumFirePulses": { + "id": 9, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of pulses to fire for a measurement", + "version": { + "first": 7, + "last": 267 + }, + "values": { + "default": 17, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of pulses to fire for a measurement", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 17, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "ben.davey@xylem.com" + ], + "remarks": "Not expecting to change this unless field trials say we should.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of pulses to fire for a measurement", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 17, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of pulses to fire for a measurement", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 17, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of pulses to fire for a measurement", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 17, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "DisplayPow10": { + "id": 10, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The weight of the lowest display digit as a power of 10. The accepted range of values depends on the LCD present and the DisplayUnits chosen", + "version": { + "first": 36, + "last": 267 + }, + "values": { + "default": -6, + "minimum": -128, + "maximum": 127 + }, + "statictype": "static" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The weight of the lowest display digit as a power of 10. The accepted range of values depends on the LCD present and the DisplayUnits chosen", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": -6, + "minimum": -128, + "maximum": 127 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": true, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "(<=125 = 3n ) 150=> 2n in m� -> what about other Units. See Display Unit Customer Specification.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The weight of the lowest display digit as a power of 10. The accepted range of values depends on the LCD present and the DisplayUnits chosen", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": -6, + "minimum": -128, + "maximum": 127 + }, + "statictype": "static" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The weight of the lowest display digit as a power of 10. The accepted range of values depends on the LCD present and the DisplayUnits chosen", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": -6, + "minimum": -128, + "maximum": 127 + }, + "statictype": "static" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The weight of the lowest display digit as a power of 10. The accepted range of values depends on the LCD present and the DisplayUnits chosen", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": -6, + "minimum": -128, + "maximum": 127 + }, + "statictype": "static" + } + ] + }, + "DisplayUnits": { + "id": 11, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of volume to display. The accepted range of values depends on the LCD present and the DisplayPow10 chosen", + "version": { + "first": 36, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of volume to display. The accepted range of values depends on the LCD present and the DisplayPow10 chosen", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": true, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Same units for each calculator. Vako.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of volume to display. The accepted range of values depends on the LCD present and the DisplayPow10 chosen", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of volume to display. The accepted range of values depends on the LCD present and the DisplayPow10 chosen", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of volume to display. The accepted range of values depends on the LCD present and the DisplayPow10 chosen", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + } + ] + }, + "MeterSize": { + "id": 12, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The meter pipe size", + "version": { + "first": 45, + "last": 237 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 9 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The meter pipe size", + "version": { + "first": 238, + "last": 267 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 17 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The meter pipe size", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 17 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": true, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Base No. (4th digit G=50, ...) or B01 Nominal diameter (DN) (DN50, ...).", + "region": { + "emea": { + "values": { + "DN40": 0, + "DN50": 1, + "DN65": 2, + "DN80": 3, + "DN100": 4, + "DN125": 5, + "DN150": 6, + "DN200": 7, + "DN250": 8, + "DN300": 9 + } + }, + "na": { + "values": { + "US1_5": 10, + "US2": 11, + "US3": 12, + "US4": 13, + "US6": 14, + "US8": 15, + "US10": 16, + "US12": 17 + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The meter pipe size", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 17 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The meter pipe size", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 17 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The meter pipe size", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 17 + }, + "statictype": "static" + } + ] + }, + "CalFactor1": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 45, + "last": 200 + }, + "values": { + "default": 62500, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 201, + "last": 267 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": { + "values": { + "US2": 19144 + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 1", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + } + ] + }, + "CalFactor2": { + "id": 14, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 45, + "last": 200 + }, + "values": { + "default": 62500, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 201, + "last": 267 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": { + "values": { + "US2": 19144 + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 2", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + } + ] + }, + "CalFactor3": { + "id": 15, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 45, + "last": 200 + }, + "values": { + "default": 62500, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 201, + "last": 267 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": { + "values": { + "US2": 19144 + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration factor for ultrasonic channel 3", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 15625, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + } + ] + }, + "ZeroOffset1": { + "id": 16, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in usual time of flight scaling (ie LS bit is 2^-38 seconds)", + "version": { + "first": 45, + "last": 132 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 133, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 268, + "last": 322 + }, + "si_transform": { + "remarks": "Seconds: convert time in 2^-38 seconds...", + "units": "s", + "scale_float_mult": 1.0, + "scale_power_2": -38, + "scale_power_10": 0, + "scale_float_div": 1.0, + "offset": 0 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 1 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + } + ] + }, + "ZeroOffset2": { + "id": 17, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in usual time of flight scaling (ie LS bit is 2^-38 seconds)", + "version": { + "first": 45, + "last": 132 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 133, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 268, + "last": 322 + }, + "si_transform": { + "remarks": "Seconds: convert time in 2^-38 seconds...", + "units": "s", + "scale_float_mult": 1.0, + "scale_power_2": -38, + "scale_power_10": 0, + "scale_float_div": 1.0, + "offset": 0 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 2 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + } + ] + }, + "ZeroOffset3": { + "id": 18, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in usual time of flight scaling (ie LS bit is 2^-38 seconds)", + "version": { + "first": 45, + "last": 132 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 133, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 268, + "last": 322 + }, + "si_transform": { + "remarks": "Seconds: convert time in 2^-38 seconds...", + "units": "s", + "scale_float_mult": 1.0, + "scale_power_2": -38, + "scale_power_10": 0, + "scale_float_div": 1.0, + "offset": 0 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The delta time of flight expected on ultrasound channel 3 at zero flow. Value is in units 4 times smaller than usual time of flight scaling (ie LS bit is 2^-40 seconds)", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + } + ] + }, + "ScaledBilling": { + "id": 19, + "details": [ + { + "type": "int64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The scaled volume value shown on the display. In the units and precision set by DisplayUnits and DisplayPow10 respectively. Decimal point is not represented in this value", + "version": { + "first": 47, + "last": 322 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + }, + { + "type": "int64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The scaled volume value shown on the display. In the units and precision set by DisplayUnits and DisplayPow10 respectively. Decimal point is not represented in this value", + "version": { + "first": 450, + "last": 463 + }, + "statictype": "dynamic" + }, + { + "type": "int64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The scaled volume value shown on the display. In the units and precision set by DisplayUnits and DisplayPow10 respectively. Decimal point is not represented in this value", + "version": { + "first": 500, + "last": 509 + }, + "statictype": "dynamic" + }, + { + "type": "int64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The scaled volume value shown on the display. In the units and precision set by DisplayUnits and DisplayPow10 respectively. Decimal point is not represented in this value", + "version": { + "first": 601, + "last": 606 + }, + "statictype": "dynamic" + } + ] + }, + "ResetAccumulators": { + "id": 20, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to reset all accumulated volume to zero", + "version": { + "first": 47, + "last": 267 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to reset all accumulated volume to zero", + "version": { + "first": 268, + "last": 322 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "roland.drabesch@xylem.com" + ], + "remarks": "You will need this if you wish to reset the volume to zero at the end of calibration.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to reset all accumulated volume to zero", + "version": { + "first": 450, + "last": 463 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to reset all accumulated volume to zero", + "version": { + "first": 500, + "last": 509 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to reset all accumulated volume to zero", + "version": { + "first": 601, + "last": 606 + }, + "statictype": "dynamic" + } + ] + }, + "ForwardArrow": { + "id": 21, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow direction. 0 - undecided, 1 - right, 2 - left", + "version": { + "first": 47, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 2 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow direction. 0 - undecided, 1 - right, 2 - left", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 2 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 0 + } + }, + "na": { + "values": { + "default": 1 + } + } + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow direction. 0 - undecided, 1 - right, 2 - left", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 2 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow direction. 0 - undecided, 1 - right, 2 - left", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 2 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow direction. 0 - undecided, 1 - right, 2 - left", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 2 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "LedMode": { + "id": 22, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 47, + "last": 203 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 204, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 0 + } + }, + "na": { + "values": { + "default": 0 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The type of data output by the green LED", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + } + ] + }, + "StoreCalibration": { + "id": 23, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store calibration values to non-volatile storage. Read back for status", + "version": { + "first": 54, + "last": 322 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "roland.drabesch@xylem.com" + ], + "remarks": "You will need to use this during calibration.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store calibration values to non-volatile storage. Read back for status", + "version": { + "first": 450, + "last": 463 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store calibration values to non-volatile storage. Read back for status", + "version": { + "first": 500, + "last": 509 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store calibration values to non-volatile storage. Read back for status", + "version": { + "first": 601, + "last": 606 + }, + "statictype": "dynamic" + } + ] + }, + "UnscaledFwd": { + "id": 24, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 54, + "last": 322 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 450, + "last": 463 + }, + "statictype": "dynamic" + }, + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 500, + "last": 509 + }, + "statictype": "dynamic" + }, + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The forward flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 601, + "last": 606 + }, + "statictype": "dynamic" + } + ] + }, + "UnscaledRev": { + "id": 25, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The reverse flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 54, + "last": 322 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The reverse flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 450, + "last": 463 + }, + "statictype": "dynamic" + }, + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The reverse flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 500, + "last": 509 + }, + "statictype": "dynamic" + }, + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The reverse flow accumulator volume. The scale depends on the meter size", + "version": { + "first": 601, + "last": 606 + }, + "statictype": "dynamic" + } + ] + }, + "LowFlowThreshold": { + "id": 26, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The volume that must pass in LowFlowMaxPeriod for it to be registered as real flow. Units of ml", + "version": { + "first": 55, + "last": 267 + }, + "values": { + "default": 200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The volume that must pass in LowFlowMaxPeriod for it to be registered as real flow. Units of ml", + "version": { + "first": 268, + "last": 322 + }, + "si_transform": { + "remarks": "Cubic Meters: conversion of the volume volume in ml ...", + "units": "m^3", + "scale_float_mult": 1.0, + "scale_power_2": 0, + "scale_power_10": -6, + "scale_float_div": 1.0, + "offset": 0 + }, + "values": { + "default": 200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "custom", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com", + "ben.davey@xylem.com" + ], + "remarks": "Default for other DN (200 -> DN50).", + "region": { + "emea": { + "values": { + "DN40": 200, + "DN50": 200, + "DN65": 333, + "DN80": 550, + "DN100": 900, + "DN125": "TBD", + "DN150": 2000, + "DN200": 800, + "DN250": "TBD", + "DN300": "TBD" + } + }, + "na": { + "values": { + "US1_5": 200, + "US2": 200, + "US3": 550, + "US4": 900, + "US6": 1833, + "US8": "TBD", + "US10": "TBD", + "US12": "TBD" + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The volume that must pass in LowFlowMaxPeriod for it to be registered as real flow. Units of ml", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The volume that must pass in LowFlowMaxPeriod for it to be registered as real flow. Units of ml", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The volume that must pass in LowFlowMaxPeriod for it to be registered as real flow. Units of ml", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "LowFlowMaxPeriod": { + "id": 27, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time during which LowFlowThreshold volume must pass for it to be registered as real flow. Units of seconds << 16", + "version": { + "first": 55, + "last": 267 + }, + "values": { + "default": 3932160, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time during which LowFlowThreshold volume must pass for it to be registered as real flow. Units of seconds << 16", + "version": { + "first": 268, + "last": 322 + }, + "si_transform": { + "remarks": "Seconds: time in 2^-16 seconds ...", + "units": "s", + "scale_float_mult": 1.0, + "scale_power_2": -16, + "scale_power_10": 0, + "scale_float_div": 1.0, + "offset": 0 + }, + "values": { + "default": 3932160, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com", + "ben.davey@xylem.com" + ], + "remarks": "Default for other DN (3932160 -> DN50).", + "region": { + "emea": { + "values": { + "default": 3932160 + } + }, + "na": { + "values": { + "default": 3932160 + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time during which LowFlowThreshold volume must pass for it to be registered as real flow. Units of seconds << 16", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 3932160, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time during which LowFlowThreshold volume must pass for it to be registered as real flow. Units of seconds << 16", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 3932160, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time during which LowFlowThreshold volume must pass for it to be registered as real flow. Units of seconds << 16", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 3932160, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "UpdateThreshold": { + "id": 28, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The amount of flow in ml to accumulate before updating the main scaled accumulators.", + "version": { + "first": 55, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The amount of flow in ml to accumulate before updating the main scaled accumulators.", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "I doubt this will be used. It is to allow less frequent LCD updates if so desired but we're fine.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The amount of flow in ml to accumulate before updating the main scaled accumulators.", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The amount of flow in ml to accumulate before updating the main scaled accumulators.", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The amount of flow in ml to accumulate before updating the main scaled accumulators.", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "ArrowThreshold": { + "id": 29, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The net volume in ml that must flow in one direction for the forward arrow to be set", + "version": { + "first": 55, + "last": 267 + }, + "values": { + "default": 5000000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The net volume in ml that must flow in one direction for the forward arrow to be set", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 5000000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Default for other DN (J.S.: 2000000-> DN50)", + "region": { + "emea": { + "values": { + "default": 2000000, + "DN125": "TBD", + "DN250": "TBD", + "DN300": "TBD" + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The net volume in ml that must flow in one direction for the forward arrow to be set", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 5000000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The net volume in ml that must flow in one direction for the forward arrow to be set", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 5000000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The net volume in ml that must flow in one direction for the forward arrow to be set", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 5000000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "FireBuffer1": { + "id": 30, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 1 to be used", + "version": { + "first": 64, + "last": 267 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 1 to be used", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Not expecting to change this unless field trials say we should.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 1 to be used", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 1 to be used", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 1 to be used", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "FireBuffer2": { + "id": 31, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 2 to be used", + "version": { + "first": 64, + "last": 267 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 2 to be used", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Not expecting to change this unless field trials say we should.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 2 to be used", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 2 to be used", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 2 to be used", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "FireBuffer3": { + "id": 32, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 3 to be used", + "version": { + "first": 64, + "last": 267 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 3 to be used", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Not expecting to change this unless field trials say we should.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 3 to be used", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 3 to be used", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The fire buffer within the GP30 on channel 3 to be used", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "TriggerActive": { + "id": 33, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write 1 to put GenesisFlow in Active mode. This is the normal measurement mode", + "version": { + "first": 75, + "last": 267 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Active mode. This is the normal measurement mode", + "version": { + "first": 268, + "last": 306 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Active mode. This is the normal measurement mode", + "version": { + "first": 307, + "last": 322 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "roland.drabesch@xylem.com" + ], + "remarks": "You will need this if you use TriggerIdle or TriggerTest", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Active mode. This is the normal measurement mode", + "version": { + "first": 450, + "last": 463 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Active mode. This is the normal measurement mode", + "version": { + "first": 500, + "last": 509 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Active mode. This is the normal measurement mode", + "version": { + "first": 601, + "last": 606 + }, + "statictype": "dynamic" + } + ] + }, + "TriggerIdle": { + "id": 34, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 0 to put GenesisFlow in Active mode, otherwise put GenesisFlow in Idle mode. Idle mode displays just the number written to TriggerIdle. No measurements are performed. Read returns the number written", + "version": { + "first": 75, + "last": 322 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "roland.drabesch@xylem.com" + ], + "remarks": "This was asked for so the battery usage could be minimised in manufacture so I expect it'll be used there.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 0 to put GenesisFlow in Active mode, otherwise put GenesisFlow in Idle mode. Idle mode displays just the number written to TriggerIdle. No measurements are performed. Read returns the number written", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "dynamic" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 0 to put GenesisFlow in Active mode, otherwise put GenesisFlow in Idle mode. Idle mode displays just the number written to TriggerIdle. No measurements are performed. Read returns the number written", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "dynamic" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 0 to put GenesisFlow in Active mode, otherwise put GenesisFlow in Idle mode. Idle mode displays just the number written to TriggerIdle. No measurements are performed. Read returns the number written", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "dynamic" + } + ] + }, + "MaxValidDeltaToF": { + "id": 35, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum delta time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 87, + "last": 267 + }, + "values": { + "default": 247390, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum delta time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 268, + "last": 322 + }, + "si_transform": { + "remarks": "Seconds: time in 2^-38 seconds ...", + "units": "s", + "scale_float_mult": 1.0, + "scale_power_2": -38, + "scale_power_10": 0, + "scale_float_div": 1.0, + "offset": 0 + }, + "values": { + "default": 309237, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com" + ], + "remarks": "247390 <-DN50 - default for other DN?", + "region": { + "emea": { + "values": { + "DN40": 247390, + "DN50": 247390, + "DN65": 402008, + "DN80": 494779, + "DN100": 618474, + "DN125": "TBD", + "DN150": 439804, + "DN200": 1236948, + "DN250": "TBD", + "DN300": "TBD" + } + }, + "na": { + "values": { + "US1_5": 1855422, + "US2": 1855422, + "US3": 494779, + "US4": 618474, + "US6": 439804, + "US8": "TBD", + "US10": "TBD", + "US12": "TBD" + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum delta time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 309237, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum delta time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 309237, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum delta time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 309237, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "MaxValidToF": { + "id": 36, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum absolute time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 87, + "last": 267 + }, + "values": { + "default": 24739011, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum absolute time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 24739011, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com" + ], + "remarks": "<-DN50 - default for other DN?", + "region": { + "emea": { + "values": { + "DN40": 24739011, + "DN50": 24739011, + "DN65": 32160714, + "DN80": 39582418, + "DN100": 49478022, + "DN125": "TBD", + "DN150": 46729244, + "DN200": 98956044, + "DN250": "TBD", + "DN300": "TBD" + } + }, + "na": { + "values": { + "US1_5": 24739011, + "US2": 24739011, + "US3": 39582418, + "US4": 49478022, + "US6": 46729244, + "US8": "TBD", + "US10": "TBD", + "US12": "TBD" + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum absolute time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 24739011, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum absolute time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 24739011, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum absolute time of flight, above this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 24739011, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "MinValidToF": { + "id": 37, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The minimum absolute time of flight, below this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 87, + "last": 267 + }, + "values": { + "default": 13743895, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The minimum absolute time of flight, below this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 13743895, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com" + ], + "remarks": "<-DN50 - default for other DN?", + "region": { + "emea": { + "values": { + "DN40": 13743895, + "DN50": 13743895, + "DN65": 13743895, + "DN80": 21990232, + "DN100": 27487790, + "DN125": "TBD", + "DN150": 30236569, + "DN200": 54975580, + "DN250": "TBD", + "DN300": "TBD" + } + }, + "na": { + "values": { + "US1_5": 13743895, + "US2": 13743895, + "US3": 21990232, + "US4": 27487790, + "US6": 30236569, + "US8": "TBD", + "US10": "TBD", + "US12": "TBD" + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The minimum absolute time of flight, below this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 13743895, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The minimum absolute time of flight, below this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 13743895, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The minimum absolute time of flight, below this the measurement is deemed bad. In 2^-38 seconds units", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 13743895, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "FirstHitPercent1": { + "id": 38, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 1", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 1", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 1", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 1", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 1", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "FirstHitPercent2": { + "id": 39, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 2", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 2", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 2", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 2", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 2", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "FirstHitPercent3": { + "id": 40, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 3", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 3", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 3", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 3", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The percentage of the measured amplitude to use for the first hit level for channel 3", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "FirstHitShift": { + "id": 41, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A value describing how long the amplitude is averaged over for calculating the first hit level. This is the amount each amplitude value is shifted down before being added to the moving average", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 4, + "minimum": 3, + "maximum": 8 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A value describing how long the amplitude is averaged over for calculating the first hit level. This is the amount each amplitude value is shifted down before being added to the moving average", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 4, + "minimum": 3, + "maximum": 8 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A value describing how long the amplitude is averaged over for calculating the first hit level. This is the amount each amplitude value is shifted down before being added to the moving average", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 4, + "minimum": 3, + "maximum": 8 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A value describing how long the amplitude is averaged over for calculating the first hit level. This is the amount each amplitude value is shifted down before being added to the moving average", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 4, + "minimum": 3, + "maximum": 8 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A value describing how long the amplitude is averaged over for calculating the first hit level. This is the amount each amplitude value is shifted down before being added to the moving average", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 4, + "minimum": 3, + "maximum": 8 + }, + "statictype": "static" + } + ] + }, + "FirstHitMinimum": { + "id": 42, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum absolute first hit level value", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum absolute first hit level value", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "ben.davey@xylem.com" + ], + "remarks": "A limit for how small the first hit level can be set We don't expect this to change unless firled trials say it should.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum absolute first hit level value", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum absolute first hit level value", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum absolute first hit level value", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 20, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "ToFErrorLimit": { + "id": 43, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of ToF errors to allow before resetting the first hit levels to FirstHitMinimum", + "version": { + "first": 93, + "last": 267 + }, + "values": { + "default": 16, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of ToF errors to allow before resetting the first hit levels to FirstHitMinimum", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 16, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "ben.davey@xylem.com" + ], + "remarks": "This allows us to avoid being stuck with a bad first hit level if conditions change. Not expecting to change it unless field trials show we should.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of ToF errors to allow before resetting the first hit levels to FirstHitMinimum", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 16, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of ToF errors to allow before resetting the first hit levels to FirstHitMinimum", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 16, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of ToF errors to allow before resetting the first hit levels to FirstHitMinimum", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 16, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "FirstHitUpdatePeriod": { + "id": 44, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The period (in seconds) between first hit level updates", + "version": { + "first": 99, + "last": 267 + }, + "values": { + "default": 10, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The period (in seconds) between first hit level updates", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 10, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "ben.davey@xylem.com" + ], + "remarks": "Not expecting to change this unless field trials say we should.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The period (in seconds) between first hit level updates", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 10, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The period (in seconds) between first hit level updates", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 10, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The period (in seconds) between first hit level updates", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 10, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "PipeFillingDelay": { + "id": 45, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time (in seconds) to maintain zero flow after leaving empty pipe", + "version": { + "first": 119, + "last": 267 + }, + "values": { + "default": 30, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time (in seconds) to maintain zero flow after leaving empty pipe", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 30, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "ben.davey@xylem.com" + ], + "remarks": "The amount of time after empty pipe that we stay in zero flow mode. Same as iPerl, not expected to be changed but could be if field trials say we should.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time (in seconds) to maintain zero flow after leaving empty pipe", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 30, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time (in seconds) to maintain zero flow after leaving empty pipe", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 30, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time (in seconds) to maintain zero flow after leaving empty pipe", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 30, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "ToFTempOffset1": { + "id": 46, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 1. In units of 2^-38 seconds", + "version": { + "first": 124, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 1. In units of 2^-38 seconds", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com", + "ben.davey@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 1. In units of 2^-38 seconds", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 1. In units of 2^-38 seconds", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 1. In units of 2^-38 seconds", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "ToFTempOffset2": { + "id": 47, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 2. In units of 2^-38 seconds", + "version": { + "first": 124, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 2. In units of 2^-38 seconds", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com", + "ben.davey@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 2. In units of 2^-38 seconds", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 2. In units of 2^-38 seconds", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 2. In units of 2^-38 seconds", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "ToFTempOffset3": { + "id": 48, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 3. In units of 2^-38 seconds", + "version": { + "first": 124, + "last": 267 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 3. In units of 2^-38 seconds", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com", + "ben.davey@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 3. In units of 2^-38 seconds", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 3. In units of 2^-38 seconds", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The calibration offset for the temperature measurement on channel 3. In units of 2^-38 seconds", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated" + } + ] + }, + "ToFTempCalibrate": { + "id": 49, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write the current temperature to this register to trigger a calibration step. In units of 2^-12 degrees celcius", + "version": { + "first": 124, + "last": 204 + }, + "values": { + "minimum": 0, + "maximum": 270336 + }, + "statictype": "dynamic" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write the current temperature to this register to trigger a calibration step. In units of 2^-12 degrees celcius", + "version": { + "first": 205, + "last": 322 + }, + "values": { + "minimum": 0, + "maximum": 286720 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "roland.drabesch@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write the current temperature to this register to trigger a calibration step. In units of 2^-12 degrees celcius", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "minimum": 0, + "maximum": 286720 + }, + "statictype": "dynamic" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write the current temperature to this register to trigger a calibration step. In units of 2^-12 degrees celcius", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "minimum": 0, + "maximum": 286720 + }, + "statictype": "dynamic" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write the current temperature to this register to trigger a calibration step. In units of 2^-12 degrees celcius", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "minimum": 0, + "maximum": 286720 + }, + "statictype": "dynamic" + } + ] + }, + "StoreConfiguration": { + "id": 50, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 141, + "last": 267 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 268, + "last": 322 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "You do need to use this if you change any parameters in GENESISFLOW and want to keep them.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "finalize" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 450, + "last": 463 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 500, + "last": 509 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 601, + "last": 606 + }, + "statictype": "dynamic" + } + ] + }, + "SealDisplay": { + "id": 51, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to stop various display related registers being changed. Read back 1 for 'sealed' 0 for 'unsealed'", + "version": { + "first": 161, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to stop various display related registers being changed. Read back 1 for 'sealed' 0 for 'unsealed'", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "roland.drabesch@xylem.com" + ], + "remarks": "Display should be sealed at end of manufacture (EMEA only). 251210 FieldTool modification enabled: The guidance was that CustTool is allowed to change legally relevant configuration in the field. So we do not require all legally relevant registers to be in the blacklist. This is because the restriction on changing legally relevant configuration in the field is only applied to customer-facing tools. CustTool is considered an internal �repair tool� that must be allowed to make such repairs to legally relevant configuration in the field.", + "region": { + "emea": { + "values": { + "default": 1 + } + }, + "na": { + "values": { + "default": 0 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to stop various display related registers being changed. Read back 1 for 'sealed' 0 for 'unsealed'", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to stop various display related registers being changed. Read back 1 for 'sealed' 0 for 'unsealed'", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to stop various display related registers being changed. Read back 1 for 'sealed' 0 for 'unsealed'", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + } + ] + }, + "TriggerTest": { + "id": 52, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Test mode. This differs from normal measurement mode in that the volume is presented to 3 extra decimal places if possible. Read back 1 for Test mode, 0 otherwise", + "version": { + "first": 162, + "last": 267 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Test mode. This differs from normal measurement mode in that the volume is presented to 3 extra decimal places if possible. Read back 1 for Test mode, 0 otherwise", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Test mode. This differs from normal measurement mode in that the volume is presented to 3 extra decimal places if possible. Read back 1 for Test mode, 0 otherwise", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Test mode. This differs from normal measurement mode in that the volume is presented to 3 extra decimal places if possible. Read back 1 for Test mode, 0 otherwise", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "dynamic" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to put GenesisFlow in Test mode. This differs from normal measurement mode in that the volume is presented to 3 extra decimal places if possible. Read back 1 for Test mode, 0 otherwise", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "dynamic" + } + ] + }, + "MaxValidAmplitude": { + "id": 53, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Maximum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 168, + "last": 267 + }, + "values": { + "default": 2936012800, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Maximum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 268, + "last": 322 + }, + "si_transform": { + "remarks": "Volts: voltage in 2^-22 millivolts ...", + "units": "v", + "scale_float_mult": 1.0, + "scale_power_2": -22, + "scale_power_10": -3, + "scale_float_div": 1.0, + "offset": 0 + }, + "values": { + "default": 2936012800, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com" + ], + "remarks": "629145600 <-DN50 - default for other DN?", + "region": { + "emea": { + "values": { + "default": 2936012800 + } + }, + "na": { + "values": { + "default": 2936012800 + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Maximum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 2936012800, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Maximum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 2936012800, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Maximum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 2936012800, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "MinValidAmplitude": { + "id": 54, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 168, + "last": 267 + }, + "values": { + "default": 209715200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 209715200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com" + ], + "remarks": "<-DN50 - default for other DN?", + "region": { + "emea": { + "values": { + "default": 629145600 + } + }, + "na": { + "values": { + "default": 629145600 + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 209715200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 209715200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Minimum amplitude for a valid signal in 2^-22mV units", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 209715200, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "HardErrorLimit": { + "id": 55, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of hard errors to allow before declaring a fatal error", + "version": { + "first": 176, + "last": 267 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of hard errors to allow before declaring a fatal error", + "version": { + "first": 268, + "last": 322 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "The number of hard errors before deciding a fatal error has occurred. This will probably only change in response to testing in the field.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of hard errors to allow before declaring a fatal error", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of hard errors to allow before declaring a fatal error", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Number of hard errors to allow before declaring a fatal error", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static" + } + ] + }, + "Timeout": { + "id": 56, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The timeout for an ultrasonic measurement (0 - 128us, 1 - 256us, 2 - 1024us, 3 - 4096us)", + "version": { + "first": 273, + "last": 322 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "custom", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "ben.davey@xylem.com" + ], + "remarks": "<-DN50 - default for other DN?", + "region": { + "emea": { + "values": { + "default": 1, + "DN100": [ + 1, + 2 + ], + "DN125": "TBD", + "DN200": 2, + "DN250": "TBD", + "DN300": 2 + } + }, + "na": { + "values": { + "default": 1, + "US4": "TBD", + "US8": "TBD", + "US10": "TBD", + "US12": "TBD" + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The timeout for an ultrasonic measurement (0 - 128us, 1 - 256us, 2 - 1024us, 3 - 4096us)", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The timeout for an ultrasonic measurement (0 - 128us, 1 - 256us, 2 - 1024us, 3 - 4096us)", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The timeout for an ultrasonic measurement (0 - 128us, 1 - 256us, 2 - 1024us, 3 - 4096us)", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + } + ] + }, + "MaxDeltaToFDeviation": { + "id": 57, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum deviation of a valid delta tof from the recent mean. In 2^-38 seconds units", + "version": { + "first": 280, + "last": 322 + }, + "values": { + "default": 109951, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com", + "ben.davey@xylem.com" + ], + "remarks": "0.4us for all meter sizes up to DN100, above that TBD. 0.4us is 109951 (0x1AD7F).", + "region": { + "emea": { + "values": { + "default": 109951, + "DN125": "TBD", + "DN200": "TBD", + "DN250": "TBD", + "DN300": "TBD" + } + }, + "na": { + "values": { + "default": 109951, + "US8": "TBD", + "US10": "TBD", + "US12": "TBD" + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum deviation of a valid delta tof from the recent mean. In 2^-38 seconds units", + "version": { + "first": 450, + "last": 463 + }, + "values": { + "default": 109951, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum deviation of a valid delta tof from the recent mean. In 2^-38 seconds units", + "version": { + "first": 500, + "last": 509 + }, + "values": { + "default": 109951, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum deviation of a valid delta tof from the recent mean. In 2^-38 seconds units", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 109951, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "MaxTempRange": { + "id": 58, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of temperatures between channels before one is rejected. In units of 2^-12 degrees celcius", + "version": { + "first": 289, + "last": 322 + }, + "values": { + "default": 8192, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com", + "ben.davey@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 8192 + } + }, + "na": { + "values": { + "default": 8192 + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of temperatures between channels before one is rejected. In units of 2^-12 degrees celcius", + "version": { + "first": 451, + "last": 463 + }, + "values": { + "default": 8192, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of temperatures between channels before one is rejected. In units of 2^-12 degrees celcius", + "version": { + "first": 504, + "last": 509 + }, + "values": { + "default": 8192, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of temperatures between channels before one is rejected. In units of 2^-12 degrees celcius", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 8192, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "MaxDeltaToFRange": { + "id": 59, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of delta time of flight between channels before one is rejected. In 2^-38 seconds units", + "version": { + "first": 289, + "last": 322 + }, + "values": { + "default": 137438, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com", + "ben.davey@xylem.com" + ], + "remarks": "0.5us for all meter sizes. 0.5us is 137438 (0x218DE).", + "region": { + "emea": { + "values": { + "default": 137438 + } + }, + "na": { + "values": { + "default": 137438 + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of delta time of flight between channels before one is rejected. In 2^-38 seconds units", + "version": { + "first": 451, + "last": 463 + }, + "values": { + "default": 137438, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of delta time of flight between channels before one is rejected. In 2^-38 seconds units", + "version": { + "first": 504, + "last": 509 + }, + "values": { + "default": 137438, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The maximum range of delta time of flight between channels before one is rejected. In 2^-38 seconds units", + "version": { + "first": 601, + "last": 606 + }, + "values": { + "default": 137438, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + } + ] + }, + "LookupFileCrc": { + "id": 60, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Read for the current loaded lookup table CRC, write to set the expected CRC.", + "version": { + "first": 295, + "last": 322 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": "custom", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "mark.clemens@xylem.com" + ], + "remarks": "Will change with different releases - should be tracked elsewhere. meter_lut_202506270844_v0.19_crc_list.", + "region": { + "emea": { + "values": { + "DN40": 16549, + "DN50": 46338, + "DN65": 52673, + "DN80": 18061, + "DN100": 48372, + "DN125": 8134, + "DN150": 1637, + "DN200": 26376, + "DN250": 45341, + "DN300": 49157 + } + }, + "na": { + "values": { + "US1_5": 50785, + "US2": 58892, + "US3": 52036, + "US4": 50586, + "US6": 8010, + "US8": 52526, + "US10": 24406, + "US12": 11854 + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + } + ] + }, + "DisplayLeadingZeros": { + "id": 61, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether to display leading zeros on row 2. If false leading zeros will be replaced with a space", + "version": { + "first": 302, + "last": 322 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [], + "remarks": "This controls the temperature, pressure, flow rate readings on the smaller second row of digits. Previous code would display 012.3 C whereas with DisplayLeadingZeros set to 0 you�ll get _12.3 C (where the _ is actually just an empty space).", + "region": { + "emea": { + "values": { + "default": 0 + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + } + ] + }, + "InstallationCorrectionEnabled": { + "id": 62, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether the installation correction function is enabled or not", + "version": { + "first": 310, + "last": 318, + "exclude": [ + 315, + 316, + 317 + ] + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [], + "remarks": "Installation detection / bend correction registers. Currently unreleased.", + "region": { + "emea": { + "values": { + "DN250": "TBD", + "DN300": "TBD" + } + }, + "na": { + "values": { + "US8": "TBD", + "US10": "TBD", + "US12": "TBD" + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + } + ] + }, + "InstallationDetectionThreshold": { + "id": 63, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The threshold in ml for deciding on the meter installation", + "version": { + "first": 310, + "last": 318, + "exclude": [ + 315, + 316, + 317 + ] + }, + "values": { + "default": 500, + "minimum": 0, + "maximum": 10000000 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [], + "remarks": "Installation detection / bend correction registers. Currently unreleased.", + "region": { + "emea": { + "values": { + "DN250": "TBD", + "DN300": "TBD" + } + }, + "na": { + "values": { + "US8": "TBD", + "US10": "TBD", + "US12": "TBD" + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + } + ] + }, + "InstallationType": { + "id": 64, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The detected installation type, MS 16 bits is the type of installation, LS 16 bits is the proportion of correction to apply", + "version": { + "first": 310, + "last": 318, + "exclude": [ + 315, + 316, + 317 + ] + }, + "values": { + "minimum": 0, + "maximum": 163840 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [], + "remarks": "Installation detection / bend correction registers. Currently unreleased.", + "region": { + "emea": { + "values": { + "DN250": "TBD", + "DN300": "TBD" + } + }, + "na": { + "values": { + "US8": "TBD", + "US10": "TBD", + "US12": "TBD" + } + } + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "InstallationDetectionStatus": { + "id": 65, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Installation detection percentage complete, returns 100 if installation detection isn't running", + "version": { + "first": 310, + "last": 318, + "exclude": [ + 315, + 316, + 317 + ] + }, + "values": { + "minimum": 0, + "maximum": 100 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [], + "remarks": "Installation detection / bend correction registers. Currently unreleased.", + "region": { + "emea": { + "values": { + "DN250": "TBD", + "DN300": "TBD" + } + }, + "na": { + "values": { + "US8": "TBD", + "US10": "TBD", + "US12": "TBD" + } + } + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "FractionalBars": { + "id": 66, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether to display bars above the fractional digits on the LCD (if supported)", + "version": { + "first": 311, + "last": 321, + "exclude": [ + 315, + 316, + 317, + 319, + 320 + ] + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [], + "remarks": "Probably customer specific in EMEA should always be false in NA.", + "region": { + "emea": { + "values": { + "DN250": "TBD", + "DN300": "TBD" + } + }, + "na": { + "values": { + "default": 0 + } + } + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + } + ] + }, + "CalibrationCount": { + "id": 67, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "A count of the relevant calibration values, for internal use", + "version": { + "first": 313, + "last": 322 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Internal use only, ignore.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "DelayedLedOff": { + "id": 68, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write the number of seconds in the future to turn off the LED output. This countdown will be cancelled if LedMode is changed during the delay.", + "version": { + "first": 314, + "last": 322 + }, + "values": { + "minimum": 0, + "maximum": 28800 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [], + "remarks": "Enhancement for ensuring LED is off after metrology testing, useful to add to test software for GenesisFlow versions 3.16 and newer (not released yet June 2024).", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "DisplayVolumeRow2": { + "id": 69, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether or not to display the fractional digits of the volume as part of the row 2 carousel. Be aware this could change the scaling of the volume calculation if more decimal places now need calculating", + "version": { + "first": 322, + "last": 322 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [], + "remarks": "TBD", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "ro-check" + } + } + ] + } + }, + "status": { + "BAD_TEST": { + "id": 0 + }, + "BAD_CONFIG": { + "id": 1 + }, + "DID_NOT_STORE": { + "id": 2 + }, + "STORE_PENDING": { + "id": 3 + }, + "STORE_BUFFER_SIZE": { + "id": 4 + }, + "STRING_TOO_LONG": { + "id": 5 + }, + "BAD_DISPLAY_MODE": { + "id": 6 + }, + "GLASS_TOO_LONG": { + "id": 7 + }, + "SLOT_NOT_YOURS": { + "id": 8 + }, + "SUBLIST_TOO_LONG": { + "id": 9 + }, + "NO_TEMP_SENSOR": { + "id": 10 + }, + "UNDER_TEMP": { + "id": 11 + }, + "LOW_TEMP_WARNING": { + "id": 12 + }, + "HIGH_TEMP_WARNING": { + "id": 13 + }, + "OVER_TEMP": { + "id": 14 + }, + "MISMATCHING_LSB": { + "id": 15 + }, + "OUT_OF_RANGE_PWDIFF": { + "id": 16 + }, + "OUT_OF_RANGE_AMPLITUDE": { + "id": 17 + }, + "OUT_OF_RANGE_TOF": { + "id": 18 + }, + "OUT_OF_RANGE_DTOF": { + "id": 19 + }, + "TOF_TIMEOUT": { + "id": 20 + }, + "CAL_CHANGE": { + "id": 21 + }, + "OUT_OF_RANGE_INTERVAL": { + "id": 22 + }, + "VALIDATE_FAIL": { + "id": 23 + }, + "OUT_OF_RANGE_TEMP": { + "id": 24 + }, + "NOT_READY": { + "id": 25 + }, + "METROLOGY_ERROR": { + "id": 26 + }, + "GP30_ID_ERROR": { + "id": 27 + }, + "GP30_FLAG_ERROR": { + "id": 28 + }, + "GP30_TIMEOUT_ERROR": { + "id": 29 + }, + "GP30_REQUEST_ERROR": { + "id": 30 + }, + "GP30_SEQ_ERROR": { + "id": 31 + }, + "VALUE_SEALED": { + "id": 32 + }, + "IN_TEST_MODE": { + "id": 33 + }, + "UNKNOWN_STATE": { + "id": 34 + }, + "DISPLAY_INIT_SUCCEEDED": { + "id": 35 + }, + "DISPLAY_INIT_FAILED": { + "id": 36 + }, + "GP30_INIT_FAILED": { + "id": 37 + }, + "START_TIMER_SUCCEEDED": { + "id": 38 + }, + "START_TIMER_FAILED": { + "id": 39 + }, + "VOLUME_STORE_FAILED": { + "id": 40 + }, + "EMPTY_PIPE": { + "id": 41 + }, + "PARAMETER_ERROR": { + "id": 42 + }, + "GP30_INTERNAL_ERROR": { + "id": 43 + }, + "GLASS_TOO_SHORT": { + "id": 44 + }, + "STORE_CAL_FAILED": { + "id": 45 + }, + "STORE_CONF_FAILED": { + "id": 46 + }, + "MODE_CHANGE": { + "id": 47 + }, + "BAD_POW10": { + "id": 48 + }, + "BAD_DECIMAL_SEPARATOR": { + "id": 49 + }, + "BAD_UNITS": { + "id": 50 + }, + "BAD_ICONS": { + "id": 51 + }, + "BAD_THOUSAND_SEPARATOR": { + "id": 52 + }, + "NEW_LOCALE_REJECTED": { + "id": 53 + }, + "SET_ACCUMULATORS": { + "id": 54 + }, + "SEAL_OPENED": { + "id": 55 + }, + "CALIBRATION_RECALL_INCOMPLETE": { + "id": 56 + }, + "BAD_AMR_SETTINGS": { + "id": 57 + }, + "SUSPECT_CYCLE_SKIP": { + "id": 58 + }, + "LOOKUP_FILE_LOADED": { + "id": 59 + }, + "LOOKUP_FILE_METERSIZE_CHANGED": { + "id": 60 + }, + "LOOKUP_FILE_FAILURE": { + "id": 61 + }, + "LOOKUP_FILE_INVALID": { + "id": 62 + }, + "LOOKUP_CRC_MISMATCH": { + "id": 63 + }, + "LOOKUP_FILE_UNKNOWN_METERSIZE": { + "id": 64 + }, + "INSTALLATION_HIGH_TIME_DIFF": { + "id": 65 + }, + "INSTALLATION_LOW_FLOW_IGNORE": { + "id": 66 + }, + "INSTALLATION_BAD_CHANNELS": { + "id": 67 + }, + "INSTALLATION_FIXED": { + "id": 68 + } + } + }, + "HISTOGRAM": { + "id": 27, + "version": { + "first": 1, + "last": 4 + }, + "registers": {} + }, + "IRDA": { + "id": 20, + "version": { + "first": 10, + "last": 213 + }, + "registers": { + "PulseReportRate": { + "id": 0, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate at which pulse reports are sent to the IrDA pulse adapter", + "version": { + "first": 10, + "last": 97 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate at which pulse reports are sent to the IrDA pulse adapter", + "version": { + "first": 98, + "last": 136 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The rate at which pulse reports are sent to the IrDA pulse adapter", + "version": { + "first": 161, + "last": 213 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "1 sec.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "AdapterPresenceLimit": { + "id": 1, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of 15 minute periods we have to have received no valid IrDA messages to assume there is no adapter present", + "version": { + "first": 18, + "last": 28 + }, + "values": { + "default": 1, + "minimum": 1, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of 15 minute periods we have to have received no valid IrDA messages to assume there is no adapter present", + "version": { + "first": 29, + "last": 97 + }, + "values": { + "default": 3, + "minimum": 1, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of 15 minute periods we have to have received no valid IrDA messages to assume there is no adapter present", + "version": { + "first": 98, + "last": 136 + }, + "values": { + "default": 3, + "minimum": 1, + "maximum": 255 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of 15 minute periods we have to have received no valid IrDA messages to assume there is no adapter present", + "version": { + "first": 161, + "last": 213 + }, + "values": { + "default": 3, + "minimum": 1, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 3 + } + }, + "na": { + "values": { + "default": 3 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PulseSequence": { + "id": 2, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The present sequence number used in pulse reports", + "version": { + "first": 26, + "last": 97 + }, + "values": { + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The present sequence number used in pulse reports", + "version": { + "first": 98, + "last": 114 + }, + "values": { + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The present sequence number used in pulse reports", + "version": { + "first": 115, + "last": 136 + }, + "values": { + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The present sequence number used in pulse reports", + "version": { + "first": 161, + "last": 213 + }, + "values": { + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "StoreConfiguration": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 26, + "last": 97 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 98, + "last": 136 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 161, + "last": 213 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "You do need to use this if you change any parameters in IRDA and want to keep them.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "finalize" + } + } + ] + }, + "AMRDigits": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of digits to use for AMR", + "version": { + "first": 40, + "last": 52 + }, + "values": { + "default": 9, + "minimum": 0, + "maximum": 9 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of digits to use for AMR", + "version": { + "first": 53, + "last": 97 + }, + "values": { + "default": 9, + "minimum": 0, + "maximum": 9 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of digits to use for AMR", + "version": { + "first": 98, + "last": 136 + }, + "values": { + "default": 8, + "minimum": 0, + "maximum": 9 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of digits to use for AMR", + "version": { + "first": 161, + "last": 213 + }, + "values": { + "default": 8, + "minimum": 0, + "maximum": 9 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "Cordonel NA can use a subset of the display digits for AMR readings. This is the number of digits to use.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "AMROffset": { + "id": 5, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The offset of the AMR smallest digit from the right (always negative)", + "version": { + "first": 40, + "last": 97 + }, + "values": { + "default": 0, + "minimum": -9, + "maximum": 0 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The offset of the AMR smallest digit from the right (always negative)", + "version": { + "first": 98, + "last": 136 + }, + "values": { + "default": 0, + "minimum": -9, + "maximum": 0 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "int8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The offset of the AMR smallest digit from the right (always negative)", + "version": { + "first": 161, + "last": 213 + }, + "values": { + "default": 0, + "minimum": -9, + "maximum": 0 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "Cordonel NA can use a subset of the display digits for AMR readings. This is the offset (from the right).", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "UI1203Fields": { + "id": 6, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A bitfield of the optional fields being used for UI-1203", + "version": { + "first": 40, + "last": 97 + }, + "values": { + "default": 268, + "minimum": 0, + "maximum": 268 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A bitfield of the optional fields being used for UI-1203", + "version": { + "first": 98, + "last": 136 + }, + "values": { + "default": 268, + "minimum": 0, + "maximum": 268 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A bitfield of the optional fields being used for UI-1203", + "version": { + "first": 161, + "last": 213 + }, + "values": { + "default": 268, + "minimum": 0, + "maximum": 268 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "These are the fields used in NA AMR reading strings.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "MfgDate": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A timestamp of meter manufacture in seconds since 1/1/2000 00:00:00 UTC", + "version": { + "first": 43, + "last": 136 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "time_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A timestamp of meter manufacture in seconds since 1/1/2000 00:00:00 UTC", + "version": { + "first": 161, + "last": 213 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "Simple timestamp, should be filled in at the end of manufacture. Time now.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "DisplayAMRDigits": { + "id": 8, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether or not to display AMR digits on the screen", + "version": { + "first": 92, + "last": 97 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether or not to display AMR digits on the screen", + "version": { + "first": 98, + "last": 136 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "infrequentlyupdated" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether or not to display AMR digits on the screen", + "version": { + "first": 161, + "last": 213 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "In NA the AMR digits should be displayed on the LCD periodically, in EMEA they shouldn't.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "AdapterID": { + "id": 9, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The serial number of the current pulse adapter", + "version": { + "first": 193, + "last": 213 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "AdapterFwVersion": { + "id": 10, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The firmware version of the current pulse adapter", + "version": { + "first": 193, + "last": 213 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "ExtendedResolution": { + "id": 11, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Boolean controlled by UI-1236 to control resolution of cubic feet unit in some meter size", + "version": { + "first": 210, + "last": 213 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Internal use in firmware only.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + } + }, + "status": { + "BAD_CONFIG": { + "id": 0 + }, + "BAD_LENGTH": { + "id": 1 + }, + "OUT_OF_RANGE": { + "id": 2 + }, + "PENDING_STORE": { + "id": 3 + }, + "DID_NOT_STORE": { + "id": 4 + }, + "TOO_MANY_BYTES": { + "id": 5 + } + } + }, + "LOGGER": { + "id": 8, + "version": { + "first": 1, + "last": 19 + }, + "registers": { + "Quota": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A quota in bytes for the log. The Logger does not apply any policy to how the quota is allocated, this is left as a restriction to be applied on a product by product basis.", + "version": { + "first": 1, + "last": 19 + }, + "values": { + "default": 4096, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "Drive": { + "id": 1, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The drive to write to.", + "version": { + "first": 1, + "last": 19 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "TriggerLogFlush": { + "id": 2, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Writing TRUE will force a log flush", + "version": { + "first": 7, + "last": 19 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "StoreConfiguration": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 16, + "last": 19 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "You do need to use this if you change any parameters in LOGGER and want to keep them.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "finalize" + } + } + ] + } + }, + "status": { + "UNKNOWN_PARAMETER": { + "id": 0 + }, + "RESTARTED": { + "id": 1 + }, + "BLOCK_LISTING": { + "id": 2 + }, + "PENDING_STORE": { + "id": 3 + }, + "DID_NOT_STORE": { + "id": 4 + } + } + }, + "METROLOGYASST": { + "id": 18, + "version": { + "first": 4, + "last": 118 + }, + "registers": { + "ILoopMaxFlowRate": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The flow rate that gives max output on the current loop", + "version": { + "first": 5, + "last": 36 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The flow rate that gives max output on the current loop", + "version": { + "first": 82, + "last": 118 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Ignore, no current loop.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "StoreConfiguration": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing TRUE to this register stores the values of the other registers to the non-volatile memory", + "version": { + "first": 7, + "last": 81 + }, + "statictype": "dynamic" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing TRUE to this register stores the values of the other registers to the non-volatile memory", + "version": { + "first": 82, + "last": 118 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "You do need to use this if you change any parameters in METROLOGYASST and want to keep them.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "finalize" + } + } + ] + }, + "PulseWeight": { + "id": 2, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Volume represented by one pulse in ml. If this is zero pulse output will not be enabled", + "version": { + "first": 7, + "last": 81 + }, + "values": { + "default": 1000, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Volume represented by one pulse in ml. If this is zero pulse output will not be enabled", + "version": { + "first": 82, + "last": 101 + }, + "values": { + "default": 1000, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Volume represented by one pulse. Units of (2^-5)ml. If this is zero pulse output will not be enabled", + "version": { + "first": 102, + "last": 118 + }, + "values": { + "default": 32000, + "minimum": 1, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": true, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "G01 Pulse value (100 l/Imp., ...). Customer specific.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PulseMode": { + "id": 3, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The way pulses are output on the two available channels. This is an enum of type pulse_mode_t.", + "version": { + "first": 7, + "last": 81 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The way pulses are output on the two available channels. This is an enum of type pulse_mode_t.", + "version": { + "first": 82, + "last": 97 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 6 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The way pulses are output on the two available channels. This is an enum of type pulse_mode_t.", + "version": { + "first": 98, + "last": 118 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 7 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": true, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "G02 Pulse type (Netted Imp./Tamp. (-), �). Customer specific.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PulseLength": { + "id": 4, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The length of a pulse. This is an enum of type pulse_length_t.", + "version": { + "first": 7, + "last": 72 + }, + "values": { + "default": 5, + "minimum": 0, + "maximum": 8 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The length of a pulse. This is an enum of type pulse_length_t.", + "version": { + "first": 73, + "last": 81 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 8 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The length of a pulse. This is an enum of type pulse_length_t.", + "version": { + "first": 82, + "last": 118 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 10 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": true, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "G03 Pulse length (500ms, �). Customer specific.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "FlowUnits": { + "id": 5, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of flow rate to display on the LCD. An enum of type displayflowunits_t", + "version": { + "first": 8, + "last": 81 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 8 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The units of flow rate to display on the LCD. An enum of type displayflowunits_t", + "version": { + "first": 82, + "last": 118 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 8 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": true, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "C05 unit (m�, kl, US-Gall./Imp.-Gall, Barrel, ...)", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "FlowPoint": { + "id": 6, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Position of the decimal point on the LCD for flow rate. An enum of type displayflowpoint_t", + "version": { + "first": 8, + "last": 81 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 4 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Position of the decimal point on the LCD for flow rate. An enum of type displayflowpoint_t", + "version": { + "first": 82, + "last": 118 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 4 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": true, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Counter size and unit. See FlowPoint.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "ILoopRate": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The update rate for the current loop", + "version": { + "first": 9, + "last": 36 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The update rate for the current loop", + "version": { + "first": 82, + "last": 118 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Ignore, no current loop.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "TemperatureUnits": { + "id": 8, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Units for displaying temperature on the LCD. 0 is Celcius, 1 is Fahrenheit.", + "version": { + "first": 13, + "last": 81 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Units for displaying temperature on the LCD. 0 is Celcius, 1 is Fahrenheit.", + "version": { + "first": 82, + "last": 118 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "�C - EMEA/China / �F - USA.", + "region": { + "emea": { + "values": { + "default": 0 + } + }, + "na": { + "values": { + "default": 1 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureUnits": { + "id": 9, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Units for displaying pressure on the LCD. 0 is Mpa, 1 is PSI.", + "version": { + "first": 13, + "last": 81 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + }, + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Units for displaying pressure on the LCD. 0 is Mpa, 1 is PSI.", + "version": { + "first": 82, + "last": 118 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": true, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "Mpa - EMEA/China / PSI - USA / Bar - USA.", + "region": { + "emea": { + "values": { + "default": 0 + } + }, + "na": { + "values": { + "custom": [ + 1, + 2 + ] + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureRate": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time between pressure measurements in milliseconds", + "version": { + "first": 13, + "last": 71 + }, + "values": { + "default": 300000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time between pressure measurements in milliseconds", + "version": { + "first": 72, + "last": 81 + }, + "values": { + "default": 60000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time between pressure measurements in milliseconds", + "version": { + "first": 82, + "last": 118 + }, + "values": { + "default": 60000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 60000 + } + }, + "na": { + "values": { + "default": 60000 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureOffset": { + "id": 11, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to subtract from measured value to correct for atmospheric pressure", + "version": { + "first": 13, + "last": 58 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to subtract from measured value to correct for atmospheric pressure", + "version": { + "first": 59, + "last": 79 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to subtract from measured value to correct for atmospheric pressure", + "version": { + "first": 80, + "last": 81 + }, + "values": { + "default": 0, + "minimum": -2000000, + "maximum": 2000000 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to subtract from measured value to correct for atmospheric pressure", + "version": { + "first": 82, + "last": 118 + }, + "values": { + "default": 0, + "minimum": -2000000, + "maximum": 2000000 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "-> 0", + "region": { + "emea": { + "values": { + "default": 0 + } + }, + "na": { + "values": { + "default": 0 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressurePresent": { + "id": 12, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether there is a pressure sensor present", + "version": { + "first": 63, + "last": 70 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static" + }, + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Whether there is a pressure sensor present", + "version": { + "first": 71, + "last": 118 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": true, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com" + ], + "remarks": "B09 Housing option (D,Y). Variant specific.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureMeasure": { + "id": 13, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write TRUE to trigger a pressure measurement, Read to get the latest measured value in Pa", + "version": { + "first": 65, + "last": 118 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "LatestFlowRate": { + "id": 14, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Returns the latest flow rate. Write 0 to change scaling to internal scaling, 1 to change to display scaling", + "version": { + "first": 92, + "last": 118 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "GenerateFwdPulses": { + "id": 15, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Generate some artificial pulses, used for testing", + "version": { + "first": 97, + "last": 118 + }, + "values": { + "minimum": 0, + "maximum": 255 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "For use in testing.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "GenerateRevPulses": { + "id": 16, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Generate some artificial pulses, used for testing", + "version": { + "first": 97, + "last": 118 + }, + "values": { + "minimum": 0, + "maximum": 255 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "For use in testing.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "PulseEvenDistribution": { + "id": 17, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Boolean value for whether pulse output is to space the pulses evenly (TRUE) or grouped (FALSE)", + "version": { + "first": 98, + "last": 118 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 1, + "DN300": 0 + } + }, + "na": { + "values": { + "default": 0 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PulseResolution": { + "id": 18, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The number of bits of fractional resolution in a pulse event", + "version": { + "first": 98, + "last": 118 + }, + "values": { + "minimum": 0, + "maximum": 7 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "Read only.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "PressureCalibration": { + "id": 19, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to add to measured value after recalibration to correct for sensor drift over time", + "version": { + "first": 108, + "last": 111 + }, + "values": { + "default": 0, + "minimum": -1000000, + "maximum": 1000000 + }, + "statictype": "static" + }, + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Value in Pa to add to measured value after recalibration to correct for sensor drift over time", + "version": { + "first": 112, + "last": 118 + }, + "values": { + "default": 0, + "minimum": -4000000, + "maximum": 4000000 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 0 + } + }, + "na": { + "values": { + "default": 0 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "DisplayEnable": { + "id": 20, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bitfield of the items to show on the display. 1 - flowrate, 2 - temperature, 4 - pressure. Note, disabling flowrate requires reboot for it to take effect.", + "version": { + "first": 116, + "last": 118 + }, + "values": { + "default": 7, + "minimum": 0, + "maximum": 7 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [], + "remarks": "Customer specific, controls display of items on row 2. NOTE: In 1.4 stream this can be used to work around bug where pressure is displayed with no pressure sensor (CORDHW-3065).", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureFlowRateCorrectionA": { + "id": 21, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Pressure readings must be corrected due to the water flow rate. This is the correction factor that is applied to the flow rate squared (units Pa / (ml/s)^2). Write 0x80000000 to fall back to the internal lookup table based on meter size. The number read back is the value being used either from the intenal lookup or having been written to this register.", + "version": { + "first": 118, + "last": 118 + }, + "values": { + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [], + "remarks": "TBD", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureFlowRateCorrectionB": { + "id": 22, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Pressure readings must be corrected due to the water flow rate. This is the correction factor that is applied to the flow rate (units Pa / (ml/s)). Write 0x80000000 to fall back to the internal lookup table based on meter size. The number read back is the value being used either from the intenal lookup or having been written to this register.", + "version": { + "first": 118, + "last": 118 + }, + "values": { + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [], + "remarks": "TBD", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + } + }, + "status": { + "BAD_CONFIG": { + "id": 0 + }, + "DID_NOT_STORE": { + "id": 1 + }, + "PENDING_STORE": { + "id": 2 + } + } + }, + "NA2WALARMS": { + "id": 23, + "version": { + "first": 41, + "last": 102 + }, + "registers": { + "StoreConfiguration": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 41, + "last": 102 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "You do need to use this if you change any parameters in NA2WALARMS and want to keep them.", + "region": { + "na": null + } + }, + "fieldtool": { + "reset_permitted": "finalize" + } + } + ] + }, + "PredefEnable": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bitmask of enabled predefined alarms", + "version": { + "first": 41, + "last": 102 + }, + "values": { + "default": 561047, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "NA has a series of alarms called 'predefined' these are the ones that should be enabled.", + "region": { + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + } + }, + "status": { + "SENSOR_INVALID": { + "id": 0 + }, + "UNKNOWN_PARAMETER": { + "id": 1 + }, + "ALARM_INVALID": { + "id": 2 + }, + "UNIMPLEMENTED": { + "id": 3 + }, + "UNCONFIGURED": { + "id": 4 + }, + "CONFIG_INVALID": { + "id": 5 + }, + "NO_LATEST": { + "id": 6 + }, + "FIXED_TYPE": { + "id": 7 + }, + "PREDEF_SET": { + "id": 8 + }, + "USERDEF_VOLUME_SET": { + "id": 9 + }, + "USERDEF_TEMPERATURE_SET": { + "id": 10 + }, + "USERDEF_PRESSURE_SET": { + "id": 11 + }, + "PREDEF_CLEAR": { + "id": 12 + }, + "USERDEF_VOLUME_CLEAR": { + "id": 13 + }, + "USERDEF_TEMPERATURE_CLEAR": { + "id": 14 + }, + "USERDEF_PRESSURE_CLEAR": { + "id": 15 + }, + "DID_NOT_STORE": { + "id": 16 + }, + "STORE_PENDING": { + "id": 17 + }, + "PREDEF_BACKUP_FAILED": { + "id": 18 + }, + "PREDEF_RESTORE_FAILED": { + "id": 19 + }, + "USERDEF_BACKUP_FAILED": { + "id": 20 + }, + "USERDEF_RESTORE_FAILED": { + "id": 21 + }, + "USERDEF_UNSUPPORTED_TYPE_FOR_SENSOR": { + "id": 22 + } + } + }, + "NA2WLOGGER": { + "id": 22, + "version": { + "first": 1, + "last": 200 + }, + "registers": { + "StoreConfiguration": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "RW", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Store all configuration items in non-volatile memory.", + "version": { + "first": 147, + "last": 200 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "na": null + } + }, + "fieldtool": { + "reset_permitted": "finalize" + } + } + ] + }, + "LimitLogSize": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Override the maximum number of entries per log (0 keeps default)", + "version": { + "first": 147, + "last": 200 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + } + }, + "status": { + "UNKNOWN_PARAMETER": { + "id": 1 + }, + "NOT_MAIN_LOOP": { + "id": 2 + }, + "LOG_INVALID": { + "id": 3 + }, + "LOG_OPEN_FAILED": { + "id": 4 + }, + "LOG_CLOSE_FAILED": { + "id": 5 + }, + "LOG_REMOVE_FAILED": { + "id": 6 + }, + "LOG_FLUSH_FAILED": { + "id": 7 + }, + "LOG_CLEAR_FAILED": { + "id": 8 + }, + "LOG_BAD_REQUEST": { + "id": 9 + }, + "LOG_BAD_LIMIT": { + "id": 10 + }, + "LOG_BUSY": { + "id": 11 + }, + "QUERY_FAILED": { + "id": 12 + }, + "QUERY_UNKNOWN_SENSOR": { + "id": 13 + }, + "QUERY_UNKNOWN_LOGFILE": { + "id": 14 + }, + "QUERY_BAD_ARGS": { + "id": 15 + }, + "QUERY_NOT_ENOUGH_SPACE": { + "id": 16 + }, + "QUERY_NO_RECORDS_FOUND": { + "id": 17 + }, + "QUERY_FILE_READ_PROBLEM": { + "id": 18 + }, + "SETTINGS_STORE_FAILED": { + "id": 19 + }, + "SETTINGS_BAD_SENSORID": { + "id": 20 + }, + "SETTINGS_BAD_PERIOD": { + "id": 21 + }, + "SETTINGS_BAD_CHECKSUM": { + "id": 22 + }, + "SETTINGS_BAD_TIMESTAMP": { + "id": 23 + }, + "FILING_BAD": { + "id": 24 + }, + "BAD_RECORD": { + "id": 25 + }, + "RANGE_SENSORID_BAD": { + "id": 26 + }, + "STORE_PENDING": { + "id": 27 + }, + "DID_NOT_STORE": { + "id": 28 + } + } + }, + "NFC": { + "id": 21, + "version": { + "first": 1, + "last": 65 + }, + "registers": { + "EraseRMA": { + "id": 0, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RW" + }, + "description": "Writing TRUE to this register erases the RMA area", + "version": { + "first": 7, + "last": 65 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "You may wish to do this at the end of manufacture to clear all the old data out.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "ForceUpdate": { + "id": 1, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Write to this to force an update of some data. 0 - NDEF readings, 1 - NDEF details, 2 - RMA details", + "version": { + "first": 49, + "last": 65 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + } + }, + "status": { + "BAD_CONFIG": { + "id": 0 + }, + "NDEF_WRITE_FAIL": { + "id": 1 + }, + "NDEF_VERIFY_FAIL": { + "id": 2 + }, + "NDEF_UPDATE_FAIL": { + "id": 3 + }, + "RMA_WRITE_FAIL": { + "id": 4 + }, + "RMA_VERIFY_FAIL": { + "id": 5 + }, + "RMA_BAD_ENTRY": { + "id": 6 + }, + "INIT_FAIL": { + "id": 7 + }, + "NDEF_CONFIG_FAIL": { + "id": 8 + }, + "RMA_CONFIG_FAIL": { + "id": 9 + }, + "NDEF_START_FAIL": { + "id": 10 + }, + "RMA_START_FAIL": { + "id": 11 + } + } + }, + "OPTICALINTERFACE": { + "id": 256, + "version": { + "first": 1, + "last": 366 + }, + "builds": { + "emea": [ + { + "id": 230, + "fw": "106E" + }, + { + "id": 230, + "fw": "106F" + }, + { + "id": 257, + "fw": "1107" + }, + { + "id": 257, + "fw": "1108" + }, + { + "id": 278, + "fw": "1247" + }, + { + "id": 318, + "fw": "130A" + }, + { + "id": 330, + "fw": "130B" + }, + { + "id": 331, + "fw": "13F3" + }, + { + "id": 346, + "fw": "1310" + }, + { + "id": 350, + "fw": "1416" + }, + { + "id": 351, + "fw": "14E0" + }, + { + "id": 358, + "fw": "14E1" + }, + { + "id": 359, + "fw": "14E2" + }, + { + "id": 360, + "fw": "14E3" + }, + { + "id": 361, + "fw": "1417" + }, + { + "id": 362, + "fw": "1420" + }, + { + "id": 363, + "fw": "1421" + }, + { + "id": 364, + "fw": "1422" + }, + { + "id": 365, + "fw": "1423" + }, + { + "id": 366, + "fw": "1424" + } + ], + "na": [ + { + "id": 278, + "fw": "1228" + }, + { + "id": 310, + "fw": "2002" + }, + { + "id": 324, + "fw": "2006" + }, + { + "id": 352, + "fw": "2013" + } + ] + } + }, + "OPTICALPORT": { + "id": 5, + "version": { + "first": 1, + "last": 55 + }, + "registers": { + "BaudRateCapabilities": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Bitmask of supported rates on the given hardware.", + "version": { + "first": 2, + "last": 55 + }, + "statictype": "static" + } + ] + }, + "PacketSizeCapabilities": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Bitmask of supported packet sizes.", + "version": { + "first": 2, + "last": 55 + }, + "values": { + "default": 64 + }, + "statictype": "static" + } + ] + }, + "ProtocolVersion": { + "id": 2, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Version number as fixed point 16.16 format BCD.", + "version": { + "first": 2, + "last": 55 + }, + "statictype": "static" + } + ] + }, + "BaudRateSelected": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Baud rate in bits per second.", + "version": { + "first": 2, + "last": 55 + }, + "statictype": "dynamic" + } + ] + }, + "PacketSizeSelected": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Packet size in bytes.", + "version": { + "first": 2, + "last": 55 + }, + "statictype": "dynamic" + } + ] + }, + "ExternalUartControl": { + "id": 5, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "WO", + "lvl2": "WO", + "lvl3": "WO", + "lvl4": "WO", + "lvl5": "WO", + "lvl6": "WO", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Surrenders the UART to another application", + "version": { + "first": 49, + "last": 55 + }, + "statictype": "dynamic" + } + ] + } + }, + "status": { + "PAYLOAD_COUNT": { + "id": 0 + }, + "INVALID_SUBREASON": { + "id": 1 + }, + "INVALID_BAUDRATE": { + "id": 2 + }, + "INVALID_BUFFERSIZE": { + "id": 3 + }, + "CRCFAILURE": { + "id": 4 + }, + "UNRECOGNISEDCMD": { + "id": 5 + }, + "FRAMING": { + "id": 6 + }, + "OVERFLOW": { + "id": 7 + }, + "PACKETTIMEOUT": { + "id": 8 + }, + "INVALIDESCAPE": { + "id": 9 + }, + "UNKNOWN_PARAMETER": { + "id": 10 + }, + "TRAINING_FAILED": { + "id": 11 + }, + "NOBREAK": { + "id": 12 + } + } + }, + "PERIODICLOG": { + "id": 17, + "version": { + "first": 1, + "last": 78 + }, + "registers": { + "DataLogContents": { + "id": 0, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit Mask of the items to store in LOG memory", + "version": { + "first": 10, + "last": 77 + }, + "values": { + "default": 201335811, + "minimum": 3, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 201335811 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "This is a copy of DataLogContents from SENSUSRADIO. Don't modify here.", + "version": { + "first": 78, + "last": 78 + }, + "values": { + "default": 206906379, + "minimum": 3, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Please set the desired content in SENSUSRADIO and wait 22 seconds for storage.", + "region": { + "emea": { + "values": { + "default": 206906379 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "DataLogPeriod": { + "id": 1, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Storage Period of the LOG memory in minutes", + "version": { + "first": 10, + "last": 77 + }, + "values": { + "default": 60, + "minimum": 1, + "maximum": 1440 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com", + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 60 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A Copy from SENSUSRADIO. Storage Period in minutes of the LOG memory in minutes. Don't modify here.", + "version": { + "first": 78, + "last": 78 + }, + "values": { + "default": 60, + "minimum": 1, + "maximum": 1440 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com", + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Please set the desired content in SENSUSRADIO and wait 22 seconds for storage.", + "region": { + "emea": { + "values": { + "default": 60 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "AverageFlowPeriod": { + "id": 2, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Averiging period for the Min/Max calculation of LOG&FDR memory", + "version": { + "first": 10, + "last": 77 + }, + "values": { + "default": 5, + "minimum": 1, + "maximum": 60 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 5 + } + } + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A Copy from SENSUSRADIO. Averaging period in minutes. It is calculated automatically in SENSURADIO. Don't modify.", + "version": { + "first": 78, + "last": 78 + }, + "values": { + "default": 5, + "minimum": 1, + "maximum": 60 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 5 + } + } + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "FixedDateReadingContents": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bit Mask of the items to store in FDR memory", + "version": { + "first": 10, + "last": 77 + }, + "values": { + "default": 201335811, + "minimum": 3, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 201335811 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A Copy from SENSUSRADIO. Bit Mask of the FDR items to be logged. Don't modify here. Set this parameter in SENSUSRADIO and wait 22 sec for storage in PERIODICLOG", + "version": { + "first": 78, + "last": 78 + }, + "values": { + "default": 206906379, + "minimum": 3, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 206906379 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "FixedDateDayOfMonth": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The day of month the FDR storage will take place at 00:00", + "version": { + "first": 10, + "last": 77 + }, + "values": { + "default": 1, + "minimum": 1, + "maximum": 28 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com", + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 1 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A Copy from SENSUSRADIO. The day of month where FDR storage will take place at 00:00. Don't modify here.", + "version": { + "first": 78, + "last": 78 + }, + "values": { + "default": 1, + "minimum": 1, + "maximum": 28 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "jens.schulz@xylem.com", + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Please set the desired content in SENSUSRADIO and wait 22 seconds for storage.", + "region": { + "emea": { + "values": { + "default": 1 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PeriodicLogLifeTimeCounter": { + "id": 5, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A counter used for internal purposes", + "version": { + "first": 15, + "last": 78 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 0 + } + } + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "ResetCounter": { + "id": 6, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A counter to monitor the application resets", + "version": { + "first": 20, + "last": 78 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 0 + } + } + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + } + }, + "status": { + "FOPEN": { + "action": "Perform a FOPEN to any of the logging files logdata, fdrdata, evtdata ... ", + "description": "FOPEN action failed due to any reason (means fopen error)", + "id": 0 + }, + "BAD_CONFIG": { + "action": "Handle the internal dual logging file access by SensusRfRadio and by PeriodicLogging", + "description": "Mutual Exclude file access failed due to a wrong internal status order", + "id": 1 + }, + "STRING_TOO_LONG": { + "action": "Currently unused or not define action", + "description": "Currently not generated or returned", + "id": 2 + }, + "FILES_IN_USE": { + "action": "Handle the internal dual logging file access by SensusRfRadio and by PeriodicLogging", + "description": "File access denied because the other party has currently access to the file(s)", + "id": 3 + } + } + }, + "POWERMON": { + "id": 1, + "version": { + "first": 17, + "last": 72 + }, + "registers": { + "BatteryVoltage": { + "id": 0, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Measured battery terminal voltage in 1mV units.", + "version": { + "first": 17, + "last": 72 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "BatteryManufacturer": { + "id": 1, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "String describing the battery brand.", + "version": { + "first": 17, + "last": 72 + }, + "values": { + "default": "Tadiran" + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "BatterySize": { + "id": 2, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "One of: 0 = battery absent; 1 = built in; 2 = other; 3 = AA; 4 = AAA; 5 = C; 6 = D; 255 = unknown", + "version": { + "first": 17, + "last": 72 + }, + "values": { + "default": 6, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": true, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "uwe.brehm@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 6 + } + }, + "na": { + "values": { + "default": 6 + } + } + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "BatteryQuantity": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The number of installed batteries.", + "version": { + "first": 17, + "last": 59 + }, + "values": { + "default": 1 + }, + "statictype": "static" + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of installed batteries.", + "version": { + "first": 60, + "last": 72 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "uwe.brehm@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 2 + } + }, + "na": { + "values": { + "default": 2 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "BatteryRatedVoltage": { + "id": 5, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Datasheet terminal voltage in 100mV units as manufactured.", + "version": { + "first": 17, + "last": 72 + }, + "values": { + "default": 36, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": true, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "uwe.brehm@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "BatteryVoltageMinThreshold": { + "id": 7, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Datasheet terminal voltage in 100mV units below which the cell is considered empty.", + "version": { + "first": 17, + "last": 72 + }, + "values": { + "default": 28, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": true, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "uwe.brehm@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "BatterySelection": { + "id": 8, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Chosen manufacturer from the internal lookup table of known batteries.", + "version": { + "first": 20, + "last": 72 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": true, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "uwe.brehm@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "TotalUsedCharge": { + "id": 9, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Accumulated charge used in uAs.", + "version": { + "first": 24, + "last": 72 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "TotalUsedSeconds": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Elapsed time since manufacture in seconds.", + "version": { + "first": 39, + "last": 72 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "WarnFromClamp": { + "id": 11, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Time in seconds for which the projected end time cannot exceed.", + "version": { + "first": 39, + "last": 72 + }, + "values": { + "default": 473040000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "alex.frost@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "This should be set to the expected life of the meter. In the early days the expected lifetime will be this. Set to 22 years to include warehouse storage time.", + "region": { + "emea": { + "values": { + "default": 694224000 + } + }, + "na": { + "values": { + "default": 694224000 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "BatteryMilliAHrRating": { + "id": 12, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Datasheet capacity in mAh units as manufactured.", + "version": { + "first": 45, + "last": 72 + }, + "values": { + "default": 19000, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": true, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "uwe.brehm@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "StoreConfiguration": { + "id": 13, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 61, + "last": 72 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "You do need to use this if you change any parameters in POWERMON and want to keep them.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "finalize" + } + } + ] + }, + "CriticalRepeatLimit": { + "id": 14, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of 15 minute periods of consecutive low battery voltage required for the battery to be deemed critically low", + "version": { + "first": 66, + "last": 72 + }, + "values": { + "default": 96, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "RemainingSeconds": { + "id": 15, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "", + "version": { + "first": 69, + "last": 72, + "exclude": [ + 70 + ] + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "" + ], + "remarks": "Read-only value for remaining battery lifetime, not useful in manufacture, ignore", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + } + }, + "status": { + "TABLE_FULL": { + "id": 0 + }, + "UNKNOWN_PARAMETER": { + "id": 1 + }, + "OUT_OF_RANGE": { + "id": 2 + }, + "STOP_CYCLING": { + "id": 3 + }, + "TEMPERATURE_LIMIT": { + "id": 4 + }, + "BATTERY_STATUS_CHANGED": { + "id": 5 + }, + "BATTERY_CRITICAL": { + "id": 6 + }, + "PENDING_STORE": { + "id": 7 + }, + "DID_NOT_STORE": { + "id": 8 + } + } + }, + "SENSUSRADIO": { + "id": 16, + "version": { + "first": 100, + "last": 554 + }, + "registers": { + "TxInterval": { + "id": 0, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The SensusRF transmission interval in seconds for the BUPs", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 15, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 15 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "OmTxInterval": { + "id": 1, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The Open Metering transmission interval in seconds", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 3600, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 900 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "LatInterval": { + "id": 2, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The Listen After Talk interval as number 'n'. After every 'n' BUPs follows a BUP-LAT", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 3, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 3 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "WakeupInterval": { + "id": 3, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The Wake Up interval in seconds 's'. Every 's' seconds will the meter sniff for a WakeUp tone. 's' == 0 means active sending and no sniffing", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 3, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 3 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "MbusState": { + "id": 4, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The internal MBus state (Open Metering). A bit oriented value. Do not write if you do not know details", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 7, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": true, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 7 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "FrequencyIndicator": { + "id": 5, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A number that shows the radio frequency used. Normally 433 or 868", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 433, + "minimum": 433, + "maximum": 868 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Constant, do not change.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "FrequencyOffset": { + "id": 6, + "details": [ + { + "type": "int16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A radio frequency calibration parameter", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": -32768, + "maximum": 32767 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": true, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Unchanged.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PowerLevel": { + "id": 7, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A parameter for controling the radio power", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 127 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Read calibration value from data base, dependant on used variant.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "SystemState": { + "id": 9, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The internal System State of the Radio", + "version": { + "first": 100, + "last": 544 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Set to 0xFF at the end of parameterization to trigger shipping mode.", + "region": { + "emea": null + } + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The internal System State of the Radio", + "version": { + "first": 545, + "last": 554 + }, + "values": { + "default": 1, + "minimum": 1, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Set to 0xFF at the end of parameterization to trigger shipping mode.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "RadioAddress": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The radio address used by the meter", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Set final radio address.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "UtcTimeOffset": { + "id": 11, + "details": [ + { + "type": "int32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The offset the between meter time and UTC for time correction", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": -2147483648, + "maximum": 2147483647 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Unchanged.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "SentBytesCounter": { + "id": 12, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of bytes sent during meter lifetime", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Unchanged.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "ReceivedBytesCounter": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of bytes received during meter lifetime", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Unchanged.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "ResetCounter": { + "id": 14, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of resets the application SensusRfRadio has performed over lifetime", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Unchanged.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "BootLoaderState": { + "id": 15, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "An internal temporary state (enum) regarding the firmwware update", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Unchanged.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "LeakFlowThreshold": { + "id": 16, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The flow value of the leakage (low flow) detection", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 25, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "LeakFlowTimeThreshold": { + "id": 17, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time in minutes of the leakage (low flow) detection threshold", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 360, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "BrokenPipeFlowThreshold": { + "id": 18, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The flow value of the broken pipe (high flow) detection", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 2500, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "BrokenPipeFlowTimeThreshold": { + "id": 19, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time in Minutes of the broken pipe (high flow) detection threshold", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 180, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureMaxThreshold": { + "id": 20, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The pressure value of the maximum (high) pressure alarm", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 160, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureMinThreshold": { + "id": 21, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The pressure value of the minimum (low) pressure alarm", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 3, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureLimitTimeMaxThreshold": { + "id": 22, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time in seconds of the maximum (high) pressure alarm threshold", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureLimitTimeMinThreshold": { + "id": 23, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time in seconds of the minimum (low) pressure alarm threshold", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureMeasurePeriod": { + "id": 24, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The period in seconds with which the pressure is measured (fix 60 sec)", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 60, + "minimum": 60, + "maximum": 60 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureUnit": { + "id": 25, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "An enum respresenting the unit of pressure (0= no pressure sensor, 1= MPas, 2= PSI, 3= Bar)", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 3 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PressureGaugeOffset": { + "id": 26, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The gauge offset of the pressure sensor value in mBar", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "TemperatureMaxThreshold": { + "id": 27, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The temperature value of the maximum (high) temperature alarm", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 50, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "TemperatureMinThreshold": { + "id": 28, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The temperature value of the minimum (low) temperature alarm", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 2, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "TemperatureTimeMaxThreshold": { + "id": 29, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time in Minutes of the maximum (high) temperature alarm threshold", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "TemperatureTimeMinThreshold": { + "id": 30, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The time in Minutes of the minimum (low) temperature alarm threshold", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 600, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "TemperatureMeasurePeriod": { + "id": 31, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The period in seconds with which the temperature is measured (only 60 is valid)", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 60, + "minimum": 60, + "maximum": 60 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "TemperatureUnit": { + "id": 32, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "An enum respresenting the unit of temperature (1= Celsius, 2= Fahrenheit)", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 2 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PulseOutWidth": { + "id": 33, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "An enumerator defining the currently active PulseWidth (0 ... 8 for non testmode values and 9 ... 15 for testmode)", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 15 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PulseOutDivisor": { + "id": 34, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A number representing the pulse weight multiplicator 1, 10, 100 or 1000", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 1000 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PulseOutMode": { + "id": 35, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "An enum (0 to 3) representing the pulse output mode (0= deactivated, ...)", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 3 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "CurrentLoopMax": { + "id": 36, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A parameter regarding the non existing current loop output", + "version": { + "first": 100, + "last": 554 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Not used anymore.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "CurrentLoopSource": { + "id": 37, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A parameter regarding the non existing current loop output", + "version": { + "first": 100, + "last": 554 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Not used anymore.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "MainAlarmMask": { + "id": 38, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A byte value representing a mask of currently active (1) main alarms. These are the flow and genreral alarms", + "version": { + "first": 100, + "last": 544 + }, + "values": { + "default": 207, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at CUSTOMER APP.", + "region": { + "emea": null + } + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A byte value representing a mask of currently active (1) main alarms. These are the flow and genreral alarms", + "version": { + "first": 545, + "last": 554 + }, + "values": { + "default": 207, + "minimum": 128, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at CUSTOMER APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "ExtendedAlarmMask": { + "id": 39, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A byte value representing a mask of currently active (1) extended alarms. These are the temperature and pressure related alarms", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 60, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at CUSTOMER APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "HistoricalAlarmsDays": { + "id": 40, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A number of days (0 = off) after which alarms are cleared from the alarm byte values when they are no longer active", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 29, + "minimum": 0, + "maximum": 250 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": { + "values": { + "default": 29 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "TestModeTime": { + "id": 43, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A value in minutes that defines the time the meter will stay in testmode after that mode was started", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Runtime value.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "EncryptionKey": { + "id": 44, + "details": [ + { + "type": "uint128_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The SensusRF encryption key (16 bytes) of the meter", + "version": { + "first": 100, + "last": 554 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": true, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "D05 radio key (Sensus (standard), �)", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "Authentification": { + "id": 45, + "details": [ + { + "type": "uint96_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The SensusRF Authentification PINs (3 PINs of 4 byte each) of the meter", + "version": { + "first": 100, + "last": 554 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Unchanged.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "UpgFWVersion": { + "id": 46, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The version of the complete Meter firmware package as represented by application FlexNetVersion", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Unchanged.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "CustomerText": { + "id": 47, + "details": [ + { + "type": "uint72_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "An array of 9 bytes of freely programmable SensusRF customer Text", + "version": { + "first": 100, + "last": 554 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Customer specific.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "RadioLastReadTime": { + "id": 48, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "An uint32_t value representing the meter's system DateTime when the radio had last time sent a telegram", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "LowBatDateTime": { + "id": 49, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "An uint32_t value representing the meter's system DateTime when the radio had detected first the low-battery status", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because these are temporary values just for information.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "VeryLowBatDateTime": { + "id": 50, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A copy of the LowBatDateTime time stamp", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "Unit": { + "id": 51, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A byte value representing the currently active volume unit used by radio", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 19, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Dependant on territory setting acc SAP order.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "ExtendedUnitFlags": { + "id": 52, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A byte value representing additional information regarding the unit derived from the volume unit when used for flow or alternate volume, 0x1x= liter per sec, 0xx1= kiloLiter", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 17 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": "custom", + "vako": true, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Customer specific. Can be ignored because these are temporary values just for information.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "OTAControlFlags": { + "id": 53, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A byte value normaly never changed regarding general behavior of the firmware related to Over The Air updates", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 1, + "minimum": 0, + "maximum": 255 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "1: if OTA update is allowed.", + "region": { + "emea": { + "values": { + "default": 0 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "Tfx_Structure": { + "id": 54, + "details": [ + { + "type": "uint88_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A complex structure of 84 bytes related to the Tfx mode of the meter respectively the volume channel", + "version": { + "first": 100, + "last": 549 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because these are temporary values just for information.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "uint672_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A complex structure of 84 bytes related to the Tfx mode of the meter respectively the volume channel", + "version": { + "first": 550, + "last": 554 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because these are temporary values just for information.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "Dewa_Structure": { + "id": 55, + "details": [ + { + "type": "uint64_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A structure of 4 uint16_t values used for the customer DEWA", + "version": { + "first": 100, + "last": 554 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because these are temporary values just for information.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "DataLogContents": { + "id": 56, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A 4 byte bit mask representing whether the individual data items are logged in the periodic logging (1) or not (0)", + "version": { + "first": 100, + "last": 553 + }, + "values": { + "default": 201335811, + "minimum": 3, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at PERIODIC_LOGGER APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "32 Bit Mask of the items to be logged. Minimum items: 0x0C002003 (201344787 - can not be cleared)", + "version": { + "first": 554, + "last": 554 + }, + "values": { + "default": 206906379, + "minimum": 3, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Please wait 22 seconds after writing for storage in PERIODICLOG.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "DataLogPeriod": { + "id": 57, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A number in seconds representing the time period for storing data records into the periodic logging file (memory)", + "version": { + "first": 100, + "last": 553 + }, + "values": { + "default": 60, + "minimum": 1, + "maximum": 1440 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at PERIODIC_LOGGER APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "number of minutes representing the time period for storing data records into the periodic log file", + "version": { + "first": 554, + "last": 554 + }, + "values": { + "default": 60, + "minimum": 1, + "maximum": 1440 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Please wait 22 seconds after writing for storage in PERIODICLOG.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "AverageFlowPeriod": { + "id": 58, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A number derived automatically from the DataLogPeriod that determines averaging periods in mimutes for min and max calculations", + "version": { + "first": 100, + "last": 553 + }, + "values": { + "default": 5, + "minimum": 1, + "maximum": 60 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at PERIODIC_LOGGER APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + }, + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A number minutes that was automatically calculated from the DataLogPeriod for the averaging period and min and max calculations", + "version": { + "first": 554, + "last": 554 + }, + "values": { + "default": 5, + "minimum": 1, + "maximum": 60 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is calulated automatically", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "FixedDateReadingContents": { + "id": 59, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A 4 byte bit mask representing whether the individual data items are logged in the fixed date logging (1) or not (0)", + "version": { + "first": 100, + "last": 553 + }, + "values": { + "default": 201335811, + "minimum": 3, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at PERIODIC_LOGGER APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + }, + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "32 bit mask defining FDR logging items. Minimum items: 0x0C002003 (201344787 - can not be cleared) ", + "version": { + "first": 554, + "last": 554 + }, + "values": { + "default": 206906379, + "minimum": 3, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "After setting wait 22 seconds for storage in PERIODICLOG", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "FixedDateDayOfMonth": { + "id": 60, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The day of the month (0 = every day) on which at 00:00 the fixed date logging takes place", + "version": { + "first": 100, + "last": 553 + }, + "values": { + "default": 1, + "minimum": 1, + "maximum": 28 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at PERIODIC_LOGGER APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + }, + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The day of the month (0 = every day) on which at 00:00 the fixed date logging takes place", + "version": { + "first": 554, + "last": 554 + }, + "values": { + "default": 1, + "minimum": 1, + "maximum": 28 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": true, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "After setting wait 22 seconds for storage in PERIODICLOG", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "MetroRadioLifeTimeCounter": { + "id": 61, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "An uint32_t counter used originally for debugging during development. Meanwhile out of use", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because these are temporary values just for information.", + "region": { + "emea": { + "values": { + "default": 0 + } + } + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "PowerLevelOption": { + "id": 62, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "An uint8_t value related to the power level used by the radio when an Irda module is present", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 127 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Read calibration value from data base, dependant on used variant.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "ImpedanceCodeNew": { + "id": 63, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "An uint16_t value used for adjusting the antenna impedance", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 32767 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Read calibration value from data base, dependant on used variant.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "ImpedanceCodeOption": { + "id": 64, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "An uint16_t value used for adjusting the antenna impedance if an Irda module is present", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 4, + "minimum": 0, + "maximum": 32767 + }, + "statictype": "static", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Read calibration value from data base, dependant on used variant.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "IrDAModulePresent": { + "id": 65, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A parameter of type bool that signals the presence of an Irda module. The value is controlled by the meter", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignor because is set up at CUSTOMER APP?", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "StoreConfiguration": { + "id": 66, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Write 1 to store configuration values to non-volatile storage. Read back for status", + "version": { + "first": 100, + "last": 554 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "finalize" + } + } + ] + }, + "LifeTimeSeconds": { + "id": 67, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of seconds since the radio left the production (Set to 0 at the end of the production proccess)", + "version": { + "first": 100, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because these are temporary values just for information.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "DutyCycleCredit": { + "id": 68, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A value (counter) used only during development for release testing", + "version": { + "first": 412, + "last": 554 + }, + "values": { + "default": 4320000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because these are temporary values just for information.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "ActivityCredit": { + "id": 69, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A counter used to control the radio activity which must not exceed certain regulatory limits", + "version": { + "first": 412, + "last": 554 + }, + "values": { + "default": 1000, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because these are temporary values just for information.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "PersistenceGroup1": { + "id": 70, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Storage item for HistoricalErrorLimitCounters Reverse(1, hi) and Leak(0, lo)", + "version": { + "first": 437, + "last": 554 + }, + "values": { + "default": 16711935, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because these are temporary values just for information.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "PersistenceGroup2": { + "id": 71, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Storage item for HistoricalErrorLimitCounters Magnet(3, hi) and Air(2, lo)", + "version": { + "first": 437, + "last": 554 + }, + "values": { + "default": 16711935, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because these are temporary values just for information.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "PersistenceGroup3": { + "id": 72, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Storage item for HistoricalErrorLimitCounters PressureMin(5, hi) and PressureMax(4, lo)", + "version": { + "first": 437, + "last": 554 + }, + "values": { + "default": 16711935, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because these are temporary values just for information.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "PersistenceGroup4": { + "id": 73, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Storage item for HistoricalErrorLimitCounters TempMin(7, hi) and TempMax(6, lo)", + "version": { + "first": 437, + "last": 554 + }, + "values": { + "default": 16711935, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because these are temporary values just for information.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "PressureCalibration": { + "id": 74, + "details": [ + { + "type": "int8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "int8_t value to add an offset to the measured pressure in 10mBar resolution (for value from -1270 to +1270 mBar for field calibration purposes). -128 is an invalid value", + "version": { + "first": 483, + "last": 554 + }, + "values": { + "default": 0, + "minimum": -127, + "maximum": 127 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because is set up at METROLOGYASST APP.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "TfxSecondaryChannelInfo_1": { + "id": 75, + "details": [ + { + "type": "uint48_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "a 6 bytes big complex structure for the Tfx settings of the secondary channel 1 (temperature)", + "version": { + "first": 494, + "last": 554 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because these are temporary values just for information.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "TfxSecondaryChannelInfo_2": { + "id": 76, + "details": [ + { + "type": "uint48_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "a 6 bytes big complex structure for the Tfx settings of the secondary channel 2 (pressure)", + "version": { + "first": 494, + "last": 554 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because these are temporary values just for information.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "OmsLastMessageCounter": { + "id": 77, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "An unit32_t value used to support/control the MB_MODE3_OMSv4B transmission uinque MCR", + "version": { + "first": 499, + "last": 554 + }, + "values": { + "default": 0, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "Can be ignored because these are temporary values just for information.", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "PersistenceGroup5": { + "id": 78, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Storage item for HistoricalErrorLimitCounters NoFlowAlarm(7, hi) and Metrology Failure(6, lo)", + "version": { + "first": 536, + "last": 554 + }, + "values": { + "default": 16711935, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "PersistenceGroup6": { + "id": 79, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Storage item for HistoricalErrorLimitCounters Reboot Alarm(7, hi) and reserved(6, lo)", + "version": { + "first": 536, + "last": 554 + }, + "values": { + "default": 16711680, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": false, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "Gradient_Alarm_Telegram_Persistence": { + "id": 80, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Alarm persistence in Minutes for both pressure Gardient Alarm types", + "version": { + "first": 550, + "last": 554 + }, + "values": { + "default": 60, + "minimum": 0, + "maximum": 255 + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "joerg.lachenmayer@xylem.com" + ], + "remarks": "", + "region": { + "emea": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + } + }, + "status": { + "UNKNOWN_PARAMETER": { + "action": "According to the source code no action assigned to this error code", + "description": "It appears to be not used", + "id": 0 + }, + "BAD_CONFIG": { + "action": "Writing a new LOG or FDR content to Radio for forwarding to PeriodicLog", + "description": "A bit mask is written which is not valid (e.g. not all mandatory bits are equal to 1)", + "id": 1 + }, + "NO_CHANGE": { + "action": "Writing a new parameter value so several functions (e.g. Set HistoricalErrorLimitDays)", + "description": "The new value has no effect: New value == Old value)", + "id": 2 + }, + "STORE_PENDING": { + "action": "Writing SENSUSRADIO_STORECONFIGURATION to 1 ...", + "description": "The initiated storing action is still ongoing and the file system is busy. The final status is pending", + "id": 3 + }, + "DID_NOT_STORE": { + "action": "Writing SENSUSRADIO_STORECONFIGURATION to 1 ...", + "description": "This is a final status. The initiated storing action failed. An alternate status would be 'OK'", + "id": 4 + } + } + }, + "SYSTEM": { + "id": 0, + "version": { + "first": 141, + "last": 541 + }, + "registers": { + "TriggerUpgrade": { + "id": 0, + "details": [ + { + "type": "bool_t", + "privilege": { + "lvl1": "NA", + "lvl2": "NA", + "lvl3": "NA", + "lvl4": "NA", + "lvl5": "NA", + "lvl6": "NA", + "lvl7": "WO", + "lvl8": "WO" + }, + "description": "Writing TRUE to this register internally calls SysTriggerUpgrade() then returns the result.", + "version": { + "first": 141, + "last": 541 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Firmware upgrade may well use these.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "CheckPresence": { + "id": 1, + "details": [ + { + "type": "RPC", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing an application id number allows the version number of that application to be read back.", + "version": { + "first": 150, + "last": 541 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Useful for checking the firmware that is loaded.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "PCBSerialNumber": { + "id": 2, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "A string reporting the PCB serial number, this string must be set using production equipment.", + "version": { + "first": 169, + "last": 541 + }, + "values": { + "default": "" + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "CustomerSerialNumber0": { + "id": 3, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. If subsequent changes are needed CUSTOMERSERIALNUMBER1 must be used.", + "version": { + "first": 170, + "last": 541 + }, + "values": { + "default": "" + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "CustomerSerialNumber1": { + "id": 4, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. If subsequent changes are needed CUSTOMERSERIALNUMBER2 must be used.", + "version": { + "first": 170, + "last": 541 + }, + "values": { + "default": "" + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "CustomerSerialNumber2": { + "id": 5, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. If subsequent changes are needed CUSTOMERSERIALNUMBER3 must be used.", + "version": { + "first": 170, + "last": 541 + }, + "values": { + "default": "" + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "CustomerSerialNumber3": { + "id": 6, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "A string reported relating to the customer, this string can be written only once after manufacture. This is the last customer serial number change slot.", + "version": { + "first": 170, + "last": 541 + }, + "values": { + "default": "" + }, + "statictype": "infrequentlyupdated", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "MonotonicSeconds": { + "id": 7, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "The number of seconds since reboot.", + "version": { + "first": 176, + "last": 541 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "CalendarSeconds": { + "id": 8, + "details": [ + { + "type": "time_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "The number of seconds since 01-Jan-2000.", + "version": { + "first": 176, + "last": 541 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "alex.frost@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "Time now. Write the current time during manufacture.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "CoreRevision": { + "id": 9, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "A string reporting the product version string held in the system core binary.", + "version": { + "first": 196, + "last": 541 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [ + "alex.frost@xylem.com" + ], + "remarks": "This is effectively another application version number but for the Breeze Core and is worth looking at.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "DriveCapacity": { + "id": 10, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing a drive number returns the drive capacity in bytes, or 0 if the drive is not ready, or an error if the driver is not configured to be present.", + "version": { + "first": 233, + "last": 541 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "ExitReason": { + "id": 11, + "details": [ + { + "type": "status_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing an application id number allows the exit error number of that application to be read back.", + "version": { + "first": 258, + "last": 541 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "CorePlatform": { + "id": 12, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RO", + "lvl8": "RO" + }, + "description": "Reports the instruction set of the hosting microprocessor in b8-15 and allocated platform number in b0-7.", + "version": { + "first": 265, + "last": 541 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "n/a" + } + } + ] + }, + "CRC": { + "id": 13, + "details": [ + { + "type": "uint16_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing an application id number allows the CRC of that application to be read back.", + "version": { + "first": 279, + "last": 541 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Useful for checking the firmware that is loaded.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + }, + "UpgradePermissions": { + "id": 14, + "details": [ + { + "type": "uint8_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RO", + "lvl4": "RO", + "lvl5": "RO", + "lvl6": "RO", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Bitfield of permissions releated to firmware upgrade", + "version": { + "first": 470, + "last": 541 + }, + "statictype": "static", + "production": { + "required": false, + "kitron": false, + "csd": "default", + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [ + "alex.frost@xylem.com", + "roland.drabesch@xylem.com" + ], + "remarks": "Set fix as final step at production.", + "region": { + "emea": { + "values": { + "default": 254 + } + }, + "na": { + "values": { + "default": 255 + } + } + } + }, + "fieldtool": { + "reset_permitted": "yes" + } + } + ] + }, + "CRC32": { + "id": 15, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Writing an application id number allows the 32 bit CRC of that application to be read back.", + "version": { + "first": 529, + "last": 541 + }, + "statictype": "dynamic", + "production": { + "required": false, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": false, + "runtime_ignore": true, + "responsible": [], + "remarks": "Useful for checking the firmware that is loaded.", + "region": { + "emea": null, + "na": null + } + }, + "fieldtool": { + "reset_permitted": "no" + } + } + ] + } + }, + "status": { + "OK": { + "id": 0 + }, + "ZERO_APPS": { + "id": 1 + }, + "NO_MEMORY": { + "id": 2 + }, + "NOT_IMPLEMENTED": { + "id": 3 + }, + "BLOCK_NOT_FOUND": { + "id": 4 + }, + "NO_SUCH_VAR": { + "id": 5 + }, + "NO_CLIB": { + "id": 6 + }, + "KEY_FAILURE": { + "id": 7 + }, + "NO_SLOTS_FREE": { + "id": 8 + }, + "VECTOR_OUT_OF_RANGE": { + "id": 9 + }, + "BAD_VECTOR_RELEASE": { + "id": 10 + }, + "DRIVER_BUSY": { + "id": 11 + }, + "OUT_OF_RANGE": { + "id": 12 + }, + "CANT_CANCEL_TICK": { + "id": 13 + }, + "ID_OUT_OF_RANGE": { + "id": 14 + }, + "HANDLE_OUT_OF_RANGE": { + "id": 15 + }, + "INCAPABLE_HARDWARE": { + "id": 16 + }, + "ALREADY_OPEN": { + "id": 17 + }, + "STRING_TOO_LONG": { + "id": 18 + }, + "CORRUPT_CONFIGURATION": { + "id": 19 + }, + "TIMEOUT": { + "id": 20 + }, + "NO_PRIVILEGE": { + "id": 21 + }, + "DEVICE_DORMANT": { + "id": 22 + }, + "MEDIA_FAILURE": { + "id": 23 + }, + "BUFFER_OVERFLOW": { + "id": 24 + }, + "UPGRADE_SYNTAX_ERROR": { + "id": 25 + }, + "UPGRADE_DEPENDENCY_NOT_MET": { + "id": 26 + }, + "UPGRADE_MISSING": { + "id": 27 + }, + "UPGRADE_FRAGMENTED_BY_CLIB": { + "id": 28 + }, + "TRUNCATED": { + "id": 29 + }, + "INVALID_HEADER": { + "id": 30 + }, + "WONT_DELETE_CLIB": { + "id": 31 + }, + "BAD_REGISTER_VALUE": { + "id": 32 + }, + "NO_CHANGE_MADE": { + "id": 33 + }, + "NOT_ATOMIC": { + "id": 34 + }, + "CALENDAR_CHANGED": { + "id": 35 + }, + "WORM_FIELD": { + "id": 36 + }, + "CONVERSION_UNSUPPORTED": { + "id": 37 + }, + "CPU_PERMISSION_FAULT": { + "id": 38 + }, + "CPU_SOFTWARE_FAULT": { + "id": 39 + }, + "CPU_DECODE_FAULT": { + "id": 40 + }, + "CPU_ADDRESS_ACCESS_FAULT": { + "id": 41 + }, + "CPU_UNCAUGHT_FAULT": { + "id": 42 + }, + "ACCURACY_LOST": { + "id": 43 + }, + "EXIT_FAILURE": { + "id": 44 + }, + "CANT_CANCEL_CALLBACK": { + "id": 45 + }, + "RECOVERED_SPACE": { + "id": 46 + }, + "DRIVE_FULL": { + "id": 47 + }, + "NO_FILE_HANDLES_AVAILABLE": { + "id": 48 + }, + "EXCESSIVE_RESTARTS": { + "id": 49 + }, + "MPU_SETUP_FAILED": { + "id": 50 + }, + "DEVICE_NOT_OPEN": { + "id": 51 + }, + "NO_RESPONSE": { + "id": 52 + }, + "EXIT_WATCHDOG": { + "id": 53 + }, + "WONT_DELETE_SPECIAL": { + "id": 54 + }, + "WONT_UPGRADE_SPECIAL": { + "id": 55 + } + } + }, + "TESTMANAGER": { + "id": 98, + "version": { + "first": 0, + "last": 36 + }, + "registers": { + "OutputFile": { + "id": 0, + "details": [ + { + "type": "string", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Access the test log filename.", + "version": { + "first": 0, + "last": 36 + }, + "statictype": null + } + ] + }, + "TestNumber": { + "id": 1, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Access the test sequence number.", + "version": { + "first": 0, + "last": 36 + }, + "statictype": null + } + ] + }, + "TestStatus": { + "id": 2, + "details": [ + { + "type": "enum8", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Access the Test Manager state variable.", + "version": { + "first": 0, + "last": 36 + }, + "statictype": null + } + ] + }, + "TrapError": { + "id": 3, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Access the last recorded error code.", + "version": { + "first": 0, + "last": 36 + }, + "statictype": null + } + ] + }, + "TestParameter": { + "id": 4, + "details": [ + { + "type": "uint32_t", + "privilege": { + "lvl1": "RW", + "lvl2": "RW", + "lvl3": "RW", + "lvl4": "RW", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Access the test parameter variable.", + "version": { + "first": 0, + "last": 36 + }, + "statictype": null + } + ] + } + }, + "status": { + "FAIL": { + "id": 0 + }, + "UNKNOWN_PARAMETER": { + "id": 1 + }, + "READ_ONLY_PARAMETER": { + "id": 2 + }, + "BUSY": { + "id": 3 + }, + "STRING_TOO_LONG": { + "id": 4 + }, + "FOPEN_FAIL": { + "id": 5 + }, + "FSEEK_FAIL": { + "id": 6 + }, + "FWRITE_FAIL": { + "id": 7 + }, + "FCLOSE_FAIL": { + "id": 8 + }, + "MALFORMED_FILENAME": { + "id": 9 + }, + "UNKNOWN_ACTION": { + "id": 10 + }, + "FILEREMOVE_FAIL": { + "id": 11 + }, + "FREAD_FAIL": { + "id": 12 + } + } + } +} diff --git a/GenesisCordonelInterface/RuntimePackage/Package/log4net.dll b/GenesisCordonelInterface/RuntimePackage/Package/log4net.dll new file mode 100644 index 000000000..8646b6fcd Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/log4net.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/magflux_api.dll b/GenesisCordonelInterface/RuntimePackage/Package/magflux_api.dll new file mode 100644 index 000000000..68af23df3 Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/magflux_api.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/meterconfig.json b/GenesisCordonelInterface/RuntimePackage/Package/meterconfig.json new file mode 100644 index 000000000..955bd390b --- /dev/null +++ b/GenesisCordonelInterface/RuntimePackage/Package/meterconfig.json @@ -0,0 +1,10 @@ +{ + "UseRegisterWatchService": true, + "RegisterWatchServiceUrl": "http://sla12iis01/MeterProcessState/api/RegisterWatch/", + "UseMinMaxCheck": true, + "UseErrorLogger": false, + "ErrorLoggerServiceUrl": "http://sla12iis01/MeterProcessState/api/GenesisMeter/", + "UseCalibrationLogger": false, + "CalibrationLoggerServiceUrl": "http://sla12iis01/MeterProcessState/api/GenesisMeter/", + "AutoUpdateFiles":true +} \ No newline at end of file diff --git a/GenesisCordonelInterface/RuntimePackage/Package/nlog.config b/GenesisCordonelInterface/RuntimePackage/Package/nlog.config new file mode 100644 index 000000000..b065c5314 --- /dev/null +++ b/GenesisCordonelInterface/RuntimePackage/Package/nlog.config @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/GenesisCordonelInterface/RuntimePackage/Package/shared_code.dll b/GenesisCordonelInterface/RuntimePackage/Package/shared_code.dll new file mode 100644 index 000000000..06436ccaf Binary files /dev/null and b/GenesisCordonelInterface/RuntimePackage/Package/shared_code.dll differ diff --git a/GenesisCordonelInterface/RuntimePackage/Package/status.json b/GenesisCordonelInterface/RuntimePackage/Package/status.json new file mode 100644 index 000000000..89f645713 --- /dev/null +++ b/GenesisCordonelInterface/RuntimePackage/Package/status.json @@ -0,0 +1,250 @@ +{ + "OK": {"id": 0}, + "ERROR_ZERO_APPS": {"id": 1}, + "ERROR_NO_MEMORY": {"id": 2}, + "ERROR_NOT_IMPLEMENTED": {"id": 3}, + "ERROR_BLOCK_NOT_FOUND": {"id": 4}, + "ERROR_NO_SUCH_VAR": {"id": 5}, + "ERROR_NO_CLIB": {"id": 6}, + "ERROR_KEY_FAILURE": {"id": 7}, + "ERROR_NO_SLOTS_FREE": {"id": 8}, + "ERROR_VECTOR_OUT_OF_RANGE": {"id": 9}, + "ERROR_BAD_VECTOR_RELEASE": {"id": 10}, + "ERROR_DRIVER_BUSY": {"id": 11}, + "ERROR_OUT_OF_RANGE": {"id": 12}, + "ERROR_CANT_CANCEL_TICK": {"id": 13}, + "ERROR_ID_OUT_OF_RANGE": {"id": 14}, + "ERROR_HANDLE_OUT_OF_RANGE": {"id": 15}, + "ERROR_INCAPABLE_HARDWARE": {"id": 16}, + "ERROR_ALREADY_OPEN": {"id": 17}, + "ERROR_STRING_TOO_LONG": {"id": 18}, + "ERROR_CORRUPT_CONFIGURATION": {"id": 19}, + "ERROR_TIMEOUT": {"id": 20}, + "ERROR_NO_PRIVILEGE": {"id": 21}, + "ERROR_DEVICE_DORMANT": {"id": 22}, + "ERROR_MEDIA_FAILURE": {"id": 23}, + "ERROR_BUFFER_OVERFLOW": {"id": 24}, + "ERROR_UPGRADE_SYNTAX_ERROR": {"id": 25}, + "ERROR_UPGRADE_DEPENDENCY_NOT_MET": {"id": 26}, + "ERROR_UPGRADE_MISSING": {"id": 27}, + "ERROR_UPGRADE_FRAGMENTED_BY_CLIB": {"id": 28}, + "ERROR_TRUNCATED": {"id": 29}, + "ERROR_INVALID_HEADER": {"id": 30}, + "ERROR_WONT_DELETE_CLIB": {"id": 31}, + "ERROR_BAD_REGISTER_VALUE": {"id": 32}, + "ERROR_NO_CHANGE_MADE": {"id": 33}, + "ERROR_NOT_ATOMIC": {"id": 34}, + "ERROR_CALENDAR_CHANGED": {"id": 35}, + "ERROR_WORM_FIELD": {"id": 36}, + "ERROR_CONVERSION_UNSUPPORTED": {"id": 37}, + "ERROR_CPU_PERMISSION_FAULT": {"id": 38}, + "ERROR_CPU_SOFTWARE_FAULT": {"id": 39}, + "ERROR_CPU_DECODE_FAULT": {"id": 40}, + "ERROR_CPU_ADDRESS_ACCESS_FAULT": {"id": 41}, + "ERROR_CPU_UNCAUGHT_FAULT": {"id": 42}, + "ERROR_ACCURACY_LOST": {"id": 43}, + "ERROR_EXIT_FAILURE": {"id": 44}, + "ERROR_CANT_CANCEL_CALLBACK": {"id": 45}, + "ERROR_RECOVERED_SPACE": {"id": 46}, + "ERROR_DRIVE_FULL": {"id": 47}, + "ERROR_NO_FILE_HANDLES_AVAILABLE": {"id": 48}, + "ERROR_EXCESSIVE_RESTARTS": {"id": 49}, + "ERROR_MPU_SETUP_FAILED": {"id": 50}, + "ERROR_DEVICE_NOT_OPEN": {"id": 51}, + "ERROR_NO_RESPONSE": {"id": 52}, + "ERROR_EXIT_WATCHDOG": {"id": 53}, + "ERROR_WONT_DELETE_SPECIAL": {"id": 54}, + "ERROR_WONT_UPGRADE_SPECIAL": {"id": 55}, + "ERROR_POWERMON_TABLE_FULL": {"id": 256}, + "ERROR_POWERMON_UNKNOWN_PARAMETER": {"id": 257}, + "ERROR_POWERMON_OUT_OF_RANGE": {"id": 258}, + "ERROR_POWERMON_STOP_CYCLING": {"id": 259}, + "ERROR_POWERMON_TEMPERATURE_LIMIT": {"id": 260}, + "ERROR_POWERMON_BATTERY_STATUS_CHANGED": {"id": 261}, + "ERROR_POWERMON_BATTERY_CRITICAL": {"id": 262}, + "ERROR_CONFIGEX_LOCKED_OUT": {"id": 1024}, + "ERROR_CONFIGEX_AUTHENTICATION_FAILURE": {"id": 1025}, + "ERROR_CONFIGEX_ACCESS_DENIED": {"id": 1026}, + "ERROR_CONFIGEX_UNKNOWN_PARAMETER": {"id": 1027}, + "ERROR_CONFIGEX_IN_USE": {"id": 1028}, + "ERROR_CONFIGEX_SIZES_DONT_MATCH": {"id": 1029}, + "ERROR_CONFIGEX_CANT_READ_CONFIG_FILE": {"id": 1030}, + "ERROR_CONFIGEX_USER_NOT_KNOWN": {"id": 1031}, + "ERROR_CONFIGEX_CANT_CREATE_CONFIG_FILE": {"id": 1032}, + "ERROR_CONFIGEX_STORE_DIDNT_STORE": {"id": 1033}, + "ERROR_CONFIGEX_STORE_CORRUPT": {"id": 1034}, + "ERROR_CONFIGEX_EXPECTED_WRITE": {"id": 1035}, + "ERROR_CONFIGEX_EXPECTED_READ": {"id": 1036}, + "ERROR_CONFIGEX_STOP_CYCLING": {"id": 1037}, + "ERROR_CONFIGEX_TOO_MANY_OPEN": {"id": 1038}, + "ERROR_CONFIGEX_NEVER_OPENED": {"id": 1039}, + "ERROR_CONFIGEX_FILE_PROTECTED": {"id": 1040}, + "ERROR_CONFIGEX_PARTIAL_RECALL": {"id": 1041}, + "ERROR_CONFIGEX_DEFAULT_PASSWORD_USED": {"id": 1042}, + "ERROR_OPTICALPORT_PAYLOAD_COUNT": {"id": 1280}, + "ERROR_OPTICALPORT_INVALID_SUBREASON": {"id": 1281}, + "ERROR_OPTICALPORT_INVALID_BAUDRATE": {"id": 1282}, + "ERROR_OPTICALPORT_INVALID_BUFFERSIZE": {"id": 1283}, + "ERROR_OPTICALPORT_CRCFAILURE": {"id": 1284}, + "ERROR_OPTICALPORT_UNRECOGNISEDCMD": {"id": 1285}, + "ERROR_OPTICALPORT_FRAMING": {"id": 1286}, + "ERROR_OPTICALPORT_OVERFLOW": {"id": 1287}, + "ERROR_OPTICALPORT_PACKETTIMEOUT": {"id": 1288}, + "ERROR_OPTICALPORT_INVALIDESCAPE": {"id": 1289}, + "ERROR_OPTICALPORT_UNKNOWN_PARAMETER": {"id": 1290}, + "ERROR_OPTICALPORT_TRAINING_FAILED": {"id": 1291}, + "ERROR_OPTICALPORT_NOBREAK": {"id": 1292}, + "ERROR_LOGGER_UNKNOWN_PARAMETER": {"id": 2048}, + "ERROR_LOGGER_RESTARTED": {"id": 2049}, + "ERROR_LOGGER_BLOCK_LISTING": {"id": 2050}, + "ERROR_CUSTOMER_REBOOT,": {"id": 2304}, + "ERROR_CUSTOMER_REBOOT_STOP,": {"id": 2305}, + "ERROR_CUSTOMER_LOW_BATTERY,": {"id": 2306}, + "ERROR_CUSTOMER_LOW_BATTERY_STOP,": {"id": 2307}, + "ERROR_CUSTOMER_VERY_LOW_BATTERY,": {"id": 2308}, + "ERROR_CUSTOMER_VERY_LOW_BATTERY_STOP,": {"id": 2309}, + "ERROR_CUSTOMER_CONFIG_ERROR,": {"id": 2310}, + "ERROR_CUSTOMER_CONFIG_ERROR_STOP,": {"id": 2311}, + "ERROR_CUSTOMER_EMPTY_PIPE,": {"id": 2312}, + "ERROR_CUSTOMER_EMPTY_PIPE_STOP,": {"id": 2313}, + "ERROR_CUSTOMER_MAGNETIC_TAMPER,": {"id": 2314}, + "ERROR_CUSTOMER_MAGNETIC_TAMPER_STOP,": {"id": 2315}, + "ERROR_CUSTOMER_REVERSE_FLOW,": {"id": 2316}, + "ERROR_CUSTOMER_REVERSE_FLOW_STOP,": {"id": 2317}, + "ERROR_CUSTOMER_SUSPECT_LEAK,": {"id": 2318}, + "ERROR_CUSTOMER_SUSPECT_LEAK_STOP,": {"id": 2319}, + "ERROR_CUSTOMER_BROKEN_PIPE,": {"id": 2320}, + "ERROR_CUSTOMER_BROKEN_PIPE_STOP,": {"id": 2321}, + "ERROR_CUSTOMER_LOW_PRESSURE,": {"id": 2322}, + "ERROR_CUSTOMER_LOW_PRESSURE_STOP,": {"id": 2323}, + "ERROR_CUSTOMER_HIGH_PRESSURE,": {"id": 2324}, + "ERROR_CUSTOMER_HIGH_PRESSURE_STOP,": {"id": 2325}, + "ERROR_CUSTOMER_LOW_TEMPERATURE,": {"id": 2326}, + "ERROR_CUSTOMER_LOW_TEMPERATURE_STOP,": {"id": 2327}, + "ERROR_CUSTOMER_HIGH_TEMPERATURE,": {"id": 2328}, + "ERROR_CUSTOMER_HIGH_TEMPERATURE_STOP,": {"id": 2329}, + "ERROR_CUSTOMER_RADIO_ERROR,": {"id": 2330}, + "ERROR_CUSTOMER_RADIO_ERROR_STOP,": {"id": 2331}, + "ERROR_CUSTOMER_METROLOGY_PARAMS,": {"id": 2332}, + "ERROR_CUSTOMER_METROLOGY_PARAMS_STOP,": {"id": 2333}, + "ERROR_CUSTOMER_METROLOGY_MEASURE,": {"id": 2334}, + "ERROR_CUSTOMER_METROLOGY_MEASURE_STOP,": {"id": 2335}, + "ERROR_CUSTOMER_UNALLOCATED_6,": {"id": 2336}, + "ERROR_CUSTOMER_UNALLOCATED_6_STOP,": {"id": 2337}, + "ERROR_CUSTOMER_UNALLOCATED_7,": {"id": 2338}, + "ERROR_CUSTOMER_UNALLOCATED_7_STOP,": {"id": 2339}, + "ERROR_CUSTOMER_UNALLOCATED_8,": {"id": 2340}, + "ERROR_CUSTOMER_UNALLOCATED_8_STOP,": {"id": 2341}, + "ERROR_CUSTOMER_UNALLOCATED_9,": {"id": 2342}, + "ERROR_CUSTOMER_UNALLOCATED_9_STOP,": {"id": 2343}, + "ERROR_CUSTOMER_UNALLOCATED_10,": {"id": 2344}, + "ERROR_CUSTOMER_UNALLOCATED_10_STOP,": {"id": 2345}, + "ERROR_CUSTOMER_UNALLOCATED_11,": {"id": 2346}, + "ERROR_CUSTOMER_UNALLOCATED_11_STOP,": {"id": 2347}, + "ERROR_CUSTOMER_UNALLOCATED_12,": {"id": 2348}, + "ERROR_CUSTOMER_UNALLOCATED_12_STOP,": {"id": 2349}, + "ERROR_CUSTOMER_UNALLOCATED_13,": {"id": 2350}, + "ERROR_CUSTOMER_UNALLOCATED_13_STOP,": {"id": 2351}, + "ERROR_CUSTOMER_UNALLOCATED_14,": {"id": 2352}, + "ERROR_CUSTOMER_UNALLOCATED_14_STOP,": {"id": 2353}, + "ERROR_CUSTOMER_UNALLOCATED_15,": {"id": 2354}, + "ERROR_CUSTOMER_UNALLOCATED_15_STOP,": {"id": 2355}, + "ERROR_CUSTOMER_UNALLOCATED_16,": {"id": 2356}, + "ERROR_CUSTOMER_UNALLOCATED_16_STOP,": {"id": 2357}, + "ERROR_CUSTOMER_UNALLOCATED_17,": {"id": 2358}, + "ERROR_CUSTOMER_UNALLOCATED_17_STOP,": {"id": 2359}, + "ERROR_CUSTOMER_UNALLOCATED_18,": {"id": 2360}, + "ERROR_CUSTOMER_UNALLOCATED_18_STOP,": {"id": 2361}, + "ERROR_CUSTOMER_UNALLOCATED_19,": {"id": 2362}, + "ERROR_CUSTOMER_UNALLOCATED_19_STOP,": {"id": 2363}, + "ERROR_CUSTOMER_UNALLOCATED_20,": {"id": 2364}, + "ERROR_CUSTOMER_UNALLOCATED_20_STOP,": {"id": 2365}, + "ERROR_CUSTOMER_UNALLOCATED_21,": {"id": 2366}, + "ERROR_CUSTOMER_UNALLOCATED_21_STOP,": {"id": 2367}, + "ERROR_CUSTOMER_UNKNOWN_PARAMETER,": {"id": 2368}, + "ERROR_CUSTOMER_LOCALE_UNDEFINED,": {"id": 2369}, + "ERROR_CUSTOMER_NO_SUCH_ALARM,": {"id": 2370}, + "ERROR_CUSTOMER_OUT_OF_RANGE,": {"id": 2371}, + "ERROR_CUSTOMER_NOT_IMPLEMENTED,": {"id": 2372}, + "ERROR_CUSTOMER_BAD_CONFIG,": {"id": 2373}, + "ERROR_CUSTOMER_DID_NOT_STORE,": {"id": 2374}, + "ERROR_CUSTOMER_STORE_PENDING,": {"id": 2375}, + "ERROR_GENESISFLOW_BAD_TEST": {"id": 3840}, + "ERROR_GENESISFLOW_BAD_CONFIG": {"id": 3841}, + "ERROR_GENESISFLOW_DID_NOT_STORE": {"id": 3842}, + "ERROR_GENESISFLOW_STORE_PENDING": {"id": 3843}, + "ERROR_GENESISFLOW_STORE_BUFFER_SIZE": {"id": 3844}, + "ERROR_GENESISFLOW_STRING_TOO_LONG": {"id": 3845}, + "ERROR_GENESISFLOW_BAD_DISPLAY_MODE": {"id": 3846}, + "ERROR_GENESISFLOW_GLASS_TOO_LONG": {"id": 3847}, + "ERROR_GENESISFLOW_SLOT_NOT_YOURS": {"id": 3848}, + "ERROR_GENESISFLOW_SUBLIST_TOO_LONG": {"id": 3849}, + "ERROR_GENESISFLOW_NO_TEMP_SENSOR": {"id": 3850}, + "ERROR_GENESISFLOW_UNDER_TEMP": {"id": 3851}, + "ERROR_GENESISFLOW_LOW_TEMP_WARNING": {"id": 3852}, + "ERROR_GENESISFLOW_HIGH_TEMP_WARNING": {"id": 3853}, + "ERROR_GENESISFLOW_OVER_TEMP": {"id": 3854}, + "ERROR_GENESISFLOW_MISMATCHING_LSB": {"id": 3855}, + "ERROR_GENESISFLOW_OUT_OF_RANGE_PWDIFF": {"id": 3856}, + "ERROR_GENESISFLOW_OUT_OF_RANGE_AMPLITUDE": {"id": 3857}, + "ERROR_GENESISFLOW_OUT_OF_RANGE_TOF": {"id": 3858}, + "ERROR_GENESISFLOW_OUT_OF_RANGE_DTOF": {"id": 3859}, + "ERROR_GENESISFLOW_TOF_TIMEOUT": {"id": 3860}, + "ERROR_GENESISFLOW_CAL_CHANGE": {"id": 3861}, + "ERROR_GENESISFLOW_OUT_OF_RANGE_INTERVAL": {"id": 3862}, + "ERROR_GENESISFLOW_VALIDATE_FAIL": {"id": 3863}, + "ERROR_GENESISFLOW_OUT_OF_RANGE_TEMP": {"id": 3864}, + "ERROR_GENESISFLOW_NOT_READY": {"id": 3865}, + "ERROR_GENESISFLOW_METROLOGY_ERROR": {"id": 3866}, + "ERROR_GENESISFLOW_GP30_ID_ERROR": {"id": 3867}, + "ERROR_GENESISFLOW_GP30_FLAG_ERROR": {"id": 3868}, + "ERROR_GENESISFLOW_GP30_TIMEOUT_ERROR": {"id": 3869}, + "ERROR_GENESISFLOW_GP30_REQUEST_ERROR": {"id": 3870}, + "ERROR_GENESISFLOW_GP30_SEQ_ERROR": {"id": 3871}, + "ERROR_GENESISFLOW_VALUE_SEALED": {"id": 3872}, + "ERROR_GENESISFLOW_IN_TEST_MODE": {"id": 3873}, + "ERROR_GENESISFLOW_UNKNOWN_STATE": {"id": 3874}, + "ERROR_GENESISFLOW_DISPLAY_INIT_SUCCEEDED": {"id": 3875}, + "ERROR_GENESISFLOW_DISPLAY_INIT_FAILED": {"id": 3876}, + "ERROR_GENESISFLOW_GP30_INIT_FAILED": {"id": 3877}, + "ERROR_GENESISFLOW_START_TIMER_SUCCEEDED": {"id": 3878}, + "ERROR_GENESISFLOW_START_TIMER_FAILED": {"id": 3879}, + "ERROR_GENESISFLOW_VOLUME_STORE_FAILED": {"id": 3880}, + "ERROR_GENESISFLOW_EMPTY_PIPE": {"id": 3881}, + "ERROR_GENESISFLOW_PARAMETER_ERROR": {"id": 3882}, + "ERROR_GENESISFLOW_GP30_INTERNAL_ERROR": {"id": 3883}, + "ERROR_GENESISFLOW_GLASS_TOO_SHORT": {"id": 3884}, + "ERROR_GENESISFLOW_STORE_CAL_FAILED": {"id": 3885}, + "ERROR_GENESISFLOW_STORE_CONF_FAILED": {"id": 3886}, + "ERROR_GENESISFLOW_MODE_CHANGE": {"id": 3887}, + "ERROR_GENESISFLOW_BAD_POW10": {"id": 3888}, + "ERROR_GENESISFLOW_BAD_DECIMAL_SEPARATOR": {"id": 3889}, + "ERROR_GENESISFLOW_BAD_UNITS": {"id": 3890}, + "ERROR_GENESISFLOW_BAD_ICONS": {"id": 3891}, + "ERROR_GENESISFLOW_BAD_THOUSAND_SEPARATOR": {"id": 3892}, + "ERROR_GENESISFLOW_NEW_LOCALE_REJECTED": {"id": 3893}, + "ERROR_GENESISFLOW_SET_ACCUMULATORS": {"id": 3894}, + "ERROR_GENESISFLOW_SEAL_OPENED": {"id": 3895}, + "ERROR_GENESISFLOW_CALIBRATION_RECALL_INCOMPLETE": {"id": 3896}, + "ERROR_METROLOGYASST_BAD_CONFIG": {"id": 4608}, + "ERROR_METROLOGYASST_DID_NOT_STORE": {"id": 4609}, + "ERROR_METROLOGYASST_PENDING_STORE": {"id": 4610}, + "ERROR_IRDA_BAD_CONFIG": {"id": 5120}, + "ERROR_IRDA_BAD_LENGTH": {"id": 5121}, + "ERROR_NA2WALARMS_SENSOR_INVALID": {"id": 5888}, + "ERROR_NA2WALARMS_UNKNOWN_PARAMETER": {"id": 5889}, + "ERROR_NA2WALARMS_ALARM_INVALID": {"id": 5890}, + "ERROR_NA2WALARMS_UNIMPLEMENTED": {"id": 5891}, + "ERROR_NA2WALARMS_UNCONFIGURED": {"id": 5892}, + "ERROR_NA2WALARMS_CONFIG_INVALID": {"id": 5893}, + "ERROR_NA2WALARMS_NO_LATEST": {"id": 5894}, + "ERROR_NA2WALARMS_FIXED_TYPE": {"id": 5895}, + "ERROR_NA2WALARMS_PREDEF_SET": {"id": 5896}, + "ERROR_NA2WALARMS_USERDEF_VOLUME_SET": {"id": 5897}, + "ERROR_NA2WALARMS_USERDEF_TEMPERATURE_SET": {"id": 5898}, + "ERROR_NA2WALARMS_USERDEF_PRESSURE_SET": {"id": 5899}, + "ERROR_NA2WALARMS_PREDEF_CLEAR": {"id": 5900}, + "ERROR_NA2WALARMS_USERDEF_VOLUME_CLEAR": {"id": 5901}, + "ERROR_NA2WALARMS_USERDEF_TEMPERATURE_CLEAR": {"id": 5902}, + "ERROR_NA2WALARMS_USERDEF_PRESSURE_CLEAR": {"id": 5903} +} \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/Debug/MeterBatchConfigPanel.cs b/GenesisCordonelInterface/UI/Debug/MeterBatchConfigPanel.cs index a877d4f41..a2b52d06e 100644 --- a/GenesisCordonelInterface/UI/Debug/MeterBatchConfigPanel.cs +++ b/GenesisCordonelInterface/UI/Debug/MeterBatchConfigPanel.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using GenesisCordonelInterface.API; +using static GenesisCordonelInterface.API.PublicModels; namespace GenesisCordonelInterface.UI.Debug { @@ -103,7 +104,7 @@ namespace GenesisCordonelInterface.UI.Debug // ---------------------------------------------------- private void Api_MeterBatchStatusChanged( - List data) + List data) { if (IsDisposed) return; @@ -117,7 +118,7 @@ namespace GenesisCordonelInterface.UI.Debug UpdateGrid(data); } - private void UpdateGrid(List data) + private void UpdateGrid(List data) { isRefreshing = true; @@ -377,16 +378,16 @@ namespace GenesisCordonelInterface.UI.Debug row.Cells["StreamingPort"].Value = ""; } - public List GetGridData() + public List GetGridData() { - var list = new List(); + var list = new List(); foreach (DataGridViewRow row in grid.Rows) { if (row.Cells["Slot"].Value == null) continue; - list.Add(new InterfaceGCIToLaatzen.MeterBatchDebugStatus + list.Add(new MeterBatchDebugStatus { Slot = Convert.ToInt32(row.Cells["Slot"].Value), Selected = Convert.ToBoolean(row.Cells["Selected"].Value), diff --git a/GenesisCordonelInterface/UI/Debug/WorkerDebugPanel.cs b/GenesisCordonelInterface/UI/Debug/WorkerDebugPanel.cs index 3d313050d..0d65ab4f5 100644 --- a/GenesisCordonelInterface/UI/Debug/WorkerDebugPanel.cs +++ b/GenesisCordonelInterface/UI/Debug/WorkerDebugPanel.cs @@ -1,6 +1,7 @@ using System; using System.Windows.Forms; using GenesisCordonelInterface.API; +using static GenesisCordonelInterface.API.PublicModels; namespace GenesisCordonelInterface.UI.Debug { diff --git a/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmRegisterStore.cs b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmRegisterStore.cs index c66250f39..05bb67fd9 100644 --- a/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmRegisterStore.cs +++ b/GenesisCordonelInterface/UI/LaatzenAPI_GenesisToolBox/FrmRegisterStore.cs @@ -1175,7 +1175,7 @@ namespace GenesisCordonelInterface.UI.LaatzenAPI_GenesisToolBox _dataTable.Rows.Clear(); DisableAllButtons(); - GciPublicModels.GciGetPcbIdResult result = + PublicModels.GciGetPcbIdResult result = await interfaceToLaatzen.GetPcbIdAsync(slotNr); if (!result.Success) diff --git a/GenesisCordonelInterface/UI/MainView.cs b/GenesisCordonelInterface/UI/MainView.cs index d2997c3a0..dc4f735f1 100644 --- a/GenesisCordonelInterface/UI/MainView.cs +++ b/GenesisCordonelInterface/UI/MainView.cs @@ -212,11 +212,17 @@ namespace GenesisCordonelInterface.UI Logger.Trace("Log cleared."); } - private void UiLogBus_MessageReceived(string msg) + private void UiLogBus_MessageReceived(string loggerName, string msg) { + if (loggerName != "GenesisCordonelInterface") + return; + + if (IsDisposed || !IsHandleCreated) + return; + if (InvokeRequired) { - BeginInvoke(new Action(UiLogBus_MessageReceived), msg); + BeginInvoke(new Action(UiLogBus_MessageReceived), loggerName, msg); return; } diff --git a/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/FrmGCIAPI.cs b/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/FrmGCIAPI.cs index d56f7d441..ce1fb413e 100644 --- a/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/FrmGCIAPI.cs +++ b/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/FrmGCIAPI.cs @@ -165,10 +165,10 @@ namespace GenesisCordonelInterface.UI.StaraTuraAPI_GenesisCordonelInterface /// Name of the port (e.g. COM3). /// Baud rate entered in the UI. /// - /// Instance of or null if port name is empty. + /// Instance of or null if port name is empty. /// /// Thrown when baud rate is invalid. - private GciPublicModels.GciPortConfig CreateGciPortConfig(string portName, string baudRateText) + private PublicModels.GciPortConfig CreateGciPortConfig(string portName, string baudRateText) { if (string.IsNullOrWhiteSpace(portName)) return null; @@ -176,7 +176,7 @@ namespace GenesisCordonelInterface.UI.StaraTuraAPI_GenesisCordonelInterface if (!int.TryParse(baudRateText, out int baudRate)) throw new Exception($"Invalid baud rate for port {portName}."); - return new GciPublicModels.GciPortConfig + return new PublicModels.GciPortConfig { PortName = portName, Type = "Serial", @@ -186,27 +186,27 @@ namespace GenesisCordonelInterface.UI.StaraTuraAPI_GenesisCordonelInterface /// /// Gets selected configuration source from UI and maps it to public GCI model. /// - /// Selected . + /// Selected . /// Thrown when no value is selected. - private GciPublicModels.GciConfigSource GetConfigSource() + private PublicModels.GciConfigSource GetConfigSource() { if (cmbConfigSource.SelectedItem == null) throw new Exception("Config source is not selected."); - return (GciPublicModels.GciConfigSource)cmbConfigSource.SelectedItem; + return (PublicModels.GciConfigSource)cmbConfigSource.SelectedItem; } /// /// Gets selected password source from UI and maps it to public GCI model. /// - /// Selected . + /// Selected . /// Thrown when no value is selected. - private GciPublicModels.GciPasswordSource GetPasswordSource() + private PublicModels.GciPasswordSource GetPasswordSource() { if (cmbPasswordSource.SelectedItem == null) throw new Exception("Password source is not selected."); - return (GciPublicModels.GciPasswordSource)cmbPasswordSource.SelectedItem; + return (PublicModels.GciPasswordSource)cmbPasswordSource.SelectedItem; } #endregion @@ -229,7 +229,7 @@ namespace GenesisCordonelInterface.UI.StaraTuraAPI_GenesisCordonelInterface await ExecuteApiActionAsync(async () => { - var request = new GciPublicModels.GciInitSlotRequest + var request = new PublicModels.GciInitSlotRequest { SlotId = slot, ConfigSource = GetConfigSource(), @@ -308,7 +308,7 @@ namespace GenesisCordonelInterface.UI.StaraTuraAPI_GenesisCordonelInterface await ExecuteApiActionAsync(async () => { - GciPublicModels.GciGetPcbIdResult result = + PublicModels.GciGetPcbIdResult result = await _api.GetPcbIdAsync(slot); if (!result.Success) @@ -428,9 +428,9 @@ namespace GenesisCordonelInterface.UI.StaraTuraAPI_GenesisCordonelInterface await ExecuteApiActionAsync(async () => { - bool ok = await _api.SetMeterPasswordAsync(slot, password); + PublicModels.GciSetPasswordResult result = await _api.SetMeterPasswordAsync(slot, password); - if (!ok) + if (!result.Success) throw new Exception("Set password failed."); MessageBox.Show("Password set successfully."); diff --git a/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/MetersActionView.cs b/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/MetersActionView.cs index a3ff9046b..b1d408b70 100644 --- a/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/MetersActionView.cs +++ b/GenesisCordonelInterface/UI/StaraTuraAPI_GenesisCordonelInterface/MetersActionView.cs @@ -152,9 +152,9 @@ namespace GenesisCordonelInterface.UI.StaraTuraAPI_GenesisCordonelInterface foreach (int slot in _api.GetSelectedSlots()) { - bool ok = await _api.SetMeterPasswordAsync(slot, password); + PublicModels.GciSetPasswordResult result = await _api.SetMeterPasswordAsync(slot, password); - if (!ok) + if (!result.Success) throw new Exception($"Slot {slot}: Set password failed."); } diff --git a/TBF/Rig/BridgeComponents/GciBridge/GciBridge.cs b/TBF/Rig/BridgeComponents/GciBridge/GciBridge.cs index 7aed00bb4..934c5d6d7 100644 --- a/TBF/Rig/BridgeComponents/GciBridge/GciBridge.cs +++ b/TBF/Rig/BridgeComponents/GciBridge/GciBridge.cs @@ -8,10 +8,17 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using TBF.Rig.BridgeComponents.GciBridge.Interfaces; +using TBF.Rig.BridgeComponents.GciBridge.UI; using TBF.Rig.Generic; +using TBF.Rig.Input.DataStorage.UniDataStorageReader; +using TBF.Rig.Input.DataStorage.UniDataStorageReader.Searching.Database; +using static TBF.Rig.BridgeComponents.GciBridge.Interfaces.PublicModels; using GciGUIType = GenesisCordonelInterface.UI.MainView; +using GciPublicModels = GenesisCordonelInterface.API.PublicModels; using GciType = GenesisCordonelInterface.API.InterfaceOutsideToGCI; using UdsReaderType = TBF.Rig.Input.DataStorage.UniDataStorageReader.Reader; +using UDSRPublicModels = TBF.Rig.Input.DataStorage.UniDataStorageReader.Interfaces.PublicModels; using UdsWriterType = TBF.Rig.Output.DataStorage.UniDataStorageWriter.Writer; namespace TBF.Rig.BridgeComponents.GciBridge @@ -34,10 +41,15 @@ namespace TBF.Rig.BridgeComponents.GciBridge readonly UdsReaderType reader; readonly UdsWriterType writer; + //diag GUI for GCI GciGUIType gciGUI; Form gciGuiHostForm; - GciType gciExternalInterface; + //diag GUI for GciBridge + public UserControl gciBridgeGUI; + public MainForm gciBridgeGuiForm; + + public GciType gciExternalInterface; public bool HasReader { get { return reader != null; } } public bool HasWriter { get { return writer != null; } } @@ -73,6 +85,8 @@ namespace TBF.Rig.BridgeComponents.GciBridge writer = TbfComponents.FindComponent(gciBridgeCfg.WriterName, components) as UdsWriterType; if (writer == null) throw new Exception("Cannot find writer component '" + gciBridgeCfg.WriterName + "'"); } + + Initialize(); } public override void Initialize() @@ -84,18 +98,50 @@ namespace TBF.Rig.BridgeComponents.GciBridge if (gciBridgeCfg.EnableGuiAccess) { - TryInitializeGui(); + TryInitializeGciGui(); if (gciBridgeCfg.ShowGuiOnInitialize) { - ShowGui(); + ShowGciGui(); } } log.FatalFormat("{0} initialized: {1}", Name, this); } - void TryInitializeGui() + void TryInitializeGciBridgeGui() + { + try + { + if (gciBridgeGuiForm != null && !gciBridgeGuiForm.IsDisposed) + return; + + gciBridgeGuiForm = new MainForm(this); + gciBridgeGuiForm.Text = "Gci Bridge GUI"; + gciBridgeGuiForm.Width = 1300; + gciBridgeGuiForm.Height = 600; + gciBridgeGuiForm.StartPosition = FormStartPosition.CenterScreen; + + /*gciBridgeGUI = new MainView(this, gciBridgeGuiForm); + gciBridgeGUI.Dock = DockStyle.Fill; + + gciBridgeGuiForm.Controls.Add(gciBridgeGUI); + + gciBridgeGuiForm.FormClosed += (s, e) => + { + gciBridgeGUI = null; + gciBridgeGuiForm = null; + };*/ + + log.InfoFormat("{0}: GciBridge GUI view initialized.", Name); + } + catch (Exception ex) + { + log.Error("Failed to initialize GciBridge GUI view.", ex); + } + } + + void TryInitializeGciGui() { try { @@ -138,13 +184,13 @@ namespace TBF.Rig.BridgeComponents.GciBridge } } - public void ShowGui() + public void ShowGciGui() { if (!gciBridgeCfg.EnableGuiAccess) return; if (gciGuiHostForm == null || gciGuiHostForm.IsDisposed) { - TryInitializeGui(); + TryInitializeGciGui(); } if (gciGuiHostForm == null) return; @@ -152,17 +198,45 @@ namespace TBF.Rig.BridgeComponents.GciBridge gciGuiHostForm.Show(); gciGuiHostForm.BringToFront(); - log.InfoFormat("{0}: ShowGui invoked.", Name); + log.InfoFormat("{0}: ShowGciGui invoked.", Name); } - public void HideGui() + public void HideGciGui() { if (!gciBridgeCfg.EnableGuiAccess) return; if (gciGuiHostForm == null || gciGuiHostForm.IsDisposed) return; gciGuiHostForm.Hide(); - log.InfoFormat("{0}: HideGui invoked.", Name); + log.InfoFormat("{0}: HideGciGui invoked.", Name); + } + + public void ShowGui() + { + if (!gciBridgeCfg.EnableGuiAccess) return; + + if (gciBridgeGuiForm == null || gciBridgeGuiForm.IsDisposed) + { + TryInitializeGciBridgeGui(); + } + + if (gciBridgeGuiForm == null || gciBridgeGuiForm.IsDisposed) + return; + + gciBridgeGuiForm.Show(); + gciBridgeGuiForm.BringToFront(); + + log.InfoFormat("{0}: ShowGui invoked.", Name); + } + + public void HideGui() + { + if (!gciBridgeCfg.EnableGuiAccess) return; + if (gciBridgeGuiForm == null || gciBridgeGuiForm.IsDisposed) return; + + gciBridgeGuiForm.Hide(); + + log.InfoFormat("{0}: HideGciGui invoked.", Name); } void EnsureExternalInterface() @@ -186,6 +260,18 @@ namespace TBF.Rig.BridgeComponents.GciBridge // API: #region ======================================= GCI Public Interface ======================================= + /*/// + /// Initializes one GCI slot through the external GCI interface. + /// + /// Trace: + /// GciBridge.InitSlotAsync() + /// -> InterfaceOutsideToGCI.InitSlotAsync() + /// -> InterfaceGCIToLaatzen.InitOneMeterFromExternAsync() + /// -> per-slot GCI worker + /// -> GenesisMeter.SetupFromExternConfig() + /// + /// Public GCI slot initialization request. + /// Initialization result for the requested slot. public async Task InitSlotAsync(GciPublicModels.GciInitSlotRequest request) { EnsureExternalInterface(); @@ -201,9 +287,81 @@ namespace TBF.Rig.BridgeComponents.GciBridge log.InfoFormat("{0}: InitSlotAsync invoked. {1}, Result={2}", Name, request, result); + return result; + }*/ + + /// + /// Initializes one GCI slot through the external GCI interface. + /// + /// Trace: + /// GciBridge.InitSlotAsync() + /// -> InterfaceOutsideToGCI.InitSlotAsync() + /// -> InterfaceGCIToLaatzen.InitSlotAsync() + /// -> per-slot GCI worker + /// -> GenesisMeter.SetupFromExternConfig() + /// + /// Public GCI slot initialization request. + /// Initialization result for the requested slot. + public async Task InitSlotAsync( + GciPublicModels.GciInitSlotRequest request) + { + EnsureExternalInterface(); + + if (request == null) + throw new ArgumentNullException(nameof(request)); + + if (request.SlotId <= 0) + throw new ArgumentException("Invalid slot id."); + + var result = await gciExternalInterface.InitSlotAsync(request); + + log.InfoFormat("{0}: InitSlotAsync invoked. {1}, Result={2}", Name, request, result); + return result; } + /// + /// Updates an already initialized GCI slot. + /// + /// Trace: + /// GciBridge.UpdateSlotAsync() + /// -> InterfaceOutsideToGCI.UpdateSlotAsync() + /// -> InterfaceGCIToLaatzen.UpdateSlotAsync() + /// -> per-slot GCI worker + /// -> GenesisMeter.SetupFromExternConfig() + /// + /// Public GCI slot update request. + /// Update result for the requested slot. + public async Task UpdateSlotAsync( + GciPublicModels.GciInitSlotRequest request) + { + EnsureExternalInterface(); + + if (request == null) + throw new ArgumentNullException(nameof(request)); + + if (request.SlotId <= 0) + throw new ArgumentException("Invalid slot id."); + + var result = await gciExternalInterface.UpdateSlotAsync(request); + + log.InfoFormat("{0}: UpdateSlotAsync invoked. {1}, Result={2}", Name, request, result); + + return result; + } + + /// + /// Reads current information about one initialized GCI slot. + /// + /// Trace: + /// GciBridge.GetSlotAsync() + /// -> InterfaceOutsideToGCI.GetSlotAsync() + /// -> InterfaceGCIToLaatzen.GetOneMeterInfo() + /// -> per-slot GCI worker + /// -> MeterBatch / GenesisMeter snapshot + /// + /// Slot number. + /// Current public slot information. public async Task GetSlotAsync(int slotId) { EnsureExternalInterface(); @@ -219,6 +377,18 @@ namespace TBF.Rig.BridgeComponents.GciBridge return result; } + /// + /// Clears all initialized GCI slots and related GCI worker state. + /// + /// Trace: + /// GciBridge.CleanSlotsAsync() + /// -> InterfaceOutsideToGCI.CleanSlotsAsync() + /// -> InterfaceGCIToLaatzen.CleanSlotsAsync() + /// -> MeterBatch cleanup + /// -> selected slot cleanup + /// -> worker cleanup + /// + /// Cleanup operation result. public async Task CleanSlotsAsync() { EnsureExternalInterface(); @@ -231,6 +401,19 @@ namespace TBF.Rig.BridgeComponents.GciBridge return result; } + /// + /// Reads PCB ID from the meter assigned to the requested slot. + /// + /// Trace: + /// GciBridge.GetPcbIdAsync() + /// -> InterfaceOutsideToGCI.GetPcbIdAsync() + /// -> InterfaceGCIToLaatzen.GetPcbIdAsync() + /// -> per-slot GCI worker + /// -> GenesisMeter.GetPcbId() + /// + /// Slot number. + /// Cancellation token. + /// PCB ID read result. public async Task GetPcbIdAsync( int slotId, CancellationToken token = default) @@ -247,6 +430,20 @@ namespace TBF.Rig.BridgeComponents.GciBridge return result; } + /// + /// Connects/logs in to the meter assigned to the requested slot. + /// + /// Trace: + /// GciBridge.ConnectAsync() + /// -> InterfaceOutsideToGCI.ConnectOneSlotAsync() + /// -> InterfaceGCIToLaatzen.ConnectOneMeterAsync() + /// -> per-slot GCI worker + /// -> MeterBatch.MetersLogin() + /// -> GenesisMeter register snapshot + /// + /// Slot number. + /// Cancellation token. + /// Connection result including firmware/interface information. public async Task ConnectAsync( int slotId, CancellationToken token = default) @@ -263,6 +460,28 @@ namespace TBF.Rig.BridgeComponents.GciBridge return result; } + public Task LoginAsync( + int slot, + CancellationToken token = default) + { + return gciExternalInterface.LoginOneSlotAsync(slot, token); + } + + /// + /// Disconnects/logs out from the meter assigned to the requested slot. + /// + /// Trace: + /// GciBridge.DisconnectAsync() + /// -> InterfaceOutsideToGCI.DisconnectAsync() + /// -> InterfaceGCIToLaatzen.DisconnectAsync() + /// -> per-slot GCI worker + /// -> GenesisMeter.Logout() + /// -> GenesisMeter.DisposeMeter() + /// -> worker disposal + /// + /// Slot number. + /// Cancellation token. + /// Disconnect operation result. public async Task DisconnectAsync( int slotId, CancellationToken token = default) @@ -279,6 +498,187 @@ namespace TBF.Rig.BridgeComponents.GciBridge return result; } + /// + /// Sets password to meter in given slot. + /// + /// Trace: + /// GciBridge.SetPasswordAsync() + /// -> InterfaceOutsideToGCI.SetPasswordAsync() + /// -> InterfaceGCIToLaatzen.SetMeterPasswordAsync() + /// -> per-slot GCI worker + /// -> GenesisMeter.Password = password + /// + public async Task SetPasswordAsync( + int slotId, + string password, + CancellationToken token = default) + { + EnsureExternalInterface(); + + if (slotId <= 0) + throw new ArgumentException("Invalid slot id."); + + if (string.IsNullOrWhiteSpace(password)) + throw new ArgumentException("Password is empty."); + + GciPublicModels.GciSetPasswordResult result = + await gciExternalInterface.SetPasswordAsync(slotId, password, token); + + log.InfoFormat("{0}: SetPasswordAsync({1}) invoked. Result={2}", Name, slotId, result); + + return result; + } + + public async Task ReadRegisterAsync( + int slotId, + string registerName, + CancellationToken token = default) + { + EnsureExternalInterface(); + + if (slotId <= 0) + throw new ArgumentException("Invalid slot id."); + + if (string.IsNullOrWhiteSpace(registerName)) + throw new ArgumentException("Register name is empty."); + + var result = await gciExternalInterface.ReadRegisterAsync(slotId, registerName, token); + + log.InfoFormat("{0}: ReadRegisterAsync({1}, {2}) invoked. Result={3}", + Name, slotId, registerName, result); + + return result; + } + + public async Task WriteRegisterAsync( + int slotId, + string registerName, + object value, + bool storeToDevice = false, + bool refreshSystemState = false, + CancellationToken token = default) + { + EnsureExternalInterface(); + + if (slotId <= 0) + throw new ArgumentException("Invalid slot id."); + + if (string.IsNullOrWhiteSpace(registerName)) + throw new ArgumentException("Register name is empty."); + + var result = await gciExternalInterface.WriteRegisterAsync( + slotId, + registerName, + value, + storeToDevice, + refreshSystemState, + token); + + log.InfoFormat("{0}: WriteRegisterAsync({1}, {2}, {3}) invoked. Result={4}", + Name, slotId, registerName, value, result); + + return result; + } + #endregion + + #region ======================================= UDSR Public Interface ======================================= + + /// + /// Reads password data from UniDataStorageReader by PCB ID. + /// + /// Trace: + /// GciBridge.GetPasswordAsync() + /// -> UniDataStorageReader.Reader.GetDataFromStorageByParameterAsync() + /// -> Reader queue/lock + /// -> Reader.GetDataFromStorageByParameter() + /// -> selected storage reader by configuration + /// -> DatabaseReader.GetData() / RestApiReader.GetData() / JsonReader.GetData() / CsvReader.GetData() + /// + /// PCB ID used as query parameter. + /// Cancellation token. + /// Password lookup result. + public async Task GetPasswordAsync( + string pcbId, + CancellationToken token = default) + { + EnsureReader(); + + if (string.IsNullOrWhiteSpace(pcbId)) + throw new ArgumentException("PCB ID is empty.", nameof(pcbId)); + + try + { + UDSRPublicModels.DataQuery query = CreatePasswordQuery(pcbId); + + object data = await reader.GetDataFromStorageByParameterAsync(query, token); + + string password = ExtractPassword(data); + + return new UdsPasswordResult + { + Success = !string.IsNullOrWhiteSpace(password), + PcbId = pcbId, + Password = password, + Message = !string.IsNullOrWhiteSpace(password) + ? "Password found." + : "Password was not found." + }; + } + catch (Exception ex) + { + log.Error("GetPasswordAsync failed.", ex); + + return new UdsPasswordResult + { + Success = false, + PcbId = pcbId, + Password = null, + Message = ex.Message + }; + } + } + #endregion + + #region ======================================= Helpers ======================================= + private UDSRPublicModels.DataQuery CreatePasswordQuery(string pcbId) + { + var query = new UDSRPublicModels.DataQuery(); + query.QueryParams.Add(pcbId); + return query; + } + + private string ExtractPassword(object data) + { + if (data == null) + return null; + + if (data is string str) + return str; + + if (data is DatabaseSearchResult result) + { + if (!result.Found) + return null; + + if (result.Values != null && + result.Values.TryGetValue("Password", out var value)) + { + return value?.ToString(); + } + + return null; + } + + // fallback + return data.ToString(); + } + #endregion + + public List GetAllRegisterNames() + { + EnsureExternalInterface(); + return gciExternalInterface.GetAllRegisterNames(); + } } } \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.Designer.cs b/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.Designer.cs index 86e63ade4..2caa875f2 100644 --- a/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.Designer.cs +++ b/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.Designer.cs @@ -42,7 +42,8 @@ this.externalTypeNameTextBox = new System.Windows.Forms.TextBox(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.connectExternalButton = new System.Windows.Forms.Button(); - this.showGuiButton = new System.Windows.Forms.Button(); + this.showGciGuiButton = new System.Windows.Forms.Button(); + this.showGciBridgeGUIButton = new System.Windows.Forms.Button(); this.groupBox1.SuspendLayout(); this.SuspendLayout(); // @@ -160,8 +161,9 @@ // // groupBox1 // + this.groupBox1.Controls.Add(this.showGciBridgeGUIButton); this.groupBox1.Controls.Add(this.connectExternalButton); - this.groupBox1.Controls.Add(this.showGuiButton); + this.groupBox1.Controls.Add(this.showGciGuiButton); this.groupBox1.Location = new System.Drawing.Point(31, 241); this.groupBox1.Name = "groupBox1"; this.groupBox1.Size = new System.Drawing.Size(573, 60); @@ -179,15 +181,25 @@ this.connectExternalButton.UseVisualStyleBackColor = true; this.connectExternalButton.Click += new System.EventHandler(this.connectExternalButton_Click); // - // showGuiButton + // showGciGuiButton // - 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; - this.showGuiButton.Text = "Show GUI"; - this.showGuiButton.UseVisualStyleBackColor = true; - this.showGuiButton.Click += new System.EventHandler(this.showGuiButton_Click); + this.showGciGuiButton.Location = new System.Drawing.Point(308, 19); + this.showGciGuiButton.Name = "showGciGuiButton"; + this.showGciGuiButton.Size = new System.Drawing.Size(107, 28); + this.showGciGuiButton.TabIndex = 1; + this.showGciGuiButton.Text = "Show GCI GUI"; + this.showGciGuiButton.UseVisualStyleBackColor = true; + this.showGciGuiButton.Click += new System.EventHandler(this.showGuiButton_Click); + // + // showGciBridgeGUIButton + // + this.showGciBridgeGUIButton.Location = new System.Drawing.Point(421, 19); + this.showGciBridgeGUIButton.Name = "showGciBridgeGUIButton"; + this.showGciBridgeGUIButton.Size = new System.Drawing.Size(134, 28); + this.showGciBridgeGUIButton.TabIndex = 2; + this.showGciBridgeGUIButton.Text = "Show GciBridge GUI"; + this.showGciBridgeGUIButton.UseVisualStyleBackColor = true; + this.showGciBridgeGUIButton.Click += new System.EventHandler(this.showGciBridgeGUIButton_Click); // // GciBridgeCfgCtrl // @@ -231,6 +243,7 @@ private System.Windows.Forms.TextBox externalTypeNameTextBox; private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.Button connectExternalButton; - private System.Windows.Forms.Button showGuiButton; + private System.Windows.Forms.Button showGciGuiButton; + private System.Windows.Forms.Button showGciBridgeGUIButton; } } \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.cs b/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.cs index ab7787721..93e15540d 100644 --- a/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.cs +++ b/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.cs @@ -202,6 +202,26 @@ namespace TBF.Rig.BridgeComponents.GciBridge return; } + bridge.ShowGciGui(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "GCI Bridge error"); + } + } + + private void showGciBridgeGUIButton_Click(object sender, EventArgs e) + { + try + { + GciBridge bridge = TbfComponents.FindComponent(config.Name) as GciBridge; + + if (bridge == null) + { + MessageBox.Show("GciBridge component was not found.", "GCI Bridge"); + return; + } + bridge.ShowGui(); } catch (Exception ex) diff --git a/TBF/Rig/BridgeComponents/GciBridge/Interfaces/PublicModels.cs b/TBF/Rig/BridgeComponents/GciBridge/Interfaces/PublicModels.cs new file mode 100644 index 000000000..744bf9430 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/Interfaces/PublicModels.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; + +namespace TBF.Rig.BridgeComponents.GciBridge.Interfaces +{ + /// + /// Public data contract layer for the GciBridge. + /// + /// This class defines all Data Transfer Objects (DTOs) that are exposed + /// to external consumers (e.g. TBF, UI, or other integration layers). + /// + /// Responsibilities: + /// - Provide stable, dependency-free models for external usage + /// - Decouple internal GCI implementation (GenesisMeter, Xylem libraries) + /// from external systems + /// - Define request/response contracts for all supported operations + /// - Contain mapping methods between public DTOs and internal domain models + /// + /// Architecture: + /// External world (TBF / UI) + /// ↓ + /// GciPublicModels (this layer) + /// ↓ + /// Internal GCI API (InterfaceGCIToLaatzen, GenesisMeter, etc.) + /// + /// Notes: + /// - Public models must NOT expose internal types (e.g. GenesisMeter, IPort, etc.) + /// - All mapping between internal and external representations must be done here + /// - DTOs are designed to be simple, serializable, and stable over time + /// - Any change in internal implementation should not affect these models + /// + /// Pattern: + /// Each operation follows a consistent structure: + /// Request → Operation → Result + /// + /// Example: + /// GciInitSlotRequest → InitSlot → GciInitSlotResult + /// GetSlot → GciSlotInfo + /// GetPcbId → GciGetPcbIdResult + /// + /// This layer acts as a boundary between domain logic and integration logic. + /// + public class PublicModels + { + /// + /// Public DTOs exposed to external systems. + /// These models represent the contract of the GCI API. + /// They must remain stable and independent of internal implementation. + /// + #region ================================== PUBLIC MODELS =========================================== + + /// + /// Represents query input for data storage readers. + /// Each value is used to execute the same query template once. + /// A single-item list represents a single query. + /// + public class DataQuery + { + /// + /// Parameter values used for repeated execution of the same query template. + /// + public List QueryParams { get; } = new List(); + } + + public class UdsPasswordResult + { + public bool Success { get; set; } + public string PcbId { get; set; } + public string Password { get; set; } + public string Message { get; set; } + + public override string ToString() + { + return string.Format( + "Success={0}, PcbId={1}, Password={2}, Message={3}", + Success, + PcbId, + string.IsNullOrEmpty(Password) ? "" : Password, + Message); + } + } + #endregion + } +} diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/Debug/DebugModels.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/Debug/DebugModels.cs new file mode 100644 index 000000000..559085e41 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/Debug/DebugModels.cs @@ -0,0 +1,75 @@ +using GenesisCordonelInterface.Core.Threading; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; + +namespace TBF.Rig.BridgeComponents.GciBridge.UI.Debug +{ + internal class DebugModels + { + #region ================================== MeterBatch Debug ================================== + public class MeterBatchDebugStatus + { + public int Slot { get; set; } + public bool Selected { get; set; } + public string PcbId { get; set; } + public bool IsLoggedOn { get; set; } + public string RequestPort { get; set; } + public string StreamingPort { get; set; } + public string FwVersion { get; set; } + public string InterfaceVersion { get; set; } + } + + public List GetMeterBatchDebugStatuses(MeterBatch _meterBatch) + { + return _meterBatch.ListOfMeters + .OfType() + .Select(m => new MeterBatchDebugStatus + { + Slot = m.Slot, + PcbId = m.PcbId, + IsLoggedOn = m.IsLoggedOn, + RequestPort = m.RequestPort?.GetPortName(), + StreamingPort = m.StreamingPort?.GetPortName(), + }) + .OrderBy(x => x.Slot) + .ToList(); + } + #endregion + + #region ================================== Worker Debug ================================== + public class WorkerDebugStatus + { + public int Slot { get; set; } + public string Name { get; set; } + public int QueueLength { get; set; } + public bool IsBusy { get; set; } + public string CurrentOperation { get; set; } + public string LastError { get; set; } + public DateTime LastActivity { get; set; } + } + + public List GetWorkerDebugStatuses(ConcurrentDictionary _workers) + { + return _workers + .Select(x => new WorkerDebugStatus + { + Slot = x.Key, + Name = x.Value.Name, + QueueLength = x.Value.QueueLength, + IsBusy = x.Value.IsBusy, + CurrentOperation = x.Value.CurrentOperation, + LastError = x.Value.LastError, + LastActivity = x.Value.LastActivity + }) + .OrderBy(x => x.Slot) + .ToList(); + } + #endregion + } +} diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/Debug/MeterBatchConfigPanel.Designer.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/Debug/MeterBatchConfigPanel.Designer.cs new file mode 100644 index 000000000..40b9cb3c1 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/Debug/MeterBatchConfigPanel.Designer.cs @@ -0,0 +1,57 @@ +namespace TBF.Rig.BridgeComponents.GciBridge.UI.Debug +{ + partial class MeterBatchConfigPanel + { + private System.ComponentModel.IContainer components = null; + private System.Windows.Forms.DataGridView grid; + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (components != null) + components.Dispose(); + + if (_api != null) + _mainView._gciApi.MeterBatchStatusChanged -= Api_MeterBatchStatusChanged; + } + + base.Dispose(disposing); + } + + #region Component Designer generated code + + private void InitializeComponent() + { + this.grid = new System.Windows.Forms.DataGridView(); + + ((System.ComponentModel.ISupportInitialize)(this.grid)).BeginInit(); + this.SuspendLayout(); + + // grid + this.grid.AllowUserToAddRows = false; + this.grid.AllowUserToDeleteRows = false; + this.grid.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; + this.grid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.grid.Dock = System.Windows.Forms.DockStyle.Fill; + this.grid.Name = "grid"; + this.grid.RowHeadersWidth = 30; + this.grid.TabIndex = 0; + + // events + this.grid.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.grid_CellValueChanged); + this.grid.CurrentCellDirtyStateChanged += new System.EventHandler(this.grid_CurrentCellDirtyStateChanged); + this.grid.DataError += new System.Windows.Forms.DataGridViewDataErrorEventHandler(this.grid_DataError); + + // MeterBatchConfigPanel + this.Controls.Add(this.grid); + this.Name = "MeterBatchConfigPanel"; + this.Size = new System.Drawing.Size(600, 200); + + ((System.ComponentModel.ISupportInitialize)(this.grid)).EndInit(); + this.ResumeLayout(false); + } + + #endregion + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/Debug/MeterBatchConfigPanel.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/Debug/MeterBatchConfigPanel.cs new file mode 100644 index 000000000..460ce31ec --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/Debug/MeterBatchConfigPanel.cs @@ -0,0 +1,437 @@ +using GenesisCordonelInterface.API; +using GenesisCordonelInterface.UI; +using System; +using System.Collections.Generic; +using System.IO.Ports; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace TBF.Rig.BridgeComponents.GciBridge.UI.Debug +{ + public partial class MeterBatchConfigPanel : UserControl + { + private readonly InterfaceGCIToLaatzen _api; + private MainForm _mainform; + private MainView _mainView; + public Grid.MeterGridManager _gridManager; + + private bool isRefreshing; + private List comPorts = new List(); + + public MeterBatchConfigPanel(MainForm mainform, MainView mainview) + { + _mainform = mainform; + _mainView = mainview; + _api = _mainView._gciApi._innerMeterAPI; + + InitializeComponent(); + + //GRID + RefreshComPorts(); + _gridManager = new Grid.MeterGridManager(grid); + _gridManager.Init(comPorts); + + grid.KeyDown += grid_KeyDown; + + _mainView._gciApi.MeterBatchStatusChanged += Api_MeterBatchStatusChanged; //global event of table + + UpdateGrid(_api.GetMeterBatchDebugStatuses()); + } + + #region INIT + // ---------------------------------------------------- + + private void InitializeGridColumns() + { + grid.Columns.Clear(); + + grid.Columns.Add("Slot", "Slot"); + grid.Columns.Add(new DataGridViewCheckBoxColumn { Name = "Selected", HeaderText = "Selected" }); + grid.Columns.Add("PcbId", "PcbId"); + grid.Columns.Add(new DataGridViewCheckBoxColumn { Name = "IsLoggedOn", HeaderText = "IsLoggedOn" }); + + grid.Columns.Add(CreateComPortColumn("RequestPort", "RequestPort")); + grid.Columns.Add(CreateComPortColumn("StreamingPort", "StreamingPort")); + + grid.Columns.Add(CreateButtonColumn("DetectRequest", "DetectRequest", "...")); + grid.Columns.Add(CreateButtonColumn("DetectStreaming", "DetectStreaming", "...")); + + grid.Columns.Add("FwVersion", "FwVersion"); + grid.Columns.Add("InterfaceVersion", "InterfaceVersion"); + + foreach (DataGridViewColumn col in grid.Columns) + { + col.ReadOnly = + col.Name != "Selected" && + col.Name != "RequestPort" && + col.Name != "StreamingPort" && + col.Name != "DetectRequest" && + col.Name != "DetectStreaming"; + } + + EnableDoubleBuffering(grid); + } + + private DataGridViewComboBoxColumn CreateComPortColumn(string name, string headerText) + { + return new DataGridViewComboBoxColumn + { + Name = name, + HeaderText = headerText, + DataSource = new List(comPorts), + FlatStyle = FlatStyle.Flat, + DisplayStyle = DataGridViewComboBoxDisplayStyle.DropDownButton + }; + } + + private DataGridViewButtonColumn CreateButtonColumn(string name, string headerText, string text) + { + return new DataGridViewButtonColumn + { + Name = name, + HeaderText = headerText, + Text = text, + UseColumnTextForButtonValue = true + }; + } + + private void RefreshComPorts() + { + comPorts = SerialPort.GetPortNames() + .OrderBy(NaturalComPortOrder) + .ToList(); + + if (!comPorts.Contains("")) + comPorts.Insert(0, ""); + } + + // ---------------------------------------------------- + #endregion + + #region REFRESH EVENT DRIVEN + // ---------------------------------------------------- + + private void Api_MeterBatchStatusChanged(List data) + { + if (IsDisposed) + return; + + if (InvokeRequired) + { + BeginInvoke(new Action(() => UpdateGrid(data))); + return; + } + + UpdateGrid(data); + } + + private void UpdateGrid(List data) + { + isRefreshing = true; + + try + { + if (data == null || data.Count == 0) + { + _gridManager.ClearSlots(); + return; + } + + foreach (var meter in data) + { + EnsurePortValueExists(meter.RequestPort); + EnsurePortValueExists(meter.StreamingPort); + } + + _gridManager.Update(data); + } + finally + { + isRefreshing = false; + } + } + + // ---------------------------------------------------- + #endregion + + #region COM PORT HELPERS + // ---------------------------------------------------- + + private void UpdateComPortColumnItems(string columnName) + { + var col = grid.Columns[columnName] as DataGridViewComboBoxColumn; + if (col == null) + return; + + col.DataSource = null; + col.DataSource = new List(comPorts); + } + + private void EnsurePortValueExists(string port) + { + if (string.IsNullOrWhiteSpace(port)) + return; + + if (comPorts.Contains(port)) + return; + + comPorts.Add(port); + comPorts = comPorts.OrderBy(NaturalComPortOrder).ToList(); + + if (!comPorts.Contains("")) + comPorts.Insert(0, ""); + + _gridManager.UpdateComPortItems(comPorts); + } + + private static int NaturalComPortOrder(string port) + { + if (string.IsNullOrWhiteSpace(port)) + return 0; + + string number = new string(port.Where(char.IsDigit).ToArray()); + + int parsed; + if (int.TryParse(number, out parsed)) + return parsed; + + return int.MaxValue; + } + + // ---------------------------------------------------- + #endregion + + #region GRID HELPERS + // ---------------------------------------------------- + + private DataGridViewRow FindOrCreateRow(int slot) + { + foreach (DataGridViewRow row in grid.Rows) + { + if (row.Cells["Slot"].Value != null && + Convert.ToInt32(row.Cells["Slot"].Value) == slot) + { + return row; + } + } + + int idx = grid.Rows.Add(); + var newRow = grid.Rows[idx]; + newRow.Cells["Slot"].Value = slot; + return newRow; + } + + private void Set(DataGridViewRow row, string col, object value) + { + if (!grid.Columns.Contains(col)) + return; + + if (value == null) + value = ""; + + var cell = row.Cells[col]; + + if (!Equals(cell.Value, value)) + cell.Value = value; + } + + // ---------------------------------------------------- + #endregion + + #region USER EDIT + // ---------------------------------------------------- + + private void grid_CurrentCellDirtyStateChanged(object sender, EventArgs e) + { + if (grid.IsCurrentCellDirty) + grid.CommitEdit(DataGridViewDataErrorContexts.Commit); + } + + private void grid_CellValueChanged(object sender, DataGridViewCellEventArgs e) + { + if (isRefreshing) + return; + + if (e.RowIndex < 0) + return; + + string columnName = grid.Columns[e.ColumnIndex].Name; + + if (columnName != "Selected" && + columnName != "RequestPort" && + columnName != "StreamingPort") + return; + + int slot = Convert.ToInt32(grid.Rows[e.RowIndex].Cells["Slot"].Value); + + if (columnName == "Selected") + { + bool selected = Convert.ToBoolean(grid.Rows[e.RowIndex].Cells["Selected"].Value); + _api.SetSlotSelected(slot, selected); + return; + } + + string port = Convert.ToString(grid.Rows[e.RowIndex].Cells[columnName].Value); + + if (columnName == "RequestPort") + { + //_gciApi.SetSlotRequestPort(slot, port); + return; + } + + if (columnName == "StreamingPort") + { + //_gciApi.SetSlotStreamingPort(slot, port); + return; + } + } + + private async void grid_CellContentClick(object sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex < 0) + return; + + string columnName = grid.Columns[e.ColumnIndex].Name; + + if (columnName != "DetectRequest" && + columnName != "DetectStreaming") + return; + + int slot = Convert.ToInt32(grid.Rows[e.RowIndex].Cells["Slot"].Value); + + if (columnName == "DetectRequest") + { + await DetectRequestPortAsync(slot); + return; + } + + if (columnName == "DetectStreaming") + { + await DetectStreamingPortAsync(slot); + return; + } + } + + private async Task DetectRequestPortAsync(int slot) + { + try + { + grid.Enabled = false; + //await _gciApi.DetectRequestPortAsync(slot); + //_gciApi.RaiseMeterBatchStatusChanged(); + } + finally + { + grid.Enabled = true; + } + } + + private async Task DetectStreamingPortAsync(int slot) + { + try + { + grid.Enabled = false; + //await _gciApi.DetectStreamingPortAsync(slot); + //_gciApi.RaiseMeterBatchStatusChanged(); + } + finally + { + grid.Enabled = true; + } + } + + private void grid_DataError(object sender, DataGridViewDataErrorEventArgs e) + { + e.ThrowException = false; + } + + // ---------------------------------------------------- + #endregion + + #region PERFORMANCE + // ---------------------------------------------------- + + private void EnableDoubleBuffering(DataGridView dgv) + { + typeof(DataGridView) + .GetProperty( + "DoubleBuffered", + System.Reflection.BindingFlags.Instance | + System.Reflection.BindingFlags.NonPublic) + ?.SetValue(dgv, true, null); + } + + // ---------------------------------------------------- + #endregion + + public void AddEmptySlotRow() + { + _gridManager.AddEmptySlotRow(); + } + + public List GetGridData() + { + return _gridManager.GetGridData(); + } + + public List GetSelectedGridData() + { + return _gridManager.GetSelectedGridData(); + } + + private void grid_KeyDown(object sender, KeyEventArgs e) + { + if (e.Control && e.KeyCode == Keys.V) + { + PasteFromClipboard(); + e.Handled = true; + } + } + + private void PasteFromClipboard() + { + string text = Clipboard.GetText(); + + if (string.IsNullOrWhiteSpace(text)) + return; + + var lines = text.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); + + int startRow = grid.CurrentCell.RowIndex; + int startCol = grid.CurrentCell.ColumnIndex; + + for (int i = 0; i < lines.Length; i++) + { + var cells = lines[i].Split('\t'); + + int rowIndex = startRow + i; + + if (rowIndex >= grid.Rows.Count) + grid.Rows.Add(); + + for (int j = 0; j < cells.Length; j++) + { + int colIndex = startCol + j; + + if (colIndex >= grid.Columns.Count) + continue; + + string columnName = grid.Columns[colIndex].Name; + + if (columnName == "RequestPort" || + columnName == "RequestPortType" || + columnName == "StreamingPort") + { + string value = cells[j]; + + // 👉 dôležité pre ComboBox + EnsurePortValueExists(value); + + grid.Rows[rowIndex].Cells[colIndex].Value = value; + } + } + } + } + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/Debug/WorkerDebugPanel.Designer.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/Debug/WorkerDebugPanel.Designer.cs new file mode 100644 index 000000000..aa85ddf41 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/Debug/WorkerDebugPanel.Designer.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; + +namespace TBF.Rig.BridgeComponents.GciBridge.UI.Debug +{ + partial class WorkerDebugPanel + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/Debug/WorkerDebugPanel.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/Debug/WorkerDebugPanel.cs new file mode 100644 index 000000000..6a4fccde1 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/Debug/WorkerDebugPanel.cs @@ -0,0 +1,57 @@ +using GenesisCordonelInterface.API; +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace TBF.Rig.BridgeComponents.GciBridge.UI.Debug +{ + public partial class WorkerDebugPanel : UserControl + { + private readonly InterfaceGCIToLaatzen _api; + private MainForm _mainform; + private MainView _mainView; + private readonly Timer timer = new Timer(); + private readonly DataGridView grid = new DataGridView(); + public event Action> MeterBatchStatusChanged; + + public WorkerDebugPanel(MainForm mainform, MainView mainview) + { + _mainform = mainform; + _mainView = mainview; + _api = _mainView._gciApi._innerMeterAPI; + + grid.Dock = DockStyle.Fill; + grid.ReadOnly = true; + grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + + Controls.Add(grid); + + timer.Interval = 300; + timer.Tick += (s, e) => + { + grid.DataSource = null; + grid.DataSource = _api.GetWorkerDebugStatuses(); + }; + + timer.Start(); + } + + private void InitializeLayout() + { + grid.Dock = DockStyle.Fill; + grid.ReadOnly = true; + grid.AllowUserToAddRows = false; + grid.AllowUserToDeleteRows = false; + grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + + Controls.Add(grid); + Dock = DockStyle.Fill; + } + + private void Timer_Tick(object sender, EventArgs e) + { + grid.DataSource = null; + grid.DataSource = _api.GetWorkerDebugStatuses(); + } + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/Grid/MeterGridColumnConfig.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/Grid/MeterGridColumnConfig.cs new file mode 100644 index 000000000..552faa45a --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/Grid/MeterGridColumnConfig.cs @@ -0,0 +1,12 @@ +namespace TBF.Rig.BridgeComponents.GciBridge.UI.Grid +{ + public class MeterGridColumnConfig + { + public string Name { get; set; } + public string HeaderText { get; set; } + public bool Visible { get; set; } = true; + public int DisplayIndex { get; set; } + public int Width { get; set; } = 80; + public bool ReadOnly { get; set; } = false; + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/Grid/MeterGridConfigProvider.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/Grid/MeterGridConfigProvider.cs new file mode 100644 index 000000000..ad66b9ed2 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/Grid/MeterGridConfigProvider.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; + +namespace TBF.Rig.BridgeComponents.GciBridge.UI.Grid +{ + public static class MeterGridConfigProvider + { + public static List GetDefault() + { + return new List + { + new MeterGridColumnConfig { Name = "Slot", HeaderText = "Slot", DisplayIndex = 0, Width = 50, ReadOnly = true }, + new MeterGridColumnConfig { Name = "Selected", HeaderText = "Selected", DisplayIndex = 1, Width = 60 }, + new MeterGridColumnConfig { Name = "PcbId", HeaderText = "PcbId", DisplayIndex = 2, Width = 80 }, + new MeterGridColumnConfig { Name = "IsLoggedOn", HeaderText = "IsLoggedOn", DisplayIndex = 3, Width = 80 }, + new MeterGridColumnConfig { Name = "RequestPort", HeaderText = "RequestPort", DisplayIndex = 4, Width = 90 }, + new MeterGridColumnConfig { Name = "StreamingPort", HeaderText = "StreamingPort", DisplayIndex = 5, Width = 100 }, + new MeterGridColumnConfig { Name = "FwVersion", HeaderText = "FwVersion", DisplayIndex = 6, Width = 80 }, + new MeterGridColumnConfig { Name = "InterfaceVersion", HeaderText = "InterfaceVersion", DisplayIndex = 7, Width = 110 }, + }; + } + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/Grid/MeterGridManager.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/Grid/MeterGridManager.cs new file mode 100644 index 000000000..26e0e61de --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/Grid/MeterGridManager.cs @@ -0,0 +1,377 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Windows.Forms; +using PublicModels = GenesisCordonelInterface.API.PublicModels; + +namespace TBF.Rig.BridgeComponents.GciBridge.UI.Grid +{ + public class MeterGridManager + { + private readonly DataGridView grid; + + public MeterGridManager(DataGridView grid) + { + this.grid = grid ?? throw new ArgumentNullException(nameof(grid)); + EnableDoubleBuffering(grid); + } + + public void Init(List comPorts) + { + grid.SuspendLayout(); + + try + { + grid.AutoGenerateColumns = false; + grid.Columns.Clear(); + + grid.AllowUserToAddRows = false; + grid.AllowUserToDeleteRows = false; + grid.RowHeadersVisible = true; + + grid.Columns.Add("Slot", "Slot"); + grid.Columns.Add(new DataGridViewCheckBoxColumn { Name = "Selected", HeaderText = "Selected" }); + grid.Columns.Add("PcbId", "PcbId"); + grid.Columns.Add(new DataGridViewCheckBoxColumn { Name = "IsLoggedOn", HeaderText = "IsLoggedOn" }); + + grid.Columns.Add(CreateComPortColumn("RequestPort", "RequestPort", comPorts)); + grid.Columns.Add(CreateRequestPortTypeColumn()); + grid.Columns.Add(CreateComPortColumn("StreamingPort", "StreamingPort", comPorts)); + + grid.Columns.Add(CreateButtonColumn("DetectRequest", "DetectRequest", "...")); + grid.Columns.Add(CreateButtonColumn("DetectStreaming", "DetectStreaming", "...")); + + grid.Columns.Add("FwVersion", "FwVersion"); + grid.Columns.Add("InterfaceVersion", "InterfaceVersion"); + + foreach (DataGridViewColumn col in grid.Columns) + { + col.ReadOnly = + col.Name != "Selected" && + col.Name != "RequestPort" && + col.Name != "RequestPortType" && + col.Name != "StreamingPort" && + col.Name != "DetectRequest" && + col.Name != "DetectStreaming"; + } + } + finally + { + grid.ResumeLayout(); + } + + grid.Focus(); + grid.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText; + } + + public void UpdateComPortItems(List comPorts) + { + UpdateComPortColumnItems("RequestPort", comPorts); + UpdateComPortColumnItems("StreamingPort", comPorts); + } + + public void Update(List meters) + { + grid.SuspendLayout(); + + try + { + foreach (var meter in meters) + { + var row = FindOrCreateRow(meter.Slot); + + SetCell(row, "Slot", meter.Slot); + SetCell(row, "Selected", meter.Selected); + SetCell(row, "PcbId", meter.PcbId); + SetCell(row, "IsLoggedOn", meter.IsLoggedOn); + SetCell(row, "RequestPort", meter.RequestPort); + SetCell(row, "RequestPortType", NormalizeRequestPortType(meter.RequestPortType)); + SetCell(row, "StreamingPort", meter.StreamingPort); + SetCell(row, "FwVersion", meter.FwVersion); + SetCell(row, "InterfaceVersion", meter.InterfaceVersion); + } + } + finally + { + grid.ResumeLayout(); + } + } + + public void UpdateSlots(List slots) + { + grid.SuspendLayout(); + + try + { + foreach (var slot in slots) + { + var row = FindOrCreateRow(slot.SlotId); + + SetCell(row, "Slot", slot.SlotId); + SetCell(row, "PcbId", slot.PcbId); + SetCell(row, "RequestPort", slot.RequestPort == null ? "" : slot.RequestPort.PortName); + SetCell(row, "RequestPortType", MapRequestPortTypeBack(slot.RequestPort == null ? null : slot.RequestPort.Type)); + SetCell(row, "StreamingPort", slot.StreamingPort == null ? "" : slot.StreamingPort.PortName); + SetCell(row, "IsLoggedOn", false); + SetCell(row, "FwVersion", ""); + SetCell(row, "InterfaceVersion", ""); + } + } + finally + { + grid.ResumeLayout(); + } + } + + public void AddEmptySlotRow() + { + AddSlotRow(GetNextSlotId()); + } + + public void AddSlotRow() + { + AddSlotRow(GetNextSlotId()); + } + + public void AddSlotRow(int slotId) + { + if (ContainsSlot(slotId)) + throw new Exception($"Slot {slotId} already exists."); + + int idx = grid.Rows.Add(); + var row = grid.Rows[idx]; + + SetCell(row, "Slot", slotId); + SetCell(row, "Selected", false); + SetCell(row, "RequestPort", ""); + SetCell(row, "RequestPortType", "IRDA"); + SetCell(row, "StreamingPort", ""); + SetCell(row, "PcbId", ""); + SetCell(row, "IsLoggedOn", false); + SetCell(row, "FwVersion", ""); + SetCell(row, "InterfaceVersion", ""); + } + + public List GetGridData() + { + var list = new List(); + + foreach (DataGridViewRow row in grid.Rows) + { + if (row.IsNewRow) + continue; + + if (row.Cells["Slot"].Value == null) + continue; + + list.Add(new PublicModels.MeterBatchDebugStatus + { + Slot = Convert.ToInt32(row.Cells["Slot"].Value), + Selected = GetBool(row, "Selected"), + PcbId = GetString(row, "PcbId"), + IsLoggedOn = GetBool(row, "IsLoggedOn"), + RequestPort = GetString(row, "RequestPort"), + RequestPortType = NormalizeRequestPortType(GetString(row, "RequestPortType")), + StreamingPort = GetString(row, "StreamingPort"), + FwVersion = GetString(row, "FwVersion"), + InterfaceVersion = GetString(row, "InterfaceVersion") + }); + } + + return list; + } + + public List GetSelectedGridData() + { + return GetGridData() + .Where(x => x.Selected) + .ToList(); + } + + public int GetSlotFromRow(int rowIndex) + { + if (rowIndex < 0) + throw new ArgumentOutOfRangeException(nameof(rowIndex)); + + return Convert.ToInt32(grid.Rows[rowIndex].Cells["Slot"].Value); + } + + public string GetColumnName(int columnIndex) + { + return grid.Columns[columnIndex].Name; + } + + public void ClearSlots() + { + grid.Rows.Clear(); + } + + public int GetNextSlotId() + { + var existingSlots = grid.Rows + .Cast() + .Where(r => !r.IsNewRow) + .Where(r => r.Cells["Slot"].Value != null) + .Select(r => Convert.ToInt32(r.Cells["Slot"].Value)) + .ToList(); + + if (existingSlots.Count == 0) + return 1; + + return existingSlots.Max() + 1; + } + + private bool ContainsSlot(int slotId) + { + return grid.Rows + .Cast() + .Any(r => + !r.IsNewRow && + r.Cells["Slot"].Value != null && + Convert.ToInt32(r.Cells["Slot"].Value) == slotId); + } + + private DataGridViewRow FindOrCreateRow(int slot) + { + foreach (DataGridViewRow row in grid.Rows) + { + if (!row.IsNewRow && + row.Cells["Slot"].Value != null && + Convert.ToInt32(row.Cells["Slot"].Value) == slot) + { + return row; + } + } + + int idx = grid.Rows.Add(); + var newRow = grid.Rows[idx]; + newRow.Cells["Slot"].Value = slot; + return newRow; + } + + private void SetCell(DataGridViewRow row, string colName, object value) + { + if (!grid.Columns.Contains(colName)) + return; + + if (value == null) + value = ""; + + if (colName == "RequestPortType") + value = NormalizeRequestPortType(Convert.ToString(value)); + + var cell = row.Cells[colName]; + + if (!Equals(cell.Value, value)) + cell.Value = value; + } + + private string GetString(DataGridViewRow row, string colName) + { + if (!grid.Columns.Contains(colName)) + return ""; + + return Convert.ToString(row.Cells[colName].Value); + } + + private bool GetBool(DataGridViewRow row, string colName) + { + if (!grid.Columns.Contains(colName)) + return false; + + if (row.Cells[colName].Value == null) + return false; + + return Convert.ToBoolean(row.Cells[colName].Value); + } + + private DataGridViewComboBoxColumn CreateComPortColumn( + string name, + string headerText, + List comPorts) + { + return new DataGridViewComboBoxColumn + { + Name = name, + HeaderText = headerText, + DataSource = new List(comPorts ?? new List()), + FlatStyle = FlatStyle.Flat, + DisplayStyle = DataGridViewComboBoxDisplayStyle.DropDownButton + }; + } + + private DataGridViewComboBoxColumn CreateRequestPortTypeColumn() + { + return new DataGridViewComboBoxColumn + { + Name = "RequestPortType", + HeaderText = "RequestPortType", + DataSource = new List { "", "IRDA", "UART", "RFID" }, + FlatStyle = FlatStyle.Flat, + DisplayStyle = DataGridViewComboBoxDisplayStyle.DropDownButton + }; + } + + private DataGridViewButtonColumn CreateButtonColumn( + string name, + string headerText, + string text) + { + return new DataGridViewButtonColumn + { + Name = name, + HeaderText = headerText, + Text = text, + UseColumnTextForButtonValue = true + }; + } + + private void UpdateComPortColumnItems(string columnName, List comPorts) + { + var col = grid.Columns[columnName] as DataGridViewComboBoxColumn; + if (col == null) + return; + + col.DataSource = null; + col.DataSource = new List(comPorts ?? new List()); + } + + private string NormalizeRequestPortType(string value) + { + if (string.IsNullOrWhiteSpace(value)) + return ""; + + string normalized = value.Trim(); + + if (normalized.Equals("RFID", StringComparison.OrdinalIgnoreCase) || + normalized.IndexOf("RfidSerialPort", StringComparison.OrdinalIgnoreCase) >= 0) + return "RFID"; + + if (normalized.Equals("UART", StringComparison.OrdinalIgnoreCase) || + normalized.IndexOf("UartSerialPort", StringComparison.OrdinalIgnoreCase) >= 0) + return "UART"; + + if (normalized.Equals("IRDA", StringComparison.OrdinalIgnoreCase) || + normalized.Equals("IrDA", StringComparison.OrdinalIgnoreCase) || + normalized.IndexOf("IrdaSerialPort", StringComparison.OrdinalIgnoreCase) >= 0) + return "IRDA"; + + return ""; + } + + private string MapRequestPortTypeBack(string fullType) + { + return NormalizeRequestPortType(fullType); + } + + private void EnableDoubleBuffering(DataGridView dgv) + { + typeof(DataGridView) + .GetProperty( + "DoubleBuffered", + BindingFlags.Instance | BindingFlags.NonPublic) + ?.SetValue(dgv, true, null); + } + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/Grid/MeterRowDto.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/Grid/MeterRowDto.cs new file mode 100644 index 000000000..74cd94095 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/Grid/MeterRowDto.cs @@ -0,0 +1,14 @@ +namespace TBF.Rig.BridgeComponents.GciBridge.UI.Grid +{ + public class MeterRowDto + { + public int Slot { get; set; } + public bool Selected { get; set; } + public string PcbId { get; set; } + public bool IsLoggedOn { get; set; } + public string RequestPort { get; set; } + public string StreamingPort { get; set; } + public string FwVersion { get; set; } + public string InterfaceVersion { get; set; } + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/MainForm.Designer.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/MainForm.Designer.cs new file mode 100644 index 000000000..2cd45b1fc --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/MainForm.Designer.cs @@ -0,0 +1,166 @@ +namespace TBF.Rig.BridgeComponents.GciBridge.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 mainHostPanel; + 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.mainHostPanel = new System.Windows.Forms.Panel(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.tslStatus = new System.Windows.Forms.ToolStripStatusLabel(); + + this.menuStrip1.SuspendLayout(); + this.statusStrip1.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 = "FileConfig"; + + // + // 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); + + // + // mainHostPanel + // + this.mainHostPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.mainHostPanel.Location = new System.Drawing.Point(0, 24); + this.mainHostPanel.Name = "mainHostPanel"; + this.mainHostPanel.Padding = new System.Windows.Forms.Padding(0); + this.mainHostPanel.Size = new System.Drawing.Size(1309, 474); + this.mainHostPanel.TabIndex = 1; + + // + // 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 = 2; + this.statusStrip1.Text = "statusStrip1"; + + // + // tslStatus + // + this.tslStatus.Name = "tslStatus"; + this.tslStatus.Size = new System.Drawing.Size(39, 17); + this.tslStatus.Text = "Ready"; + + // + // 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.mainHostPanel); + 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.Load += new System.EventHandler(this.MainForm_Load); + + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + } + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/MainForm.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/MainForm.cs new file mode 100644 index 000000000..0e77963bc --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/MainForm.cs @@ -0,0 +1,54 @@ +using GenesisCordonelInterface.API; +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace TBF.Rig.BridgeComponents.GciBridge.UI +{ + public partial class MainForm : Form + { + public MainView mainView; + public GciBridge _bridge; + + public MainForm(GciBridge bridge) + { + _bridge = bridge; + InitializeComponent(); + + StartPosition = FormStartPosition.Manual; + Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - Width, 0); + + StartPosition = FormStartPosition.CenterScreen; + WindowState = FormWindowState.Maximized; + } + + private void MainForm_Load(object sender, EventArgs e) + { + mainView = new MainView(_bridge, this); + mainView.Dock = DockStyle.Fill; + Controls.Add(mainView); + mainView.BringToFront(); + this.WindowState = FormWindowState.Maximized; + } + + private void miExit_Click(object sender, EventArgs e) + { + Close(); + } + + private void miClearLog_Click(object sender, EventArgs e) + { + if (mainView != null) + mainView.ClearLog(); + } + + private void miHelpAbout_Click(object sender, EventArgs e) + { + MessageBox.Show( + "Genesis Cordonel Tester", + "About", + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/MainForm.resx b/TBF/Rig/BridgeComponents/GciBridge/UI/MainForm.resx new file mode 100644 index 000000000..b624c9cc7 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/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/TBF/Rig/BridgeComponents/GciBridge/UI/MainView.Designer.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/MainView.Designer.cs new file mode 100644 index 000000000..b91caceed --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/MainView.Designer.cs @@ -0,0 +1,394 @@ +namespace TBF.Rig.BridgeComponents.GciBridge.UI +{ + partial class MainView + { + private System.ComponentModel.IContainer components = null; + + private System.Windows.Forms.Panel pnlLeftMenu; + private System.Windows.Forms.Panel pnlMain; + + private System.Windows.Forms.SplitContainer splitMain; + private System.Windows.Forms.SplitContainer splitBottom; + + private System.Windows.Forms.RichTextBox rtbMainLog; + private System.Windows.Forms.Panel pnlSlotConfig; + private System.Windows.Forms.Panel pnlWorkerDebug; + + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox groupBox3; + + private System.Windows.Forms.Button btnSetup; + private System.Windows.Forms.Button btnRegisterStore; + private System.Windows.Forms.Button btnPulseSetup; + private System.Windows.Forms.Button preadjustmentButton; + private System.Windows.Forms.Button btnMetersAction; + private System.Windows.Forms.SplitContainer splitWorkArea; + private System.Windows.Forms.Panel pnlGciViewHost; + + + private void InitializeComponent() + { + 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.groupBox5 = new System.Windows.Forms.GroupBox(); + this.btnMetersAction = new System.Windows.Forms.Button(); + this.storageActionButton = new System.Windows.Forms.Button(); + this.combinedActionButton = new System.Windows.Forms.Button(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.btnDiagTablesConfigurationButton = new System.Windows.Forms.Button(); + this.pnlMain = new System.Windows.Forms.Panel(); + this.splitMain = new System.Windows.Forms.SplitContainer(); + this.splitWorkArea = new System.Windows.Forms.SplitContainer(); + this.pnlGciViewHost = new System.Windows.Forms.Panel(); + this.rtbMainLog = new System.Windows.Forms.RichTextBox(); + this.splitBottom = new System.Windows.Forms.SplitContainer(); + this.pnlSlotConfig = new System.Windows.Forms.Panel(); + this.pnlWorkerDebug = new System.Windows.Forms.Panel(); + this.pnlLeftMenu.SuspendLayout(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.pnlMain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitMain)).BeginInit(); + this.splitMain.Panel1.SuspendLayout(); + this.splitMain.Panel2.SuspendLayout(); + this.splitMain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitWorkArea)).BeginInit(); + this.splitWorkArea.Panel1.SuspendLayout(); + this.splitWorkArea.Panel2.SuspendLayout(); + this.splitWorkArea.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitBottom)).BeginInit(); + this.splitBottom.Panel1.SuspendLayout(); + this.splitBottom.Panel2.SuspendLayout(); + this.splitBottom.SuspendLayout(); + this.SuspendLayout(); + // + // 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, 0); + this.pnlLeftMenu.Name = "pnlLeftMenu"; + this.pnlLeftMenu.Size = new System.Drawing.Size(190, 500); + this.pnlLeftMenu.TabIndex = 0; + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl1.Location = new System.Drawing.Point(0, 0); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(188, 498); + this.tabControl1.TabIndex = 0; + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.groupBox2); + this.tabPage1.Controls.Add(this.groupBox1); + this.tabPage1.Enabled = false; + 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(180, 472); + 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, 170); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(166, 70); + this.groupBox2.TabIndex = 1; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "CordonelPreadjustmentUI"; + // + // preadjustmentButton + // + this.preadjustmentButton.Location = new System.Drawing.Point(6, 20); + this.preadjustmentButton.Name = "preadjustmentButton"; + this.preadjustmentButton.Size = new System.Drawing.Size(150, 30); + this.preadjustmentButton.TabIndex = 0; + 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, 10); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(166, 150); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "GenesisToolBox"; + // + // btnPulseSetup + // + this.btnPulseSetup.Location = new System.Drawing.Point(7, 90); + this.btnPulseSetup.Name = "btnPulseSetup"; + this.btnPulseSetup.Size = new System.Drawing.Size(150, 30); + 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, 20); + this.btnSetup.Name = "btnSetup"; + this.btnSetup.Size = new System.Drawing.Size(150, 30); + 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, 55); + this.btnRegisterStore.Name = "btnRegisterStore"; + this.btnRegisterStore.Size = new System.Drawing.Size(150, 30); + 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.groupBox5); + 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(180, 472); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "Gci Bridge API"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.btnMetersAction); + this.groupBox5.Controls.Add(this.storageActionButton); + this.groupBox5.Controls.Add(this.combinedActionButton); + this.groupBox5.Location = new System.Drawing.Point(6, 85); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(166, 131); + this.groupBox5.TabIndex = 3; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "Interface"; + // + // btnMetersAction + // + this.btnMetersAction.Location = new System.Drawing.Point(6, 19); + this.btnMetersAction.Name = "btnMetersAction"; + this.btnMetersAction.Size = new System.Drawing.Size(150, 30); + this.btnMetersAction.TabIndex = 1; + this.btnMetersAction.Text = "GenesisCordonelInterface"; + this.btnMetersAction.UseVisualStyleBackColor = true; + this.btnMetersAction.Click += new System.EventHandler(this.btnMetersAction_Click); + // + // storageActionButton + // + this.storageActionButton.Location = new System.Drawing.Point(6, 55); + this.storageActionButton.Name = "storageActionButton"; + this.storageActionButton.Size = new System.Drawing.Size(150, 30); + this.storageActionButton.TabIndex = 0; + this.storageActionButton.Text = "UniDataStorageReader"; + this.storageActionButton.UseVisualStyleBackColor = true; + this.storageActionButton.Click += new System.EventHandler(this.button1_Click_1); + // + // combinedActionButton + // + this.combinedActionButton.Location = new System.Drawing.Point(6, 91); + this.combinedActionButton.Name = "combinedActionButton"; + this.combinedActionButton.Size = new System.Drawing.Size(150, 30); + this.combinedActionButton.TabIndex = 0; + this.combinedActionButton.Text = "Combined Action"; + this.combinedActionButton.UseVisualStyleBackColor = true; + this.combinedActionButton.Click += new System.EventHandler(this.button2_Click); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.btnDiagTablesConfigurationButton); + this.groupBox3.Location = new System.Drawing.Point(8, 20); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(166, 59); + this.groupBox3.TabIndex = 0; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "GUI"; + // + // btnDiagTablesConfigurationButton + // + this.btnDiagTablesConfigurationButton.Location = new System.Drawing.Point(6, 19); + this.btnDiagTablesConfigurationButton.Name = "btnDiagTablesConfigurationButton"; + this.btnDiagTablesConfigurationButton.Size = new System.Drawing.Size(150, 30); + this.btnDiagTablesConfigurationButton.TabIndex = 1; + this.btnDiagTablesConfigurationButton.Text = "Diag tables configuration"; + this.btnDiagTablesConfigurationButton.UseVisualStyleBackColor = true; + this.btnDiagTablesConfigurationButton.Click += new System.EventHandler(this.btnMeterInit_Click_1); + // + // pnlMain + // + this.pnlMain.Controls.Add(this.splitMain); + this.pnlMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlMain.Location = new System.Drawing.Point(190, 0); + this.pnlMain.Name = "pnlMain"; + this.pnlMain.Padding = new System.Windows.Forms.Padding(5); + this.pnlMain.Size = new System.Drawing.Size(710, 500); + this.pnlMain.TabIndex = 1; + // + // splitMain + // + this.splitMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitMain.Location = new System.Drawing.Point(5, 5); + this.splitMain.Name = "splitMain"; + this.splitMain.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitMain.Panel1 + // + this.splitMain.Panel1.Controls.Add(this.splitWorkArea); + this.splitMain.Panel1MinSize = 100; + // + // splitMain.Panel2 + // + this.splitMain.Panel2.Controls.Add(this.splitBottom); + this.splitMain.Panel2MinSize = 100; + this.splitMain.Size = new System.Drawing.Size(700, 490); + this.splitMain.SplitterDistance = 320; + this.splitMain.SplitterWidth = 6; + this.splitMain.TabIndex = 0; + // + // splitWorkArea + // + this.splitWorkArea.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitWorkArea.Location = new System.Drawing.Point(0, 0); + this.splitWorkArea.Name = "splitWorkArea"; + // + // splitWorkArea.Panel1 + // + this.splitWorkArea.Panel1.Controls.Add(this.pnlGciViewHost); + // + // splitWorkArea.Panel2 + // + this.splitWorkArea.Panel2.Controls.Add(this.rtbMainLog); + this.splitWorkArea.Size = new System.Drawing.Size(700, 320); + this.splitWorkArea.SplitterDistance = 233; + this.splitWorkArea.SplitterWidth = 6; + this.splitWorkArea.TabIndex = 0; + // + // pnlGciViewHost + // + this.pnlGciViewHost.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pnlGciViewHost.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlGciViewHost.Location = new System.Drawing.Point(0, 0); + this.pnlGciViewHost.Name = "pnlGciViewHost"; + this.pnlGciViewHost.Size = new System.Drawing.Size(233, 320); + this.pnlGciViewHost.TabIndex = 0; + // + // 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(0, 0); + this.rtbMainLog.Name = "rtbMainLog"; + this.rtbMainLog.ReadOnly = true; + this.rtbMainLog.Size = new System.Drawing.Size(461, 320); + this.rtbMainLog.TabIndex = 0; + this.rtbMainLog.Text = ""; + // + // splitBottom + // + this.splitBottom.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitBottom.Location = new System.Drawing.Point(0, 0); + this.splitBottom.Name = "splitBottom"; + // + // splitBottom.Panel1 + // + this.splitBottom.Panel1.Controls.Add(this.pnlSlotConfig); + this.splitBottom.Panel1MinSize = 250; + // + // splitBottom.Panel2 + // + this.splitBottom.Panel2.Controls.Add(this.pnlWorkerDebug); + this.splitBottom.Panel2MinSize = 250; + this.splitBottom.Size = new System.Drawing.Size(700, 164); + this.splitBottom.SplitterDistance = 320; + this.splitBottom.SplitterWidth = 6; + this.splitBottom.TabIndex = 0; + // + // pnlSlotConfig + // + this.pnlSlotConfig.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pnlSlotConfig.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlSlotConfig.Location = new System.Drawing.Point(0, 0); + this.pnlSlotConfig.Name = "pnlSlotConfig"; + this.pnlSlotConfig.Size = new System.Drawing.Size(320, 164); + this.pnlSlotConfig.TabIndex = 0; + // + // pnlWorkerDebug + // + this.pnlWorkerDebug.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pnlWorkerDebug.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlWorkerDebug.Location = new System.Drawing.Point(0, 0); + this.pnlWorkerDebug.Name = "pnlWorkerDebug"; + this.pnlWorkerDebug.Size = new System.Drawing.Size(374, 164); + this.pnlWorkerDebug.TabIndex = 0; + // + // MainView + // + this.Controls.Add(this.pnlMain); + this.Controls.Add(this.pnlLeftMenu); + this.Name = "MainView"; + this.Size = new System.Drawing.Size(900, 500); + 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.groupBox5.ResumeLayout(false); + this.groupBox3.ResumeLayout(false); + this.pnlMain.ResumeLayout(false); + this.splitMain.Panel1.ResumeLayout(false); + this.splitMain.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitMain)).EndInit(); + this.splitMain.ResumeLayout(false); + this.splitWorkArea.Panel1.ResumeLayout(false); + this.splitWorkArea.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitWorkArea)).EndInit(); + this.splitWorkArea.ResumeLayout(false); + this.splitBottom.Panel1.ResumeLayout(false); + this.splitBottom.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitBottom)).EndInit(); + this.splitBottom.ResumeLayout(false); + this.ResumeLayout(false); + + } + private System.Windows.Forms.Button storageActionButton; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.Button combinedActionButton; + private System.Windows.Forms.Button btnDiagTablesConfigurationButton; + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/MainView.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/MainView.cs new file mode 100644 index 000000000..e628570ce --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/MainView.cs @@ -0,0 +1,352 @@ +using GenesisCordonelInterface.API; +using GenesisCordonelInterface.UI.Debug; +using GenesisCordonelInterface.UI.StaraTuraAPI_GenesisCordonelInterface; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using TBF.Rig.BridgeComponents.GciBridge.UI.Debug; +using TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge; +using Xylem.Common.Utils.Logging; + +namespace TBF.Rig.BridgeComponents.GciBridge.UI +{ + public partial class MainView : UserControl + { + #region DECLARATION + 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 InterfaceOutsideToGCI _gciApi; + public InterfaceGCIToLaatzen _laatzenApi; + public MainForm _mainform; + public GciBridge _bridge; + public Debug.MeterBatchConfigPanel _batchPanel; + public event Action> MeterBatchStatusChanged;// object status from place of his location + #endregion + + public MainView(GciBridge bridge, MainForm mainform) + { + _mainform = mainform; + _bridge = bridge; + _gciApi = bridge.gciExternalInterface; + _laatzenApi = _bridge.gciExternalInterface._innerMeterAPI; + InitializeComponent(); + InitializeDebugPanels(); + //InitializeWorkerDebugPanel(); + + UiLogBus.MessageReceived += UiLogBus_MessageReceived; // Nlog messages incoming + + rtbMainLog.BackColor = Color.Black; + rtbMainLog.ForeColor = Color.Gainsboro; + rtbMainLog.Font = new Font("Consolas", 9f); + rtbMainLog.ReadOnly = true; + rtbMainLog.HideSelection = false; + } + + private void InitializeDebugPanels() + { + _batchPanel = new Debug.MeterBatchConfigPanel(_mainform, this) + { + Dock = DockStyle.Fill + }; + + pnlSlotConfig.Controls.Add(_batchPanel); + + pnlWorkerDebug.Controls.Add(new Debug.WorkerDebugPanel(_mainform, this) + { + Dock = DockStyle.Fill + }); + } + + public void AddSlotRow() + { + _batchPanel?.AddEmptySlotRow(); + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + BeginInvoke(new Action(() => + { + SetSafeSplitterDistance(splitWorkArea, 420); + })); + } + + private void SetSafeSplitterDistance(SplitContainer split, int desired) + { + int width = split.ClientSize.Width; + + int min1 = split.Panel1MinSize; + int min2 = split.Panel2MinSize; + int splitter = split.SplitterWidth; + + int max = width - min2 - splitter; + + if (width <= min1 + min2 + splitter) + return; + + if (desired < min1) + desired = min1; + + if (desired > max) + desired = max; + + split.SplitterDistance = desired; + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + UiLogBus.MessageReceived -= UiLogBus_MessageReceived; + } + + base.Dispose(disposing); + } + + private IWin32Window DialogOwner + { + get + { + Form owner = FindForm(); + return owner ?? (IWin32Window)this; + } + } + + private void ShowGciView(Control view) + { + pnlGciViewHost.Controls.Clear(); + + view.Dock = DockStyle.Fill; + pnlGciViewHost.Controls.Add(view); + } + + public void SaveSlots() + { + var data = _batchPanel.GetGridData(); + _laatzenApi.SaveSlotSetup(data); + } + + private void button2_Click(object sender, EventArgs e) + { + SwitchGciView( + "CombinedInterfaceView", + new CombinedInterfaceView(this, _bridge)); + } + + private void button1_Click_1(object sender, EventArgs e) + { + SwitchGciView( + "StorageAction", + new UniDataStorageReaderInterfaceView(this, _bridge)); + } + + #region BUTTONS + + private void btnMetersAction_Click(object sender, EventArgs e) + { + SwitchGciView( + "SlotsMetersAction", + new GenesisCordonelInterfaceView(this, _bridge, AddSlotRow, SaveSlots)); + } + + private void btnSetup_Click(object sender, EventArgs e) + { + /*Logger.Trace("FORM: ---------------------------------"); + Logger.Trace("FORM: Setup open"); + + using (FrmSetup frm = new FrmSetup()) + { + frm.ShowDialog(DialogOwner); + } + + 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(DialogOwner); + } + + 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(DialogOwner); + } + + Logger.Trace("FORM: Pulse Setup closed.");*/ + } + + private void preadjustmentButton_Click(object sender, EventArgs e) + { + /*Logger.Trace("FORM: ---------------------------------"); + Logger.Trace("FORM: Preadjustment open."); + + using (FrmCordonelPreadjustmentUI frm = new FrmCordonelPreadjustmentUI()) + { + frm.ShowDialog(DialogOwner); + } + + Logger.Trace("FORM: Preadjustment closed.");*/ + } + + private void button1_Click(object sender, EventArgs e) + { + Logger.Trace("FORM: ---------------------------------"); + Logger.Trace("FORM: GciBridge GUI open."); + + using (var frm = new FrmGCIAPI(_gciApi)) + { + frm.ShowDialog(this); + } + + Logger.Trace("FORM: GciBridge closed."); + } + + private void SwitchGciView(string name, Control view) + { + Logger.Trace("FORM: ---------------------------------"); + Logger.Trace($"FORM: GciBridge VIEW -> {name} OPEN"); + + pnlGciViewHost.Controls.Clear(); + + view.Dock = DockStyle.Fill; + pnlGciViewHost.Controls.Add(view); + view.BringToFront(); + + Logger.Trace($"FORM: GciBridge VIEW -> {name} LOADED"); + } + + private void btnMeterInit_Click(object sender, EventArgs e) + { + SwitchGciView( + "MeterInit", + new MeterInitView(_gciApi, AddSlotRow, SaveSlots)); + } + + public void ClearLog() + { + rtbMainLog.Clear(); + Logger.Trace("Log cleared."); + } + #endregion + + #region GLOBAL LOGGING to memo in this view + void UiLogBus_MessageReceived(string loggerName, string msg) + { + if (loggerName != "GciBridge" && loggerName != "GenesisCordonelInterface") + return; + + if (IsDisposed || !IsHandleCreated) + return; + + if (InvokeRequired) + { + BeginInvoke(new Action(UiLogBus_MessageReceived), loggerName, msg); + return; + } + + AppendLogMessage(msg); + } + + private void AppendLogMessage(string msg) + { + string[] lines = msg.Replace("\r\n", "\n").Split('\n'); + + foreach (string originalLine in lines) + { + if (string.IsNullOrWhiteSpace(originalLine)) + continue; + + AppendStyledLine(originalLine); + } + } + + private void AppendStyledLine(string line) + { + if (rtbMainLog == null || rtbMainLog.IsDisposed) + return; + + 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 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 static readonly Tuple[] KeywordGroups = + { + Tuple.Create(Color.DeepSkyBlue, new[] { "REQUEST" }), + Tuple.Create(Color.Lime, new[] { "RESPONSE" }), + Tuple.Create(Color.Gold, new[] { "READ-REGISTER-SESSION", "UI-CLICK" }) + }; + + private void HighlightKeywordsInLine(string line, int lineStartIndex) + { + foreach (var group in KeywordGroups) + { + foreach (var keyword in group.Item2) + { + int index = 0; + + while ((index = line.IndexOf(keyword, index, StringComparison.Ordinal)) >= 0) + { + rtbMainLog.SelectionStart = lineStartIndex + index; + rtbMainLog.SelectionLength = keyword.Length; + rtbMainLog.SelectionColor = group.Item1; + + index += keyword.Length; + } + } + } + } + + #endregion + + private void btnMeterInit_Click_1(object sender, EventArgs e) + { + SwitchGciView( + "ConfigurationView", + new ConfigurationView(this)); + } + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/MainView.resx b/TBF/Rig/BridgeComponents/GciBridge/UI/MainView.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/MainView.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/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/CombinedInterfaceView.Designer.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/CombinedInterfaceView.Designer.cs new file mode 100644 index 000000000..f09f9b92a --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/CombinedInterfaceView.Designer.cs @@ -0,0 +1,111 @@ +namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge +{ + partial class CombinedInterfaceView + { + private System.ComponentModel.IContainer components = null; + + private System.Windows.Forms.GroupBox grpStorage; + private System.Windows.Forms.Button btnGetPcb; + private System.Windows.Forms.Button btnGetPasswordByPcb; + private System.Windows.Forms.Button btnSetPasswordByPcb; + + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.TextBox txtLog; + + protected override void Dispose(bool disposing) + { + if (disposing && components != null) + components.Dispose(); + + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.grpStorage = new System.Windows.Forms.GroupBox(); + this.btnSetPasswordByPcb = new System.Windows.Forms.Button(); + this.btnGetPasswordByPcb = new System.Windows.Forms.Button(); + this.btnGetPcb = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.txtLog = new System.Windows.Forms.TextBox(); + this.grpStorage.SuspendLayout(); + this.SuspendLayout(); + // + // grpStorage + // + this.grpStorage.Controls.Add(this.btnSetPasswordByPcb); + this.grpStorage.Controls.Add(this.btnGetPasswordByPcb); + this.grpStorage.Controls.Add(this.btnGetPcb); + this.grpStorage.Location = new System.Drawing.Point(10, 10); + this.grpStorage.Name = "grpStorage"; + this.grpStorage.Size = new System.Drawing.Size(200, 139); + this.grpStorage.TabIndex = 0; + this.grpStorage.TabStop = false; + this.grpStorage.Text = "Slots by selection in the table"; + // + // btnSetPasswordByPcb + // + this.btnSetPasswordByPcb.Location = new System.Drawing.Point(12, 96); + this.btnSetPasswordByPcb.Name = "btnSetPasswordByPcb"; + this.btnSetPasswordByPcb.Size = new System.Drawing.Size(175, 28); + this.btnSetPasswordByPcb.TabIndex = 2; + this.btnSetPasswordByPcb.Text = "GCI/SetPassword(slot)"; + this.btnSetPasswordByPcb.UseVisualStyleBackColor = true; + this.btnSetPasswordByPcb.Click += new System.EventHandler(this.btnSetPasswordByPcb_Click); + // + // btnGetPasswordByPcb + // + this.btnGetPasswordByPcb.Location = new System.Drawing.Point(12, 62); + this.btnGetPasswordByPcb.Name = "btnGetPasswordByPcb"; + this.btnGetPasswordByPcb.Size = new System.Drawing.Size(175, 28); + this.btnGetPasswordByPcb.TabIndex = 1; + this.btnGetPasswordByPcb.Text = "UDSR/GetPassword(PCB)"; + this.btnGetPasswordByPcb.UseVisualStyleBackColor = true; + this.btnGetPasswordByPcb.Click += new System.EventHandler(this.btnGetPasswordByPcb_Click); + // + // btnGetPcb + // + this.btnGetPcb.Location = new System.Drawing.Point(12, 28); + this.btnGetPcb.Name = "btnGetPcb"; + this.btnGetPcb.Size = new System.Drawing.Size(175, 28); + this.btnGetPcb.TabIndex = 0; + this.btnGetPcb.Text = "GCI/GetPCB(slot)"; + this.btnGetPcb.UseVisualStyleBackColor = true; + this.btnGetPcb.Click += new System.EventHandler(this.btnGetPcb_Click); + // + // btnCancel + // + this.btnCancel.Enabled = false; + this.btnCancel.Location = new System.Drawing.Point(10, 320); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(200, 30); + this.btnCancel.TabIndex = 3; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // txtLog + // + this.txtLog.Location = new System.Drawing.Point(220, 10); + this.txtLog.Multiline = true; + this.txtLog.Name = "txtLog"; + this.txtLog.ReadOnly = true; + this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.txtLog.Size = new System.Drawing.Size(500, 340); + this.txtLog.TabIndex = 4; + this.txtLog.WordWrap = false; + // + // CombinedInterfaceView + // + this.Controls.Add(this.grpStorage); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.txtLog); + this.Name = "CombinedInterfaceView"; + this.Size = new System.Drawing.Size(740, 370); + this.grpStorage.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/CombinedInterfaceView.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/CombinedInterfaceView.cs new file mode 100644 index 000000000..5cd00c103 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/CombinedInterfaceView.cs @@ -0,0 +1,210 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using PublicModels = GenesisCordonelInterface.API.PublicModels; + +namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge +{ + public partial class CombinedInterfaceView : UserControl + { + private readonly MainView _mainView; + private readonly GciBridge _bridge; + private CancellationTokenSource _cts; + + private readonly Dictionary _pcbBySlot = new Dictionary(); + private readonly Dictionary _passwordBySlot = new Dictionary(); + + public CombinedInterfaceView(MainView mainView, GciBridge bridge) + { + _mainView = mainView ?? throw new ArgumentNullException(nameof(mainView)); + _bridge = bridge ?? throw new ArgumentNullException(nameof(bridge)); + + InitializeComponent(); + } + + private List GetSelectedSlots() + { + var slots = _mainView._batchPanel.GetSelectedGridData(); + + if (slots.Count == 0) + throw new Exception("No selected slots in grid."); + + return slots; + } + + private void btnGetPcb_Click(object sender, EventArgs e) + { + ExecuteAsync(async token => + { + _pcbBySlot.Clear(); + + foreach (var slot in GetSelectedSlots()) + { + var result = await _bridge.GetPcbIdAsync(slot.Slot, token); + + LogResult($"GCI/GetPCB slot {slot.Slot}", result); + + if (result != null && + result.Success && + !string.IsNullOrWhiteSpace(result.PcbId)) + { + _pcbBySlot[slot.Slot] = result.PcbId; + Log($"Stored PCB: Slot={slot.Slot}, PCB={result.PcbId}"); + } + } + + Log($"PCB stored count: {_pcbBySlot.Count}"); + }); + } + /*private void btnGetPcb_Click(object sender, EventArgs e) + { + ExecuteAsync(async token => + { + _pcbBySlot.Clear(); + + foreach (var slot in GetSelectedSlots()) + { + string fakePcbId = "231630243"; // docasne platna PCB + + _pcbBySlot[slot.Slot] = fakePcbId; + + Log($"TEMP Stored PCB: Slot={slot.Slot}, PCB={fakePcbId}"); + + await Task.CompletedTask; + } + + Log($"PCB stored count: {_pcbBySlot.Count}"); + }); + }*/ + + private void btnGetPasswordByPcb_Click(object sender, EventArgs e) + { + ExecuteAsync(async token => + { + if (_pcbBySlot.Count == 0) + throw new Exception("No PCB values stored. Run GCI/GetPCB first."); + + _passwordBySlot.Clear(); + + foreach (var item in _pcbBySlot.ToList()) + { + int slot = item.Key; + string pcbId = item.Value; + + var result = await _bridge.GetPasswordAsync(pcbId, token); + + LogResult($"UDSR/GetPassword slot {slot}, PCB={pcbId}", result); + + if (result != null && + result.Success && + !string.IsNullOrWhiteSpace(result.Password)) + { + _passwordBySlot[slot] = result.Password; + Log($"Stored password: Slot={slot}, PCB={pcbId}, Password=hidden"); + } + } + + Log($"Password stored count: {_passwordBySlot.Count}"); + }); + } + + private void btnSetPasswordByPcb_Click(object sender, EventArgs e) + { + ExecuteAsync(async token => + { + if (_passwordBySlot.Count == 0) + throw new Exception("No passwords stored. Run UDSR/GetPassword first."); + + foreach (var item in _passwordBySlot.ToList()) + { + int slot = item.Key; + string password = item.Value; + + var result = await _bridge.SetPasswordAsync(slot, password, token); + + LogResult($"GCI/SetPassword slot {slot}", result); + } + + RefreshGrid(); + }); + } + + private void btnCancel_Click(object sender, EventArgs e) + { + if (_cts != null) + _cts.Cancel(); + + Log("Cancel requested."); + } + + private async void ExecuteAsync(Func action) + { + try + { + SetBusy(true); + + _cts = new CancellationTokenSource(); + + await action(_cts.Token); + } + catch (OperationCanceledException) + { + Log("Operation canceled."); + } + catch (Exception ex) + { + Log("ERROR: " + ex); + + MessageBox.Show( + ex.Message, + "Combined API call failed", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + finally + { + if (_cts != null) + { + _cts.Dispose(); + _cts = null; + } + + SetBusy(false); + } + } + + private void SetBusy(bool busy) + { + Cursor = busy ? Cursors.WaitCursor : Cursors.Default; + + btnGetPcb.Enabled = !busy; + btnGetPasswordByPcb.Enabled = !busy; + btnSetPasswordByPcb.Enabled = !busy; + btnCancel.Enabled = busy; + } + + private void RefreshGrid() + { + if (_bridge.gciExternalInterface != null) + _bridge.gciExternalInterface.RaiseMeterBatchStatusChanged(); + } + + private void LogResult(string methodName, object result) + { + Log(methodName + " result:"); + Log(result == null ? "" : result.ToString()); + } + + private void Log(string message) + { + txtLog.AppendText( + DateTime.Now.ToString("HH:mm:ss.fff") + + " " + + message + + Environment.NewLine); + } + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/CombinedInterfaceView.resx b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/CombinedInterfaceView.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/CombinedInterfaceView.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/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/ConfigurationView.Designer.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/ConfigurationView.Designer.cs new file mode 100644 index 000000000..f6be0e49c --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/ConfigurationView.Designer.cs @@ -0,0 +1,64 @@ +namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge +{ + partial class ConfigurationView + { + private System.ComponentModel.IContainer components = null; + private System.Windows.Forms.Button btnAddSlot; + + protected override void Dispose(bool disposing) + { + if (disposing && components != null) + components.Dispose(); + + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.btnAddSlot = new System.Windows.Forms.Button(); + this.clearSlotsButton = new System.Windows.Forms.Button(); + this.readSlotsButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // btnAddSlot + // + this.btnAddSlot.Location = new System.Drawing.Point(88, 38); + this.btnAddSlot.Name = "btnAddSlot"; + this.btnAddSlot.Size = new System.Drawing.Size(170, 32); + this.btnAddSlot.TabIndex = 2; + this.btnAddSlot.Text = "Add Slot"; + this.btnAddSlot.Click += new System.EventHandler(this.btnAddSlot_Click); + // + // clearSlotsButton + // + this.clearSlotsButton.Location = new System.Drawing.Point(88, 114); + this.clearSlotsButton.Name = "clearSlotsButton"; + this.clearSlotsButton.Size = new System.Drawing.Size(170, 32); + this.clearSlotsButton.TabIndex = 3; + this.clearSlotsButton.Text = "Clear Slots"; + this.clearSlotsButton.Click += new System.EventHandler(this.clearSlotsButton_Click); + // + // readSlotsButton + // + this.readSlotsButton.Location = new System.Drawing.Point(88, 76); + this.readSlotsButton.Name = "readSlotsButton"; + this.readSlotsButton.Size = new System.Drawing.Size(170, 32); + this.readSlotsButton.TabIndex = 4; + this.readSlotsButton.Text = "Read Slots"; + this.readSlotsButton.Click += new System.EventHandler(this.readSlotsButton_Click); + // + // ConfigurationView + // + this.Controls.Add(this.readSlotsButton); + this.Controls.Add(this.clearSlotsButton); + this.Controls.Add(this.btnAddSlot); + this.Name = "ConfigurationView"; + this.Size = new System.Drawing.Size(340, 159); + this.ResumeLayout(false); + + } + + private System.Windows.Forms.Button clearSlotsButton; + private System.Windows.Forms.Button readSlotsButton; + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/ConfigurationView.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/ConfigurationView.cs new file mode 100644 index 000000000..83cf7177f --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/ConfigurationView.cs @@ -0,0 +1,140 @@ +using System; +using System.Threading.Tasks; +using System.Windows.Forms; +using GenesisCordonelInterface.API; + +namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge +{ + public partial class ConfigurationView : UserControl + { + private readonly MainView _mainView; + private readonly Grid.MeterGridManager _gridManager; + private readonly InterfaceOutsideToGCI _gciApi; + + public ConfigurationView(MainView mainView) + { + _mainView = mainView ?? throw new ArgumentNullException(nameof(mainView)); + + if (_mainView._batchPanel == null) + throw new Exception("Batch panel is not initialized."); + + _gridManager = _mainView._batchPanel._gridManager; + _gciApi = _mainView._gciApi; + + if (_gridManager == null) + throw new Exception("Grid manager is not initialized."); + + if (_gciApi == null) + throw new Exception("GCI API is not initialized."); + + InitializeComponent(); + } + + #region BUTTONS + + private async void btnAddSlot_Click(object sender, EventArgs e) + { + await ExecuteApiActionAsync(async () => + { + int slotId = _gridManager.GetNextSlotId(); + + var request = new PublicModels.GciInitSlotRequest + { + SlotId = slotId, + ConfigSource = PublicModels.GciConfigSource.InterfaceInputConfig, + PasswordSource = PublicModels.GciPasswordSource.InterfaceInputPassword, + RequestPort = null, + StreamingPort = null, + Password = null + }; + + var result = await _gciApi.InitSlotAsync(request); + + if (!result.Success) + throw new Exception(result.Message); + + //_gciApi.RaiseMeterBatchStatusChanged(); + _mainView._batchPanel.AddEmptySlotRow(); + }); + } + + private async void readSlotsButton_Click(object sender, EventArgs e) + { + await ExecuteApiActionAsync(async () => + { + var result = await _gciApi.GetAllSlotsAsync(); + + if (!result.Success) + throw new Exception(result.Message); + + var gridRows = + GenesisCordonelInterface.API.ModelsMapping.ToMeterBatchDebugStatusList(result.Slots); + + _gridManager.Update(gridRows); + }); + } + + private async void clearSlotsButton_Click(object sender, EventArgs e) + { + await ExecuteApiActionAsync(async () => + { + await _gciApi.CleanSlotsAsync(); + + _gridManager.ClearSlots(); + }); + } + + #endregion + + private void ExecuteApiAction(Action action) + { + try + { + SetBusy(true); + action(); + } + catch (Exception ex) + { + MessageBox.Show( + ex.Message, + "API call failed", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + finally + { + SetBusy(false); + } + } + + private async Task ExecuteApiActionAsync(Func action) + { + try + { + SetBusy(true); + await action(); + } + catch (Exception ex) + { + MessageBox.Show( + ex.Message, + "API call failed", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + finally + { + SetBusy(false); + } + } + + private void SetBusy(bool busy) + { + Cursor = busy ? Cursors.WaitCursor : Cursors.Default; + + btnAddSlot.Enabled = !busy; + readSlotsButton.Enabled = !busy; + clearSlotsButton.Enabled = !busy; + } + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/ConfigurationView.resx b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/ConfigurationView.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/ConfigurationView.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/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/GenesisCordonelInterfaceView.Designer.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/GenesisCordonelInterfaceView.Designer.cs new file mode 100644 index 000000000..7f7de47be --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/GenesisCordonelInterfaceView.Designer.cs @@ -0,0 +1,263 @@ +namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge +{ + partial class GenesisCordonelInterfaceView + { + private System.ComponentModel.IContainer components = null; + + private System.Windows.Forms.GroupBox grpSlots; + + private System.Windows.Forms.Button btnInitSlot; + private System.Windows.Forms.Button btnUpdateSlot; + private System.Windows.Forms.Button btnGetSlot; + private System.Windows.Forms.Button btnCleanSlots; + + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.TextBox txtLog; + + protected override void Dispose(bool disposing) + { + if (disposing && components != null) + components.Dispose(); + + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.grpSlots = new System.Windows.Forms.GroupBox(); + this.writeRegisterNameComboBox = new System.Windows.Forms.ComboBox(); + this.readRegisterNameComboBox = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); + this.writeRegisterValueTextBox = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.writeRegisterButton = new System.Windows.Forms.Button(); + this.readRegisterButton = new System.Windows.Forms.Button(); + this.btnConnect = new System.Windows.Forms.Button(); + this.btnDisconnect = new System.Windows.Forms.Button(); + this.btnGetPcbId = new System.Windows.Forms.Button(); + this.btnInitSlot = new System.Windows.Forms.Button(); + this.btnUpdateSlot = new System.Windows.Forms.Button(); + this.btnGetSlot = new System.Windows.Forms.Button(); + this.btnCleanSlots = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.txtLog = new System.Windows.Forms.TextBox(); + this.btnLogin = new System.Windows.Forms.Button(); + this.grpSlots.SuspendLayout(); + this.SuspendLayout(); + // + // grpSlots + // + this.grpSlots.Controls.Add(this.writeRegisterNameComboBox); + this.grpSlots.Controls.Add(this.readRegisterNameComboBox); + this.grpSlots.Controls.Add(this.label4); + this.grpSlots.Controls.Add(this.writeRegisterValueTextBox); + this.grpSlots.Controls.Add(this.label3); + this.grpSlots.Controls.Add(this.label2); + this.grpSlots.Controls.Add(this.writeRegisterButton); + this.grpSlots.Controls.Add(this.readRegisterButton); + this.grpSlots.Controls.Add(this.btnConnect); + this.grpSlots.Controls.Add(this.btnDisconnect); + this.grpSlots.Controls.Add(this.btnLogin); + this.grpSlots.Controls.Add(this.btnGetPcbId); + this.grpSlots.Controls.Add(this.btnInitSlot); + this.grpSlots.Controls.Add(this.btnUpdateSlot); + this.grpSlots.Controls.Add(this.btnGetSlot); + this.grpSlots.Controls.Add(this.btnCleanSlots); + this.grpSlots.Location = new System.Drawing.Point(10, 10); + this.grpSlots.Name = "grpSlots"; + this.grpSlots.Size = new System.Drawing.Size(689, 304); + this.grpSlots.TabIndex = 2; + this.grpSlots.TabStop = false; + this.grpSlots.Text = "Slots by selection in the table"; + this.grpSlots.Enter += new System.EventHandler(this.grpSlots_Enter); + // + // writeRegisterNameComboBox + // + this.writeRegisterNameComboBox.FormattingEnabled = true; + this.writeRegisterNameComboBox.Location = new System.Drawing.Point(300, 264); + this.writeRegisterNameComboBox.Name = "writeRegisterNameComboBox"; + this.writeRegisterNameComboBox.Size = new System.Drawing.Size(213, 21); + this.writeRegisterNameComboBox.TabIndex = 15; + // + // readRegisterNameComboBox + // + this.readRegisterNameComboBox.FormattingEnabled = true; + this.readRegisterNameComboBox.Location = new System.Drawing.Point(300, 230); + this.readRegisterNameComboBox.Name = "readRegisterNameComboBox"; + this.readRegisterNameComboBox.Size = new System.Drawing.Size(213, 21); + this.readRegisterNameComboBox.TabIndex = 14; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(224, 233); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(78, 13); + this.label4.TabIndex = 13; + this.label4.Text = "Register name:"; + // + // writeRegisterValueTextBox + // + this.writeRegisterValueTextBox.Location = new System.Drawing.Point(555, 264); + this.writeRegisterValueTextBox.Name = "writeRegisterValueTextBox"; + this.writeRegisterValueTextBox.Size = new System.Drawing.Size(117, 20); + this.writeRegisterValueTextBox.TabIndex = 12; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(517, 267); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(36, 13); + this.label3.TabIndex = 10; + this.label3.Text = "value:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(224, 267); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(78, 13); + this.label2.TabIndex = 9; + this.label2.Text = "Register name:"; + // + // writeRegisterButton + // + this.writeRegisterButton.Location = new System.Drawing.Point(15, 259); + this.writeRegisterButton.Name = "writeRegisterButton"; + this.writeRegisterButton.Size = new System.Drawing.Size(203, 28); + this.writeRegisterButton.TabIndex = 7; + this.writeRegisterButton.Text = "WriteRegister(slot, registerName, value)"; + this.writeRegisterButton.Click += new System.EventHandler(this.writeRegisterButton_Click); + // + // readRegisterButton + // + this.readRegisterButton.Location = new System.Drawing.Point(15, 225); + this.readRegisterButton.Name = "readRegisterButton"; + this.readRegisterButton.Size = new System.Drawing.Size(203, 28); + this.readRegisterButton.TabIndex = 6; + this.readRegisterButton.Text = "ReadRegister(slot, registerName)"; + this.readRegisterButton.Click += new System.EventHandler(this.readRegisterButton_Click); + // + // btnConnect + // + this.btnConnect.Location = new System.Drawing.Point(15, 158); + this.btnConnect.Name = "btnConnect"; + this.btnConnect.Size = new System.Drawing.Size(150, 28); + this.btnConnect.TabIndex = 3; + this.btnConnect.Text = "Connect(slot)"; + this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click); + // + // btnLogin + // + this.btnLogin.Location = new System.Drawing.Point(171, 158); + this.btnLogin.Name = "btnLogin"; + this.btnLogin.Size = new System.Drawing.Size(150, 28); + this.btnLogin.TabIndex = 17; + this.btnLogin.Text = "Login(slot)"; + this.btnLogin.Click += new System.EventHandler(this.btnLogin_Click); + // + // btnDisconnect + // + this.btnDisconnect.Location = new System.Drawing.Point(15, 191); + this.btnDisconnect.Name = "btnDisconnect"; + this.btnDisconnect.Size = new System.Drawing.Size(150, 28); + this.btnDisconnect.TabIndex = 4; + this.btnDisconnect.Text = "Disconnect(slot)"; + this.btnDisconnect.Click += new System.EventHandler(this.btnDisconnect_Click); + // + // btnGetPcbId + // + this.btnGetPcbId.Location = new System.Drawing.Point(15, 125); + this.btnGetPcbId.Name = "btnGetPcbId"; + this.btnGetPcbId.Size = new System.Drawing.Size(150, 28); + this.btnGetPcbId.TabIndex = 5; + this.btnGetPcbId.Text = "GetPcb(slot)"; + this.btnGetPcbId.Click += new System.EventHandler(this.btnGetPcbId_Click); + // + // btnInitSlot + // + this.btnInitSlot.Location = new System.Drawing.Point(15, 25); + this.btnInitSlot.Name = "btnInitSlot"; + this.btnInitSlot.Size = new System.Drawing.Size(150, 28); + this.btnInitSlot.TabIndex = 0; + this.btnInitSlot.Text = "InitSlot(slot)"; + this.btnInitSlot.Click += new System.EventHandler(this.btnInitSlot_Click); + // + // btnUpdateSlot + // + this.btnUpdateSlot.Location = new System.Drawing.Point(171, 25); + this.btnUpdateSlot.Name = "btnUpdateSlot"; + this.btnUpdateSlot.Size = new System.Drawing.Size(150, 28); + this.btnUpdateSlot.TabIndex = 16; + this.btnUpdateSlot.Text = "UpdateSlot(slot)"; + this.btnUpdateSlot.Click += new System.EventHandler(this.btnUpdateSlot_Click); + // + // btnGetSlot + // + this.btnGetSlot.Location = new System.Drawing.Point(15, 58); + this.btnGetSlot.Name = "btnGetSlot"; + this.btnGetSlot.Size = new System.Drawing.Size(150, 28); + this.btnGetSlot.TabIndex = 1; + this.btnGetSlot.Text = "GetSlot(slot)"; + this.btnGetSlot.Click += new System.EventHandler(this.btnGetSlot_Click); + // + // btnCleanSlots + // + this.btnCleanSlots.Location = new System.Drawing.Point(15, 91); + this.btnCleanSlots.Name = "btnCleanSlots"; + this.btnCleanSlots.Size = new System.Drawing.Size(150, 28); + this.btnCleanSlots.TabIndex = 2; + this.btnCleanSlots.Text = "CleanSlots()"; + this.btnCleanSlots.Click += new System.EventHandler(this.btnCleanSlots_Click); + // + // btnCancel + // + this.btnCancel.Enabled = false; + this.btnCancel.Location = new System.Drawing.Point(519, 320); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(180, 30); + this.btnCancel.TabIndex = 4; + this.btnCancel.Text = "Cancel task"; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // txtLog + // + this.txtLog.Location = new System.Drawing.Point(10, 356); + this.txtLog.Multiline = true; + this.txtLog.Name = "txtLog"; + this.txtLog.ReadOnly = true; + this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.txtLog.Size = new System.Drawing.Size(689, 232); + this.txtLog.TabIndex = 5; + this.txtLog.WordWrap = false; + // + // GenesisCordonelInterfaceView + // + this.Controls.Add(this.grpSlots); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.txtLog); + this.Name = "GenesisCordonelInterfaceView"; + this.Size = new System.Drawing.Size(719, 603); + this.grpSlots.ResumeLayout(false); + this.grpSlots.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + private System.Windows.Forms.Button btnConnect; + private System.Windows.Forms.Button btnDisconnect; + private System.Windows.Forms.Button btnGetPcbId; + private System.Windows.Forms.Button readRegisterButton; + private System.Windows.Forms.TextBox writeRegisterValueTextBox; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button writeRegisterButton; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox writeRegisterNameComboBox; + private System.Windows.Forms.ComboBox readRegisterNameComboBox; + private System.Windows.Forms.Button btnLogin; + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/GenesisCordonelInterfaceView.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/GenesisCordonelInterfaceView.cs new file mode 100644 index 000000000..e132d5a26 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/GenesisCordonelInterfaceView.cs @@ -0,0 +1,382 @@ +using GenesisCordonelInterface.API; +using GenesisCordonelInterface.UI; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using GciPublicModels = GenesisCordonelInterface.API.PublicModels; + +namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge +{ + public partial class GenesisCordonelInterfaceView : UserControl + { + private readonly GciBridge _bridge; + private readonly MainView _mainView; + private CancellationTokenSource _cts; + private readonly Action _addSlotAction; + private readonly Action _saveAction; + + public GenesisCordonelInterfaceView( + MainView mainview, + GciBridge bridge, + Action addSlotAction, + Action saveAction) + { + _mainView = mainview ?? throw new ArgumentNullException(nameof(mainview)); + _bridge = bridge ?? throw new ArgumentNullException(nameof(bridge)); + + _addSlotAction = addSlotAction; + _saveAction = saveAction; + + InitializeComponent(); + + LoadRegisterComboBoxes(); + } + + private void AddSlot() + { + _addSlotAction?.Invoke(); + } + + private void SaveSlots() + { + _saveAction?.Invoke(); + } + + private List GetSelectedSlots() + { + if (_mainView == null || _mainView._batchPanel == null) + throw new Exception("Meter batch grid is not available."); + + var slots = _mainView._batchPanel.GetSelectedGridData(); + + if (slots.Count == 0) + throw new Exception("No selected slots in grid."); + + return slots; + } + + private void RefreshGrid() + { + if (_bridge?.gciExternalInterface != null) + _bridge.gciExternalInterface.RaiseMeterBatchStatusChanged(); + } + + private GciPublicModels.GciInitSlotRequest CreateSlotRequest( + GciPublicModels.MeterBatchDebugStatus slot) + { + return new GciPublicModels.GciInitSlotRequest + { + SlotId = slot.Slot, + ConfigSource = GciPublicModels.GciConfigSource.InterfaceInputConfig, + PasswordSource = GciPublicModels.GciPasswordSource.InterfaceInputPassword, + RequestPort = GciPublicModels.CreatePortConfig( + slot.RequestPort, + slot.RequestPortType), + StreamingPort = GciPublicModels.CreatePortConfig( + slot.StreamingPort, + string.Empty) + }; + } + + private void btnInitSlot_Click(object sender, EventArgs e) + { + ExecuteAsync(async token => + { + var selectedSlots = _mainView._batchPanel.GetSelectedGridData(); + + if (selectedSlots.Count == 0) + { + int slotId = _mainView._batchPanel._gridManager.GetNextSlotId(); + + var request = new GciPublicModels.GciInitSlotRequest + { + SlotId = slotId, + ConfigSource = GciPublicModels.GciConfigSource.InterfaceInputConfig, + PasswordSource = GciPublicModels.GciPasswordSource.InterfaceInputPassword, + RequestPort = null, + StreamingPort = null + }; + + var result = await _bridge.InitSlotAsync(request); + + LogResult($"InitSlotAsync new slot {slotId}", result); + + RefreshGrid(); + return; + } + + foreach (var slot in selectedSlots) + { + var request = CreateSlotRequest(slot); + + var result = await _bridge.InitSlotAsync(request); + + LogResult($"InitSlotAsync slot {slot.Slot}", result); + } + + RefreshGrid(); + }); + } + + private void btnUpdateSlot_Click(object sender, EventArgs e) + { + ExecuteAsync(async token => + { + foreach (var slot in GetSelectedSlots()) + { + var request = CreateSlotRequest(slot); + + var result = await _bridge.UpdateSlotAsync(request); + + LogResult($"UpdateSlotAsync slot {slot.Slot}", result); + } + + RefreshGrid(); + }); + } + + private void btnGetSlot_Click(object sender, EventArgs e) + { + ExecuteAsync(async token => + { + foreach (var slot in GetSelectedSlots()) + { + var result = await _bridge.GetSlotAsync(slot.Slot); + + LogResult($"GetSlotAsync slot {slot.Slot}", result); + } + + RefreshGrid(); + }); + } + + private void btnCleanSlots_Click(object sender, EventArgs e) + { + ExecuteAsync(async token => + { + var result = await _bridge.CleanSlotsAsync(); + + LogResult("CleanSlotsAsync", result); + + RefreshGrid(); + }); + } + + private void btnGetPcbId_Click(object sender, EventArgs e) + { + ExecuteAsync(async token => + { + foreach (var slot in GetSelectedSlots()) + { + var result = await _bridge.GetPcbIdAsync(slot.Slot, token); + + LogResult($"GetPcbIdAsync slot {slot.Slot}", result); + } + + RefreshGrid(); + }); + } + + private void btnConnect_Click(object sender, EventArgs e) + { + ExecuteAsync(async token => + { + foreach (var slot in GetSelectedSlots()) + { + var result = await _bridge.ConnectAsync(slot.Slot, token); + + LogResult($"ConnectAsync slot {slot.Slot}", result); + } + + RefreshGrid(); + }); + } + + private void btnLogin_Click(object sender, EventArgs e) + { + ExecuteAsync(async token => + { + foreach (var slot in GetSelectedSlots()) + { + var result = await _bridge.LoginAsync(slot.Slot, token); + + LogResult($"LoginAsync slot {slot.Slot}", result); + } + + RefreshGrid(); + }); + } + + private void btnDisconnect_Click(object sender, EventArgs e) + { + ExecuteAsync(async token => + { + foreach (var slot in GetSelectedSlots()) + { + var result = await _bridge.DisconnectAsync(slot.Slot, token); + + LogResult($"DisconnectAsync slot {slot.Slot}", result); + } + + RefreshGrid(); + }); + } + + private void btnCancel_Click(object sender, EventArgs e) + { + _cts?.Cancel(); + Log("Cancel requested."); + } + + private async void ExecuteAsync(Func action) + { + try + { + SetBusy(true); + + _cts = new CancellationTokenSource(); + + await action(_cts.Token); + } + catch (OperationCanceledException) + { + Log("Operation canceled."); + } + catch (Exception ex) + { + Log("ERROR: " + ex); + + MessageBox.Show( + ex.Message, + "GciBridge API call failed", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + finally + { + _cts?.Dispose(); + _cts = null; + + SetBusy(false); + } + } + + private void SetBusy(bool busy) + { + Cursor = busy ? Cursors.WaitCursor : Cursors.Default; + + btnInitSlot.Enabled = !busy; + btnUpdateSlot.Enabled = !busy; + btnGetSlot.Enabled = !busy; + btnCleanSlots.Enabled = !busy; + btnGetPcbId.Enabled = !busy; + btnConnect.Enabled = !busy; + btnDisconnect.Enabled = !busy; + readRegisterButton.Enabled = !busy; + writeRegisterButton.Enabled = !busy; + readRegisterNameComboBox.Enabled = !busy; + writeRegisterNameComboBox.Enabled = !busy; + writeRegisterValueTextBox.Enabled = !busy; + btnLogin.Enabled = !busy; + + btnCancel.Enabled = busy; + } + + private void LogResult(string methodName, object result) + { + Log(methodName + " result:"); + Log(result == null ? "" : result.ToString()); + } + + private void Log(string message) + { + txtLog.AppendText( + DateTime.Now.ToString("HH:mm:ss.fff") + + " " + + message + + Environment.NewLine); + } + + private void readRegisterButton_Click(object sender, EventArgs e) + { + ExecuteAsync(async token => + { + string registerName = Convert.ToString(readRegisterNameComboBox.Text).Trim(); + + if (string.IsNullOrWhiteSpace(registerName)) + throw new Exception("Read register name is empty."); + + foreach (var slot in GetSelectedSlots()) + { + var result = await _bridge.ReadRegisterAsync( + slot.Slot, + registerName, + token); + + LogResult($"ReadRegisterAsync slot {slot.Slot}, register {registerName}", result); + } + + RefreshGrid(); + }); + } + + private void writeRegisterButton_Click(object sender, EventArgs e) + { + ExecuteAsync(async token => + { + string registerName = Convert.ToString(writeRegisterNameComboBox.Text).Trim(); + string valueText = writeRegisterValueTextBox.Text.Trim(); + + if (string.IsNullOrWhiteSpace(registerName)) + throw new Exception("Write register name is empty."); + + if (string.IsNullOrWhiteSpace(valueText)) + throw new Exception("Write register value is empty."); + + foreach (var slot in GetSelectedSlots()) + { + object value; + + if (registerName == "GENESISFLOW_LedMode") + { + value = byte.Parse(valueText); + } + else + { + value = valueText; + } + + var result = await _bridge.WriteRegisterAsync( + slot.Slot, + registerName, + value, + false, + false, + token); + + LogResult($"WriteRegisterAsync slot {slot.Slot}, register {registerName}, value {value}", result); + } + + RefreshGrid(); + }); + } + + private void LoadRegisterComboBoxes() + { + var registers = _bridge.GetAllRegisterNames(); + + readRegisterNameComboBox.Items.Clear(); + writeRegisterNameComboBox.Items.Clear(); + + readRegisterNameComboBox.Items.AddRange(registers.ToArray()); + writeRegisterNameComboBox.Items.AddRange(registers.ToArray()); + } + + private void grpSlots_Enter(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/GenesisCordonelInterfaceView.resx b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/GenesisCordonelInterfaceView.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/GenesisCordonelInterfaceView.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/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/UniDataStorageReaderInterfaceView.Designer.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/UniDataStorageReaderInterfaceView.Designer.cs new file mode 100644 index 000000000..86b0fdfc8 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/UniDataStorageReaderInterfaceView.Designer.cs @@ -0,0 +1,108 @@ +namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge +{ + partial class UniDataStorageReaderInterfaceView + { + private System.ComponentModel.IContainer components = null; + + private System.Windows.Forms.GroupBox grpStorage; + private System.Windows.Forms.Label lblPcbId; + private System.Windows.Forms.TextBox txtPcbId; + private System.Windows.Forms.Button btnGetPasswordByPcb; + + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.TextBox txtLog; + + protected override void Dispose(bool disposing) + { + if (disposing && components != null) + components.Dispose(); + + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.grpStorage = new System.Windows.Forms.GroupBox(); + this.lblPcbId = new System.Windows.Forms.Label(); + this.txtPcbId = new System.Windows.Forms.TextBox(); + this.btnGetPasswordByPcb = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.txtLog = new System.Windows.Forms.TextBox(); + this.grpStorage.SuspendLayout(); + this.SuspendLayout(); + // + // grpStorage + // + this.grpStorage.Controls.Add(this.lblPcbId); + this.grpStorage.Controls.Add(this.txtPcbId); + this.grpStorage.Controls.Add(this.btnGetPasswordByPcb); + this.grpStorage.Location = new System.Drawing.Point(10, 37); + this.grpStorage.Name = "grpStorage"; + this.grpStorage.Size = new System.Drawing.Size(200, 120); + this.grpStorage.TabIndex = 0; + this.grpStorage.TabStop = false; + this.grpStorage.Text = "UniDataStorageReader for GCI"; + // + // lblPcbId + // + this.lblPcbId.AutoSize = true; + this.lblPcbId.Location = new System.Drawing.Point(10, 25); + this.lblPcbId.Name = "lblPcbId"; + this.lblPcbId.Size = new System.Drawing.Size(45, 13); + this.lblPcbId.TabIndex = 0; + this.lblPcbId.Text = "PCB ID:"; + // + // txtPcbId + // + this.txtPcbId.Location = new System.Drawing.Point(65, 22); + this.txtPcbId.Name = "txtPcbId"; + this.txtPcbId.Size = new System.Drawing.Size(120, 20); + this.txtPcbId.TabIndex = 1; + // + // btnGetPasswordByPcb + // + this.btnGetPasswordByPcb.Location = new System.Drawing.Point(10, 55); + this.btnGetPasswordByPcb.Name = "btnGetPasswordByPcb"; + this.btnGetPasswordByPcb.Size = new System.Drawing.Size(175, 28); + this.btnGetPasswordByPcb.TabIndex = 2; + this.btnGetPasswordByPcb.Text = "Get password (by PCB)"; + this.btnGetPasswordByPcb.UseVisualStyleBackColor = true; + this.btnGetPasswordByPcb.Click += new System.EventHandler(this.btnGetPasswordByPcb_Click); + // + // btnCancel + // + this.btnCancel.Enabled = false; + this.btnCancel.Location = new System.Drawing.Point(10, 320); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(200, 30); + this.btnCancel.TabIndex = 3; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // txtLog + // + this.txtLog.Location = new System.Drawing.Point(220, 10); + this.txtLog.Multiline = true; + this.txtLog.Name = "txtLog"; + this.txtLog.ReadOnly = true; + this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.txtLog.Size = new System.Drawing.Size(500, 340); + this.txtLog.TabIndex = 4; + this.txtLog.WordWrap = false; + // + // UniDataStorageReaderInterfaceView + // + this.Controls.Add(this.grpStorage); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.txtLog); + this.Name = "UniDataStorageReaderInterfaceView"; + this.Size = new System.Drawing.Size(740, 370); + this.grpStorage.ResumeLayout(false); + this.grpStorage.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/UniDataStorageReaderInterfaceView.cs b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/UniDataStorageReaderInterfaceView.cs new file mode 100644 index 000000000..c667f6194 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/UniDataStorageReaderInterfaceView.cs @@ -0,0 +1,104 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace TBF.Rig.BridgeComponents.GciBridge.UI.StaraTuraAPI_GciBridge +{ + public partial class UniDataStorageReaderInterfaceView : UserControl + { + private readonly MainView _mainView; + private readonly GciBridge _bridge; + private CancellationTokenSource _cts; + + public UniDataStorageReaderInterfaceView(MainView mainView, GciBridge bridge) + { + _mainView = mainView ?? throw new ArgumentNullException(nameof(mainView)); + _bridge = bridge ?? throw new ArgumentNullException(nameof(bridge)); + + InitializeComponent(); + } + + private void btnGetPasswordByPcb_Click(object sender, EventArgs e) + { + ExecuteAsync(async token => + { + string pcbId = txtPcbId.Text.Trim(); + + if (string.IsNullOrWhiteSpace(pcbId)) + throw new Exception("PCB ID is empty."); + + var result = await _bridge.GetPasswordAsync(pcbId, token); + + LogResult("GetPasswordAsync PCB=" + pcbId, result); + }); + } + + private void btnCancel_Click(object sender, EventArgs e) + { + if (_cts != null) + _cts.Cancel(); + + Log("Cancel requested."); + } + + private async void ExecuteAsync(Func action) + { + try + { + SetBusy(true); + + _cts = new CancellationTokenSource(); + + await action(_cts.Token); + } + catch (OperationCanceledException) + { + Log("Operation canceled."); + } + catch (Exception ex) + { + Log("ERROR: " + ex); + + MessageBox.Show( + ex.Message, + "Storage API call failed", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + finally + { + if (_cts != null) + { + _cts.Dispose(); + _cts = null; + } + + SetBusy(false); + } + } + + private void SetBusy(bool busy) + { + Cursor = busy ? Cursors.WaitCursor : Cursors.Default; + + btnGetPasswordByPcb.Enabled = !busy; + btnCancel.Enabled = busy; + } + + private void LogResult(string methodName, object result) + { + Log(methodName + " result:"); + Log(result == null ? "" : result.ToString()); + } + + private void Log(string message) + { + txtLog.AppendText( + DateTime.Now.ToString("HH:mm:ss.fff") + + " " + + message + + Environment.NewLine); + } + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/UniDataStorageReaderInterfaceView.resx b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/UniDataStorageReaderInterfaceView.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/TBF/Rig/BridgeComponents/GciBridge/UI/StaraTuraAPI_GciBridge/UniDataStorageReaderInterfaceView.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/Rig/Input/DataStorage/UniDataStorageReader/Interfaces/DataQuery.cs b/TBF/Rig/Input/DataStorage/UniDataStorageReader/Interfaces/DataQuery.cs deleted file mode 100644 index 76d984c74..000000000 --- a/TBF/Rig/Input/DataStorage/UniDataStorageReader/Interfaces/DataQuery.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.Generic; - -namespace TBF.Rig.Input.DataStorage.UniDataStorageReader -{ - /// - /// Represents query input for data storage readers. - /// Each value is used to execute the same query template once. - /// A single-item list represents a single query. - /// - public class DataQuery - { - /// - /// Parameter values used for repeated execution of the same query template. - /// - public List QueryParams { get; } = new List(); - } -} \ No newline at end of file diff --git a/TBF/Rig/Input/DataStorage/UniDataStorageReader/Interfaces/IDataStorageReader.cs b/TBF/Rig/Input/DataStorage/UniDataStorageReader/Interfaces/IDataStorageReader.cs index 373d086c4..5e2fbe30d 100644 --- a/TBF/Rig/Input/DataStorage/UniDataStorageReader/Interfaces/IDataStorageReader.cs +++ b/TBF/Rig/Input/DataStorage/UniDataStorageReader/Interfaces/IDataStorageReader.cs @@ -8,7 +8,7 @@ namespace TBF.Rig.Input.DataStorage.UniDataStorageReader { public interface IDataStorageReader { - object GetData(DataQuery query); + object GetData(Interfaces.PublicModels.DataQuery query); ReaderDiagnosticResult TestSource(bool enableDiagnostics); diff --git a/TBF/Rig/Input/DataStorage/UniDataStorageReader/Interfaces/PublicModels.cs b/TBF/Rig/Input/DataStorage/UniDataStorageReader/Interfaces/PublicModels.cs new file mode 100644 index 000000000..f2d646547 --- /dev/null +++ b/TBF/Rig/Input/DataStorage/UniDataStorageReader/Interfaces/PublicModels.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; + +namespace TBF.Rig.Input.DataStorage.UniDataStorageReader.Interfaces +{ + /// + /// Public data contract layer for the UniDataStorageReader (UDSR). + /// + /// This class defines all Data Transfer Objects (DTOs) that are exposed + /// to external consumers (e.g. TBF, UI, or other integration layers). + /// + /// Responsibilities: + /// - Provide stable, dependency-free models for external usage + /// - Decouple internal GCI implementation (GenesisMeter, Xylem libraries) + /// from external systems + /// - Define request/response contracts for all supported operations + /// - Contain mapping methods between public DTOs and internal domain models + /// + /// Architecture: + /// External world (TBF / UI) + /// ↓ + /// GciPublicModels (this layer) + /// ↓ + /// Internal GCI API (InterfaceGCIToLaatzen, GenesisMeter, etc.) + /// + /// Notes: + /// - Public models must NOT expose internal types (e.g. GenesisMeter, IPort, etc.) + /// - All mapping between internal and external representations must be done here + /// - DTOs are designed to be simple, serializable, and stable over time + /// - Any change in internal implementation should not affect these models + /// + /// Pattern: + /// Each operation follows a consistent structure: + /// Request → Operation → Result + /// + /// Example: + /// GciInitSlotRequest → InitSlot → GciInitSlotResult + /// GetSlot → GciSlotInfo + /// GetPcbId → GciGetPcbIdResult + /// + /// This layer acts as a boundary between domain logic and integration logic. + /// + public class PublicModels + { + /// + /// Public DTOs exposed to external systems. + /// These models represent the contract of the GCI API. + /// They must remain stable and independent of internal implementation. + /// + #region ================================== PUBLIC MODELS =========================================== + + /// + /// Represents query input for data storage readers. + /// Each value is used to execute the same query template once. + /// A single-item list represents a single query. + /// + public class DataQuery + { + /// + /// Parameter values used for repeated execution of the same query template. + /// + public List QueryParams { get; } = new List(); + } + #endregion + } +} diff --git a/TBF/Rig/Input/DataStorage/UniDataStorageReader/Reader.cs b/TBF/Rig/Input/DataStorage/UniDataStorageReader/Reader.cs index 657780198..adab0bd5f 100644 --- a/TBF/Rig/Input/DataStorage/UniDataStorageReader/Reader.cs +++ b/TBF/Rig/Input/DataStorage/UniDataStorageReader/Reader.cs @@ -9,6 +9,7 @@ using TBF.Rig.Generic; using TBF.Rig.Input.DataStorage.UniDataStorageReader.Readers; using TBF.Rig.Scales.MettlerToledo; using static TBF.Rig.Input.DataStorage.UniDataStorageReader.ReaderCfg; +using System.Threading; namespace TBF.Rig.Input.DataStorage.UniDataStorageReader { @@ -40,7 +41,29 @@ namespace TBF.Rig.Input.DataStorage.UniDataStorageReader public IList Corrections { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public IList Uncertainties { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - public object GetDataFromStorageByParameter(DataQuery query) + private readonly SemaphoreSlim readLock = new SemaphoreSlim(1, 1); + + public async Task GetDataFromStorageByParameterAsync( + Interfaces.PublicModels.DataQuery query, + CancellationToken token = default) + { + if (query == null) + throw new ArgumentNullException(nameof(query)); + + await readLock.WaitAsync(token); + + try + { + return await Task.Run(() => + GetDataFromStorageByParameter(query), token); + } + finally + { + readLock.Release(); + } + } + + public object GetDataFromStorageByParameter(Interfaces.PublicModels.DataQuery query) { string storageType = (cfg.DataStorageType ?? string.Empty).Trim(); diff --git a/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/CsvReader .cs b/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/CsvReader .cs index 1c100837a..379abb596 100644 --- a/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/CsvReader .cs +++ b/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/CsvReader .cs @@ -25,7 +25,7 @@ namespace TBF.Rig.Input.DataStorage.UniDataStorageReader.Readers /// Reads data from CSV and returns matched row data. /// Executes the same query template for each value in DataQuery.QueryParams. /// - public object GetData(DataQuery query) + public object GetData(Interfaces.PublicModels.DataQuery query) { if (query == null) throw new ArgumentNullException(nameof(query)); @@ -151,7 +151,7 @@ namespace TBF.Rig.Input.DataStorage.UniDataStorageReader.Readers /// /// Executes the configured query for all provided parameter values. /// - private ReaderDiagnosticResult ExecuteQuery(DataQuery query, bool enableDiagnostics) + private ReaderDiagnosticResult ExecuteQuery(Interfaces.PublicModels.DataQuery query, bool enableDiagnostics) { ReaderDiagnosticResult result = new ReaderDiagnosticResult(); diff --git a/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/DatabaseReader .cs b/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/DatabaseReader .cs index 57fdaf946..51eee2dc0 100644 --- a/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/DatabaseReader .cs +++ b/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/DatabaseReader .cs @@ -134,7 +134,7 @@ namespace TBF.Rig.Input.DataStorage.UniDataStorageReader.Readers /// If query returns 1 column, scalar value is returned. /// If query returns multiple columns, Dictionary<string, object> is returned. /// - public object GetData(DataQuery query) + public object GetData(Interfaces.PublicModels.DataQuery query) { if (query == null) throw new ArgumentNullException(nameof(query)); @@ -231,7 +231,7 @@ namespace TBF.Rig.Input.DataStorage.UniDataStorageReader.Readers parameter.Value = queryValue ?? DBNull.Value; } - private static object ExtractQueryValue(DataQuery query) + private static object ExtractQueryValue(Interfaces.PublicModels.DataQuery query) { if (query == null) throw new ArgumentNullException(nameof(query)); diff --git a/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/JsonReader .cs b/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/JsonReader .cs index 10d327395..3528e2313 100644 --- a/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/JsonReader .cs +++ b/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/JsonReader .cs @@ -16,7 +16,7 @@ namespace TBF.Rig.Input.DataStorage.UniDataStorageReader.Readers this.cfg = cfg ?? throw new ArgumentNullException(nameof(cfg)); } - public object GetData(DataQuery query) + public object GetData(Interfaces.PublicModels.DataQuery query) { if (string.IsNullOrWhiteSpace(cfg.DataSource)) throw new InvalidOperationException("JSON data source is empty."); diff --git a/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/RestApiReader .cs b/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/RestApiReader .cs index 70bba9b38..40facd228 100644 --- a/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/RestApiReader .cs +++ b/TBF/Rig/Input/DataStorage/UniDataStorageReader/Readers/RestApiReader .cs @@ -15,7 +15,7 @@ namespace TBF.Rig.Input.DataStorage.UniDataStorageReader.Readers this.cfg = cfg ?? throw new ArgumentNullException(nameof(cfg)); } - public object GetData(DataQuery query) + public object GetData(Interfaces.PublicModels.DataQuery query) { if (string.IsNullOrWhiteSpace(cfg.DataSource)) throw new InvalidOperationException("REST API data source is empty."); diff --git a/TBF/Rig/Input/DataStorage/UniDataStorageReader/UI/ReaderCfgCtrl.cs b/TBF/Rig/Input/DataStorage/UniDataStorageReader/UI/ReaderCfgCtrl.cs index 24ba19efb..f4007edf5 100644 --- a/TBF/Rig/Input/DataStorage/UniDataStorageReader/UI/ReaderCfgCtrl.cs +++ b/TBF/Rig/Input/DataStorage/UniDataStorageReader/UI/ReaderCfgCtrl.cs @@ -215,7 +215,7 @@ namespace TBF.Rig.Input.DataStorage.UniDataStorageReader foreach (var value in batchQueryParamValues) { - DataQuery query = new DataQuery(); + Interfaces.PublicModels.DataQuery query = new Interfaces.PublicModels.DataQuery(); query.QueryParams.Add(value); object queryResult = reader.GetData(query); diff --git a/TBF/Rig/Sequences/iPerlCommunicationSeq.cs b/TBF/Rig/Sequences/iPerlCommunicationSeq.cs index abeaf74fc..497628ab8 100644 --- a/TBF/Rig/Sequences/iPerlCommunicationSeq.cs +++ b/TBF/Rig/Sequences/iPerlCommunicationSeq.cs @@ -421,7 +421,7 @@ namespace TBF.Rig.Sequences try { GetQ2PreCorrectionClient client = new GetQ2PreCorrectionClient(cfg.BaseUrl); - client.GetToken("ReadUser", "sensus", "https://deluh1web03.world.fluidtechnology.net/SensusCore/api/v1/Locations/1/Login2").Wait(); + client.GetToken("ReadUser", "sensus", "https://deluh1web03.world.fluidtechnology.net/SensusCore/_gciApi/v1/Locations/1/Login2").Wait(); Q2PreCorrection response = client.GetQ2Correction(string.Format(cfg.RelativeUrl, wmType)).Result; if (response != null && response.AreDataCalculated) { diff --git a/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationSeq.cs b/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationSeq.cs index 9f66b5df1..bc4881e13 100644 --- a/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationSeq.cs +++ b/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationSeq.cs @@ -431,7 +431,7 @@ namespace TBF.Rig.TestMethods.GenesisCommunication try { GetQ2PreCorrectionClient client = new GetQ2PreCorrectionClient(cfg.BaseUrl); - client.GetToken("ReadUser", "sensus", "https://deluh1web03.world.fluidtechnology.net/SensusCore/api/v1/Locations/1/Login2").Wait(); + client.GetToken("ReadUser", "sensus", "https://deluh1web03.world.fluidtechnology.net/SensusCore/_gciApi/v1/Locations/1/Login2").Wait(); Q2PreCorrection response = client.GetQ2Correction(string.Format(cfg.RelativeUrl, wmType)).Result; if (response != null && response.AreDataCalculated) { diff --git a/TBF/Rig/TestMethods/GenesisCommunication/GenesisHead/GenesisHead.cs b/TBF/Rig/TestMethods/GenesisCommunication/GenesisHead/GenesisHead.cs index dd9c12a02..a2ca147dd 100644 --- a/TBF/Rig/TestMethods/GenesisCommunication/GenesisHead/GenesisHead.cs +++ b/TBF/Rig/TestMethods/GenesisCommunication/GenesisHead/GenesisHead.cs @@ -262,12 +262,12 @@ namespace TBF.Rig.TestMethods.GenesisCommunication.GenesisHead //myGenesis.SetLogger(); - private, but called into basic constructor! myGenesis.SetupGenesisMeter( SlotNr, - new Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig.PortConfig() + new PortConfig() { Type = "Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.IrdaSerialPort", PortName =$"COM{HeadComPortNr}" }, - new Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig.PortConfig() + new PortConfig() { Type = "", PortName = $"COM{OptoComPortNr}" diff --git a/TBF/Rig/TestMethods/Q2CorrectionFromHistory/FromHistoryCfg.cs b/TBF/Rig/TestMethods/Q2CorrectionFromHistory/FromHistoryCfg.cs index 3ba84a5d2..f208fd44e 100644 --- a/TBF/Rig/TestMethods/Q2CorrectionFromHistory/FromHistoryCfg.cs +++ b/TBF/Rig/TestMethods/Q2CorrectionFromHistory/FromHistoryCfg.cs @@ -37,7 +37,7 @@ namespace TBF.Rig.TestMethods.Q2CorrectionFromHistory ParentName = string.Empty; UseWebService = false; - BaseUrl = "https://api-operations.pemek.sms-esaap.com/core/metrology/"; + BaseUrl = "https://_gciApi-operations.pemek.sms-esaap.com/core/metrology/"; RelativeUrl = "q2correction/Locations/4/Wztyp/{0}"; UseLocalDB = true; ProcedureName = "iPERL Smart Suez DN15 Q3_2.5 R800"; diff --git a/TBF/Rig/TestMethods/Q2CorrectionFromHistory/FromHistorySeq.cs b/TBF/Rig/TestMethods/Q2CorrectionFromHistory/FromHistorySeq.cs index 71b7faf15..1df080f8d 100644 --- a/TBF/Rig/TestMethods/Q2CorrectionFromHistory/FromHistorySeq.cs +++ b/TBF/Rig/TestMethods/Q2CorrectionFromHistory/FromHistorySeq.cs @@ -83,7 +83,7 @@ namespace TBF.Rig.TestMethods.Q2CorrectionFromHistory try { GetQ2PreCorrectionClient client = new GetQ2PreCorrectionClient(cfg.BaseUrl); - client.GetToken("ReadUser", "sensus", "https://deluh1web03.world.fluidtechnology.net/SensusCore/api/v1/Locations/1/Login2").Wait(); + client.GetToken("ReadUser", "sensus", "https://deluh1web03.world.fluidtechnology.net/SensusCore/_gciApi/v1/Locations/1/Login2").Wait(); Q2PreCorrection response = client.GetQ2Correction(cfg.RelativeUrl).Result; if (response != null && response.AreDataCalculated) { diff --git a/TBF/Rig/TestMethods/SmartMeterFlyingStartMassCollection/SmartCommunicationSeq.cs b/TBF/Rig/TestMethods/SmartMeterFlyingStartMassCollection/SmartCommunicationSeq.cs index 0379c3953..b6bece726 100644 --- a/TBF/Rig/TestMethods/SmartMeterFlyingStartMassCollection/SmartCommunicationSeq.cs +++ b/TBF/Rig/TestMethods/SmartMeterFlyingStartMassCollection/SmartCommunicationSeq.cs @@ -431,7 +431,7 @@ namespace TBF.Rig.TestMethods.SmartMeterFlyingStartMassCollection try { GetQ2PreCorrectionClient client = new GetQ2PreCorrectionClient(cfg.BaseUrl); - client.GetToken("ReadUser", "sensus", "https://deluh1web03.world.fluidtechnology.net/SensusCore/api/v1/Locations/1/Login2").Wait(); + client.GetToken("ReadUser", "sensus", "https://deluh1web03.world.fluidtechnology.net/SensusCore/_gciApi/v1/Locations/1/Login2").Wait(); Q2PreCorrection response = client.GetQ2Correction(string.Format(cfg.RelativeUrl, wmType)).Result; if (response != null && response.AreDataCalculated) { diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs index 81e64bfe4..4b07e5429 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs @@ -427,7 +427,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication try { GetQ2PreCorrectionClient client = new GetQ2PreCorrectionClient(cfg.BaseUrl); - client.GetToken("ReadUser", "sensus", "https://deluh1web03.world.fluidtechnology.net/SensusCore/api/v1/Locations/1/Login2").Wait(); + client.GetToken("ReadUser", "sensus", "https://deluh1web03.world.fluidtechnology.net/SensusCore/_gciApi/v1/Locations/1/Login2").Wait(); Q2PreCorrection response = client.GetQ2Correction(string.Format(cfg.RelativeUrl, wmType)).Result; if (response != null && response.AreDataCalculated) { diff --git a/TBF/TBF.csproj b/TBF/TBF.csproj index c08787237..a8a24d775 100644 --- a/TBF/TBF.csproj +++ b/TBF/TBF.csproj @@ -130,6 +130,9 @@ ..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll + + ..\packages\NLog.5.2.2\lib\net46\NLog.dll + False ..\packages\Oracle\Oracle.DataAccess.dll @@ -192,6 +195,10 @@ ..\packages\Common\Xylem.Common.Metrology.Measurements.dll + + False + ..\packages\Common\Xylem.Common.Utils.Logging.dll + @@ -216,6 +223,60 @@ GciBridgeCfgCtrl.cs + + + + UserControl + + + MeterBatchConfigPanel.cs + + + UserControl + + + WorkerDebugPanel.cs + + + + + + + Form + + + MainForm.cs + + + UserControl + + + MainView.cs + + + UserControl + + + UniDataStorageReaderInterfaceView.cs + + + UserControl + + + CombinedInterfaceView.cs + + + UserControl + + + ConfigurationView.cs + + + UserControl + + + GenesisCordonelInterfaceView.cs + @@ -738,7 +799,7 @@ - + @@ -3254,6 +3315,24 @@ GciBridgeCfgCtrl.cs + + MainForm.cs + + + MainView.cs + + + CombinedInterfaceView.cs + + + ConfigurationView.cs + + + UniDataStorageReaderInterfaceView.cs + + + GenesisCordonelInterfaceView.cs + PumpCfgCtrl.cs @@ -4230,6 +4309,9 @@ Always + + PreserveNewest + Designer diff --git a/TBF/app.config b/TBF/app.config index 531cdff89..83105fb32 100644 --- a/TBF/app.config +++ b/TBF/app.config @@ -1,46 +1,50 @@ - + -
+
- + - - + + - - - + + + - - + + - - + + - - + + - - + + + + + + - + diff --git a/TBF/nlog.config b/TBF/nlog.config new file mode 100644 index 000000000..b065c5314 --- /dev/null +++ b/TBF/nlog.config @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TBF/packages.config b/TBF/packages.config index b80e86cfe..1827c7b9e 100644 --- a/TBF/packages.config +++ b/TBF/packages.config @@ -3,9 +3,11 @@ + - + + @@ -13,5 +15,4 @@ - \ No newline at end of file diff --git a/UpgradeLog.htm b/UpgradeLog.htm new file mode 100644 index 000000000..828578629 --- /dev/null +++ b/UpgradeLog.htm @@ -0,0 +1,268 @@ + + + + Migration Report +

+ Migration Report -

\ No newline at end of file diff --git a/UpgradeLog2.htm b/UpgradeLog2.htm new file mode 100644 index 000000000..a8274ff39 --- /dev/null +++ b/UpgradeLog2.htm @@ -0,0 +1,268 @@ + + + + Migration Report +

+ Migration Report -

\ No newline at end of file diff --git a/packages/Common/Xylem.Common.CommonCore.Configuration.dll b/packages/Common/Xylem.Common.CommonCore.Configuration.dll index 0745c2d92..dd68a94aa 100644 Binary files a/packages/Common/Xylem.Common.CommonCore.Configuration.dll and b/packages/Common/Xylem.Common.CommonCore.Configuration.dll differ diff --git a/packages/Common/Xylem.Common.CommonCore.ThreadWatcher.dll b/packages/Common/Xylem.Common.CommonCore.ThreadWatcher.dll index 2b36e9e48..cafde6486 100644 Binary files a/packages/Common/Xylem.Common.CommonCore.ThreadWatcher.dll and b/packages/Common/Xylem.Common.CommonCore.ThreadWatcher.dll differ diff --git a/packages/Common/Xylem.Common.CommonCore.dll b/packages/Common/Xylem.Common.CommonCore.dll index e77241dfb..ac06e2b96 100644 Binary files a/packages/Common/Xylem.Common.CommonCore.dll and b/packages/Common/Xylem.Common.CommonCore.dll differ diff --git a/packages/Common/Xylem.Common.Hardware.Interfaces.Ports.PortCore.dll b/packages/Common/Xylem.Common.Hardware.Interfaces.Ports.PortCore.dll index 899923779..91577f6bf 100644 Binary files a/packages/Common/Xylem.Common.Hardware.Interfaces.Ports.PortCore.dll and b/packages/Common/Xylem.Common.Hardware.Interfaces.Ports.PortCore.dll differ diff --git a/packages/Common/Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.dll b/packages/Common/Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.dll index 12d12e4cc..f7810895b 100644 Binary files a/packages/Common/Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.dll and b/packages/Common/Xylem.Common.Hardware.Interfaces.Ports.SerialPorts.dll differ diff --git a/packages/Common/Xylem.Common.Hardware.Interfaces.Protocols.TransmitProtocol.dll b/packages/Common/Xylem.Common.Hardware.Interfaces.Protocols.TransmitProtocol.dll index b7f016c1c..1a01bc8a4 100644 Binary files a/packages/Common/Xylem.Common.Hardware.Interfaces.Protocols.TransmitProtocol.dll and b/packages/Common/Xylem.Common.Hardware.Interfaces.Protocols.TransmitProtocol.dll differ diff --git a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll index 014b5cefe..c2f4004b2 100644 Binary files a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll and b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Applications.dll differ diff --git a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.dll b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.dll index b5aa560b7..10895e3f6 100644 Binary files a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.dll and b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.dll differ diff --git a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig.dll b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig.dll index 95609dc42..c0ac0542a 100644 Binary files a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig.dll and b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig.dll differ diff --git a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll index 813bc47ac..fc2d4f76d 100644 Binary files a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll and b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll differ diff --git a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll index e7bd81a73..f15f3ed83 100644 Binary files a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll and b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll differ diff --git a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd.dll b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd.dll index fd96b8fe6..8bf4ebdac 100644 Binary files a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd.dll and b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd.dll differ diff --git a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.dll b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.dll index 6f0d3ffd7..f9857ca69 100644 Binary files a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.dll and b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.dll differ diff --git a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.dll b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.dll index e40134eef..e3af64124 100644 Binary files a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.dll and b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.dll differ diff --git a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Registers.dll b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Registers.dll index d2043f611..907cab855 100644 Binary files a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Registers.dll and b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.Registers.dll differ diff --git a/packages/Common/Xylem.Common.Hardware.WaterMeter.WaterMeterCore.dll b/packages/Common/Xylem.Common.Hardware.WaterMeter.WaterMeterCore.dll index fac7fcece..064e379e5 100644 Binary files a/packages/Common/Xylem.Common.Hardware.WaterMeter.WaterMeterCore.dll and b/packages/Common/Xylem.Common.Hardware.WaterMeter.WaterMeterCore.dll differ diff --git a/packages/Common/Xylem.Common.Hardware.WaterMeter.WaterMeterRegisters.dll b/packages/Common/Xylem.Common.Hardware.WaterMeter.WaterMeterRegisters.dll index 225a29b35..e3984c1d7 100644 Binary files a/packages/Common/Xylem.Common.Hardware.WaterMeter.WaterMeterRegisters.dll and b/packages/Common/Xylem.Common.Hardware.WaterMeter.WaterMeterRegisters.dll differ diff --git a/packages/Common/Xylem.Common.Logic.ProductionOrderCore.dll b/packages/Common/Xylem.Common.Logic.ProductionOrderCore.dll index 487acb707..727a02f6b 100644 Binary files a/packages/Common/Xylem.Common.Logic.ProductionOrderCore.dll and b/packages/Common/Xylem.Common.Logic.ProductionOrderCore.dll differ diff --git a/packages/Common/Xylem.Common.Logic.RelatePcb.dll b/packages/Common/Xylem.Common.Logic.RelatePcb.dll index cd1e8a73a..f64f03918 100644 Binary files a/packages/Common/Xylem.Common.Logic.RelatePcb.dll and b/packages/Common/Xylem.Common.Logic.RelatePcb.dll differ diff --git a/packages/Common/Xylem.Common.Logic.ServiceCore.dll b/packages/Common/Xylem.Common.Logic.ServiceCore.dll index 018413605..04a73e2fc 100644 Binary files a/packages/Common/Xylem.Common.Logic.ServiceCore.dll and b/packages/Common/Xylem.Common.Logic.ServiceCore.dll differ diff --git a/packages/Common/Xylem.Common.Logic.SoftwareAccessHelper.dll b/packages/Common/Xylem.Common.Logic.SoftwareAccessHelper.dll index 55eb7af3a..e626fe0ac 100644 Binary files a/packages/Common/Xylem.Common.Logic.SoftwareAccessHelper.dll and b/packages/Common/Xylem.Common.Logic.SoftwareAccessHelper.dll differ diff --git a/packages/Common/Xylem.Common.Metrology.Measurements.dll b/packages/Common/Xylem.Common.Metrology.Measurements.dll index e5aa5cbbb..5a9eec1a4 100644 Binary files a/packages/Common/Xylem.Common.Metrology.Measurements.dll and b/packages/Common/Xylem.Common.Metrology.Measurements.dll differ diff --git a/packages/Common/Xylem.Common.Utils.ByteArrayStyle.dll b/packages/Common/Xylem.Common.Utils.ByteArrayStyle.dll index 34cac033f..1bbc296b2 100644 Binary files a/packages/Common/Xylem.Common.Utils.ByteArrayStyle.dll and b/packages/Common/Xylem.Common.Utils.ByteArrayStyle.dll differ diff --git a/packages/Common/Xylem.Common.Utils.Crc16Ccitt.dll b/packages/Common/Xylem.Common.Utils.Crc16Ccitt.dll index a88a7a9fa..b2abafae4 100644 Binary files a/packages/Common/Xylem.Common.Utils.Crc16Ccitt.dll and b/packages/Common/Xylem.Common.Utils.Crc16Ccitt.dll differ diff --git a/packages/Common/Xylem.Common.Utils.Logging.dll b/packages/Common/Xylem.Common.Utils.Logging.dll index fb21d7da9..f71262870 100644 Binary files a/packages/Common/Xylem.Common.Utils.Logging.dll and b/packages/Common/Xylem.Common.Utils.Logging.dll differ diff --git a/packages/Common/Xylem.Common.Utils.Logging.pdb b/packages/Common/Xylem.Common.Utils.Logging.pdb deleted file mode 100644 index 1520bd936..000000000 Binary files a/packages/Common/Xylem.Common.Utils.Logging.pdb and /dev/null differ diff --git a/packages/Common/Xylem.Common.Utils.ProcessExec.dll b/packages/Common/Xylem.Common.Utils.ProcessExec.dll index 31359339f..6e67bfbe4 100644 Binary files a/packages/Common/Xylem.Common.Utils.ProcessExec.dll and b/packages/Common/Xylem.Common.Utils.ProcessExec.dll differ diff --git a/packages/Common/XylemCommonUiLegacyGenCtl.dll b/packages/Common/XylemCommonUiLegacyGenCtl.dll index ba978be90..90c6a770b 100644 Binary files a/packages/Common/XylemCommonUiLegacyGenCtl.dll and b/packages/Common/XylemCommonUiLegacyGenCtl.dll differ