fix(drivers): ILoggerFactory on FOCAS+TwinCAT factories; replace stale TODO(v3 WaveC); AbCip browsePageDelayMs form field; document Device1 + Modbus health (#608 #602 #596)

Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
This commit is contained in:
Joseph Doherty
2026-10-08 06:53:38 -04:00
parent 3baa332d6b
commit 9c39f2b6c4
17 changed files with 192 additions and 50 deletions
@@ -224,9 +224,9 @@ public sealed class FocasDriver : IDriver, IReadable, IWritable, ITagDiscovery,
_driverInstanceId, entry.RawPath);
continue;
}
// TODO(v3 WaveC): the live device host must come from the tag's Device row's DeviceConfig
// (keyed by the RawPath's device segment). Until Wave C threads DeviceConfig through, recover
// the host by matching the entry's DeviceName against the configured Devices list.
// options.Devices already IS the per-device DeviceConfig (DriverDeviceConfigMerger rebuilds it at
// deploy time, one object per Device row with DeviceName = the RawPath device segment), so the
// host is recovered by DeviceName against that list.
var deviceHost = ResolveDeviceHost(entry.DeviceName);
if (deviceHost is null)
throw new InvalidOperationException(
@@ -382,11 +382,10 @@ public sealed class FocasDriver : IDriver, IReadable, IWritable, ITagDiscovery,
internal bool IsParsedAddressCached(string reference) =>
_parsedAddressesByTagName.ContainsKey(reference);
// TODO(v3 WaveC): the live device host must come from the tag's Device row's DeviceConfig (keyed by
// the RawPath's device segment). Until Wave C threads DeviceConfig through, recover the host by matching
// the RawTagEntry's DeviceName against the configured Devices list (by DeviceName, falling back to
// HostAddress; and, for a single-device driver, an empty DeviceName routes to the sole device). Returns
// null when no device matches — the caller fails the tag fast (Driver.FOCAS-003).
// Recovers the host by matching the RawTagEntry's DeviceName against the configured Devices list (which
// DriverDeviceConfigMerger fills from each Device row's DeviceConfig). By DeviceName, falling back to
// HostAddress (the Client CLI passes the host as the DeviceName); for a single-device driver an empty
// DeviceName routes to the sole device. Returns null when no device matches — the caller fails the tag fast (Driver.FOCAS-003).
private string? ResolveDeviceHost(string deviceName)
{
foreach (var d in _options.Devices)