using System.Collections.Concurrent; namespace ETTerms.PduMcp; /// /// Process-wide registry of connected PDUs, keyed by IP. The MCP server is long-lived, /// so connections established by pdu_connect persist across tool calls. /// public sealed class PduRegistry { public static readonly PduRegistry Instance = new(); /// iPoMan II/III outlet count. public const int PortCount = 12; private readonly ConcurrentDictionary _pdus = new(StringComparer.OrdinalIgnoreCase); public PduController GetOrAdd(string ip) => _pdus.GetOrAdd(ip.Trim(), static k => new PduController(k)); public bool TryGet(string ip, out PduController pdu) => _pdus.TryGetValue(ip.Trim(), out pdu!); public bool Remove(string ip) { if (_pdus.TryRemove(ip.Trim(), out var pdu)) { pdu.Dispose(); return true; } return false; } public IReadOnlyCollection ConnectedIps => _pdus.Keys.ToArray(); }