48 lines
1.3 KiB
C#
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];
|
|
|
|
}
|
|
} |