using CliFx.Attributes; using CliFx.Infrastructure; using ZB.MOM.WW.OtOpcUa.Driver.Cli.Common; namespace ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Cli.Commands; /// /// Read one PCCC address (N7:0, F8:0, B3:0/3, L19:0, ST17:0, T4:0.ACC, etc.). /// [Command("read", Description = "Read a single PCCC file address.")] public sealed class ReadCommand : AbLegacyCommandBase { [CommandOption("address", 'a', Description = "PCCC file address. File letter implies storage; bit-within-word via slash " + "(B3:0/3 or N7:0/5). Sub-element access for timers/counters/controls uses " + "dot notation (T4:0.ACC, C5:0.PRE, R6:0.LEN).", IsRequired = true)] public string Address { get; init; } = default!; [CommandOption("type", 't', Description = "Bit / Int / Long / Float / AnalogInt / String / TimerElement / CounterElement / " + "ControlElement (default Int).")] public AbLegacyDataType DataType { get; init; } = AbLegacyDataType.Int; public override async ValueTask ExecuteAsync(IConsole console) { ConfigureLogging(); var ct = console.RegisterCancellationHandler(); var tagName = SynthesiseTagName(Address, DataType); var tag = new AbLegacyTagDefinition( Name: tagName, DeviceHostAddress: Gateway, Address: Address, DataType: DataType, Writable: false); var options = BuildOptions([tag]); await using var driver = new AbLegacyDriver(options, DriverInstanceId); try { await driver.InitializeAsync("{}", ct); var snapshot = await driver.ReadAsync([tagName], ct); await console.Output.WriteLineAsync(SnapshotFormatter.Format(Address, snapshot[0])); } finally { await driver.ShutdownAsync(CancellationToken.None); } } /// Tag-name key the driver uses internally. Address+type is already unique. internal static string SynthesiseTagName(string address, AbLegacyDataType type) => $"{address}:{type}"; }