123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- using System;
- using System.Linq;
- using TDMS.Common;
- using TDMS.Externals;
- namespace TDMS.Default
- {
- internal class TDMSChannelGroup : BaseTDMSLevel, ITDMSChannelGroup
- {
- public TDMSChannelGroup(IntPtr groupPtr)
- {
- _SelfPtr = groupPtr;
- PropertyOperator = new ChannelGroupPropertyOperator(groupPtr);
- SetNameAndDescription();
- }
- public ITDMSChannel AddChannel(TDMSDataType dataType,
- string channelName,
- string unit,
- string description = "")
- {
- var success = DDC.AddChannel(_SelfPtr, dataType, Tail(channelName), Tail(description), Tail(unit), out var channelPtr);
- if(success == (int)Error.NoError)
- return new TDMSChannel(channelPtr);
- throw new TDMSErrorException((int)success, "Failed to add channel.");
- }
- /// <inheritdoc />
- public ITDMSChannel? this[int index]
- {
- get
- {
- if(index < 0)
- throw new IndexOutOfRangeException($"Index[{index}] must be greater than or equal to 0");
- var count = (int)ChildCount;
- if(index >= count)
- throw new IndexOutOfRangeException($"Index[{index}] must be less than the number of channels");
- var channelsBuf = new IntPtr[count];
- var success = DDC.GetChannels(_SelfPtr, channelsBuf, (uint)count);
- if (success != Error.NoError) return null;
- var groupPtr = channelsBuf[index];
- return new TDMSChannel(groupPtr);
- }
- }
- /// <inheritdoc />
- public ITDMSChannel? this[string groupName]
- {
- get
- {
- if(string.IsNullOrEmpty(groupName))
- throw new ArgumentNullException(nameof(groupName), "Group name cannot be null or empty");
- var count = ChildCount;
- var channelsBuf = new IntPtr[count];
- var success = DDC.GetChannels(_SelfPtr, channelsBuf, (uint)count);
- if(success!= Error.NoError)return null;
- foreach (var intPtr in channelsBuf)
- {
- var group = new TDMSChannel(intPtr);
- if(group.Name == groupName)
- return group;
- group.Dispose();
- }
- return null;
- }
- }
- #region Implementation of ITDMSLevel
- /// <inheritdoc />
- public override bool Close()
- {
- if(!_IsClosed)
- {
- var success = DDC.CloseChannelGroup(_SelfPtr);
- }
- return _IsClosed = true;
- }
- /// <inheritdoc />
- public override ulong ChildCount => DDC.CountChannels(_SelfPtr, out var count) == 0 ? (ulong)count : 0;
- /// <inheritdoc />
- public override bool Clear()
- {
- var channelsBuf = new IntPtr[ChildCount];
- var success = DDC.GetChannels(_SelfPtr, channelsBuf, (uint)ChildCount);
- foreach (var ptr in channelsBuf)
- {
- success = DDC.RemoveChannel(ptr);
- }
- return success == 0;
- }
- /// <inheritdoc />
- public override bool Contains(string channelName)
- {
- if(string.IsNullOrEmpty(channelName))
- throw new ArgumentNullException(nameof(channelName), "Channel name cannot be null or empty");
- var count = ChildCount;
- if(count <= 0)
- return false;
- var channelsBuf = new IntPtr[count];
- var success = DDC.GetChannels(_SelfPtr, channelsBuf, (uint)count);
- if (success != Error.NoError) return false;
- foreach (var intPtr in channelsBuf)
- {
- using var channel = new TDMSChannel(intPtr);
- if(channel.Name == channelName)
- return true;
- }
- return false;
- }
- /// <inheritdoc />
- public override bool TryGetItem(string channelName, out ITDMSLevel level)
- {
- var has = Contains(channelName);
- if(has)
- {
- level = this[channelName];
- return true;
- }
- level = null;
- return false;
- }
- /// <inheritdoc />
- public override bool Remove(string channelName)
- {
- if(TryGetItem(channelName, out var channel)
- && channel is TDMSChannel @in)
- {
- var success = DDC.RemoveChannelGroup(@in.GetPtr());
- }
- return false;
- }
- /// <inheritdoc />
- public override bool RemoveAt(int index)
- {
- if(index < 0)
- throw new ArgumentOutOfRangeException(nameof(index), "Index must be greater than or equal to 0");
- if((ulong)index >= ChildCount)
- throw new ArgumentOutOfRangeException(nameof(index), "Index must be less than the number of channels");
- var channel = this[index];
- if(channel is TDMSChannel @in)
- {
- var success = DDC.RemoveChannel(@in.GetPtr());
- if (success != Error.NoError) return false;
- }
- return false;
- }
- #endregion
- }
- }
|