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
}
}