ln.ethercat/ln.ethercat/SDOCache.cs

48 lines
1.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Reflection.Metadata;
using ln.collections;
namespace ln.ethercat
{
public class SDOCache
{
ECMaster ECMaster { get; }
Dictionary<int, BTree<long,SDO>> slaveCaches = new Dictionary<int, BTree<long, SDO>>();
public SDOCache(ECMaster ecMaster)
{
ECMaster = ecMaster;
}
public BTree<long,SDO> GetSlaveCache(int slave)
{
if (!slaveCaches.TryGetValue(slave, out BTree<long,SDO> slaveCache))
{
slaveCache = new BTree<long, SDO>();
slaveCaches.Add(slave, slaveCache);
}
return slaveCache;
}
public SDO GetOrCreateDescriptor(SDOAddr address)
{
BTree<long,SDO> 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];
}
}