using System; using System.Collections.Generic; using System.Reflection.Metadata; using ln.collections; namespace ln.ethercat { public class SDOCache { ECMaster ECMaster { get; } Dictionary> slaveCaches = new Dictionary>(); public SDOCache(ECMaster ecMaster) { ECMaster = ecMaster; } public BTree GetSlaveCache(int slave) { if (!slaveCaches.TryGetValue(slave, out BTree slaveCache)) { slaveCache = new BTree(); slaveCaches.Add(slave, slaveCache); } return slaveCache; } public SDO GetOrCreateDescriptor(SDOAddr address) { BTree slaveCache = GetSlaveCache(address.Slave); if (!slaveCache.TryGet(address.Linear, out SDO sdo)) { sdo = SDO.Create(ECMaster, address); slaveCache.Add(sdo.Address.Linear, sdo); } return sdo; } public void Clear() => slaveCaches.Clear(); public bool Contains(SDOAddr addr) => GetSlaveCache(addr.Slave).ContainsKey(addr); public SDO this[SDOAddr address] => GetSlaveCache(address.Slave)[address.Linear]; } }