| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using System.Threading; |
| | | using WIDESEAWCS_S7Simulator.Core.Interfaces; |
| | | |
| | | namespace WIDESEAWCS_S7Simulator.Core.Memory |
| | | { |
| | | /// <summary> |
| | | /// å
ååºååºç±» |
| | | /// </summary> |
| | | public abstract class MemoryRegion : IMemoryRegion |
| | | { |
| | | /// <summary> |
| | | /// å
åæ°æ® |
| | | /// </summary> |
| | | protected readonly byte[] _memory; |
| | | |
| | | /// <summary> |
| | | /// 读åéï¼æ¯æå¹¶å访é®ï¼ |
| | | /// </summary> |
| | | protected readonly ReaderWriterLockSlim _lock; |
| | | |
| | | /// <summary> |
| | | /// åºåç±»å |
| | | /// </summary> |
| | | public abstract string RegionType { get; } |
| | | |
| | | /// <summary> |
| | | /// åºå大å°ï¼åèï¼ |
| | | /// </summary> |
| | | public int Size { get; } |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | /// <param name="size">åºå大å°</param> |
| | | protected MemoryRegion(int size) |
| | | { |
| | | Size = size; |
| | | _memory = new byte[size]; |
| | | _lock = new ReaderWriterLockSlim(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 读ååèæ°æ® |
| | | /// </summary> |
| | | public virtual byte[] Read(ushort offset, ushort length) |
| | | { |
| | | _lock.EnterReadLock(); |
| | | try |
| | | { |
| | | if (offset + length > Size) |
| | | throw new ArgumentOutOfRangeException( |
| | | $"读åè¶
åº{RegionType}åºèå´: offset={offset}, length={length}, size={Size}"); |
| | | |
| | | byte[] result = new byte[length]; |
| | | Array.Copy(_memory, offset, result, 0, length); |
| | | return result; |
| | | } |
| | | finally |
| | | { |
| | | _lock.ExitReadLock(); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åå
¥åèæ°æ® |
| | | /// </summary> |
| | | public virtual void Write(ushort offset, byte[] data) |
| | | { |
| | | _lock.EnterWriteLock(); |
| | | try |
| | | { |
| | | if (offset + data.Length > Size) |
| | | throw new ArgumentOutOfRangeException( |
| | | $"åå
¥è¶
åº{RegionType}åºèå´: offset={offset}, length={data.Length}, size={Size}"); |
| | | |
| | | Array.Copy(data, 0, _memory, offset, data.Length); |
| | | } |
| | | finally |
| | | { |
| | | _lock.ExitWriteLock(); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¸
空åºå |
| | | /// </summary> |
| | | public virtual void Clear() |
| | | { |
| | | _lock.EnterWriteLock(); |
| | | try |
| | | { |
| | | Array.Clear(_memory, 0, Size); |
| | | } |
| | | finally |
| | | { |
| | | _lock.ExitWriteLock(); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éæ¾èµæº |
| | | /// </summary> |
| | | public virtual void Dispose() |
| | | { |
| | | _lock?.Dispose(); |
| | | } |
| | | } |
| | | } |