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."); } /// 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); } } /// 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 /// public override bool Close() { if(!_IsClosed) { var success = DDC.CloseChannelGroup(_SelfPtr); } return _IsClosed = true; } /// public override ulong ChildCount => DDC.CountChannels(_SelfPtr, out var count) == 0 ? (ulong)count : 0; /// 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; } /// 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; } /// public override bool TryGetItem(string channelName, out ITDMSLevel level) { var has = Contains(channelName); if(has) { level = this[channelName]; return true; } level = null; return false; } /// public override bool Remove(string channelName) { if(TryGetItem(channelName, out var channel) && channel is TDMSChannel @in) { var success = DDC.RemoveChannelGroup(@in.GetPtr()); } return false; } /// 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 } }