|
|
|
@ -1,7 +1,7 @@
|
|
|
|
|
/*
|
|
|
|
|
* MmsVariableSpecification.cs
|
|
|
|
|
*
|
|
|
|
|
* Copyright 2014 Michael Zillgith
|
|
|
|
|
* Copyright 2014-2024 Michael Zillgith
|
|
|
|
|
*
|
|
|
|
|
* This file is part of libIEC61850.
|
|
|
|
|
*
|
|
|
|
@ -70,14 +70,14 @@ namespace IEC61850
|
|
|
|
|
/* only to prevent garbage collector to destroy parent element */
|
|
|
|
|
internal MmsVariableSpecification parent = null;
|
|
|
|
|
|
|
|
|
|
internal MmsVariableSpecification (IntPtr self, MmsVariableSpecification parent)
|
|
|
|
|
internal MmsVariableSpecification(IntPtr self, MmsVariableSpecification parent)
|
|
|
|
|
{
|
|
|
|
|
this.self = self;
|
|
|
|
|
this.responsableForDeletion = false;
|
|
|
|
|
this.parent = parent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal MmsVariableSpecification (IntPtr self, bool responsableForDeletion)
|
|
|
|
|
internal MmsVariableSpecification(IntPtr self, bool responsableForDeletion)
|
|
|
|
|
{
|
|
|
|
|
this.self = self;
|
|
|
|
|
this.responsableForDeletion = responsableForDeletion;
|
|
|
|
@ -104,7 +104,7 @@ namespace IEC61850
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
~MmsVariableSpecification ()
|
|
|
|
|
~MmsVariableSpecification()
|
|
|
|
|
{
|
|
|
|
|
if (responsableForDeletion)
|
|
|
|
|
MmsVariableSpecification_destroy(self);
|
|
|
|
@ -116,9 +116,17 @@ namespace IEC61850
|
|
|
|
|
/// <returns>
|
|
|
|
|
/// The MmsType of the variable
|
|
|
|
|
/// </returns>
|
|
|
|
|
public new MmsType GetType ()
|
|
|
|
|
public new MmsType GetType()
|
|
|
|
|
{
|
|
|
|
|
return (MmsType) MmsVariableSpecification_getType(self);
|
|
|
|
|
return (MmsType)MmsVariableSpecification_getType(self);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The MmsValue type of the variable
|
|
|
|
|
/// </summary>
|
|
|
|
|
public MmsType MmsType
|
|
|
|
|
{
|
|
|
|
|
get { return (MmsType)MmsVariableSpecification_getType(self); }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -128,14 +136,32 @@ namespace IEC61850
|
|
|
|
|
/// The array element type.
|
|
|
|
|
/// </returns>
|
|
|
|
|
/// <exception cref="MmsValueException">This exception is thrown if the value is not of type MMS_ARRAY</exception>
|
|
|
|
|
public MmsVariableSpecification getArrayElementType ()
|
|
|
|
|
public MmsVariableSpecification getArrayElementType()
|
|
|
|
|
{
|
|
|
|
|
if (GetType() == MmsType.MMS_ARRAY)
|
|
|
|
|
{
|
|
|
|
|
if (GetType() == MmsType.MMS_ARRAY) {
|
|
|
|
|
IntPtr varSpecPtr = MmsVariableSpecification.MmsVariableSpecification_getArrayElementSpecification(self);
|
|
|
|
|
return new MmsVariableSpecification(varSpecPtr, this);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
throw new MmsValueException ("specification is of wrong type");
|
|
|
|
|
throw new MmsValueException("specification is of wrong type");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The type of array elements (when the variable is of type MMS_ARRAY)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public MmsVariableSpecification ArrayElementType
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (GetType() == MmsType.MMS_ARRAY)
|
|
|
|
|
{
|
|
|
|
|
IntPtr varSpecPtr = MmsVariableSpecification.MmsVariableSpecification_getArrayElementSpecification(self);
|
|
|
|
|
return new MmsVariableSpecification(varSpecPtr, this);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -147,41 +173,86 @@ namespace IEC61850
|
|
|
|
|
/// <param name='index'>
|
|
|
|
|
/// Index.
|
|
|
|
|
/// </param>
|
|
|
|
|
public MmsVariableSpecification GetElement (int index)
|
|
|
|
|
public MmsVariableSpecification GetElement(int index)
|
|
|
|
|
{
|
|
|
|
|
if (GetType() == MmsType.MMS_STRUCTURE)
|
|
|
|
|
{
|
|
|
|
|
if (GetType () == MmsType.MMS_STRUCTURE) {
|
|
|
|
|
|
|
|
|
|
if ((index >= 0) && (index < Size ())) {
|
|
|
|
|
if ((index >= 0) && (index < Size()))
|
|
|
|
|
{
|
|
|
|
|
IntPtr varSpecPtr = MmsVariableSpecification_getChildSpecificationByIndex(self, index);
|
|
|
|
|
return new MmsVariableSpecification(varSpecPtr, this);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
throw new MmsValueException ("Index out of bounds");
|
|
|
|
|
throw new MmsValueException("Index out of bounds");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
throw new MmsValueException ("specification is of wrong type");
|
|
|
|
|
throw new MmsValueException("specification is of wrong type");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The element types for complex variables (MMS_STRUCTURE)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public MmsVariableSpecification[] Elements
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (GetType() != MmsType.MMS_STRUCTURE)
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
List<MmsVariableSpecification> elements = new List<MmsVariableSpecification>();
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < Size(); i++)
|
|
|
|
|
{
|
|
|
|
|
elements.Add(GetElement(i));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return elements.ToArray();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the name of the variable
|
|
|
|
|
/// Gets the name of the variable (relative to the parent)
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns>
|
|
|
|
|
/// The name.
|
|
|
|
|
/// </returns>
|
|
|
|
|
public string GetName ()
|
|
|
|
|
public string GetName()
|
|
|
|
|
{
|
|
|
|
|
IntPtr namePtr = MmsVariableSpecification_getName(self);
|
|
|
|
|
|
|
|
|
|
return Marshal.PtrToStringAnsi (namePtr);
|
|
|
|
|
return Marshal.PtrToStringAnsi(namePtr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The name of the variable (relative to the parent)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public string Name
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return GetName();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Get the "size" of the variable (array size, number of structure elements ...)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int Size ()
|
|
|
|
|
public int Size()
|
|
|
|
|
{
|
|
|
|
|
return MmsVariableSpecification_getSize(self);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The "size" of the variable (array size, number of structure elements ...)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int size
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return MmsVariableSpecification_getSize(self);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Determines whether the given value object matches this type
|
|
|
|
@ -193,9 +264,9 @@ namespace IEC61850
|
|
|
|
|
return MmsVariableSpecification_isValueOfType(self, value.valueReference);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IEnumerator IEnumerable.GetEnumerator ()
|
|
|
|
|
IEnumerator IEnumerable.GetEnumerator()
|
|
|
|
|
{
|
|
|
|
|
return new MmsVariableSpecificationEnumerator (this);
|
|
|
|
|
return new MmsVariableSpecificationEnumerator(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private class MmsVariableSpecificationEnumerator : IEnumerator
|
|
|
|
@ -203,27 +274,28 @@ namespace IEC61850
|
|
|
|
|
private MmsVariableSpecification value;
|
|
|
|
|
private int index = -1;
|
|
|
|
|
|
|
|
|
|
public MmsVariableSpecificationEnumerator (MmsVariableSpecification value)
|
|
|
|
|
public MmsVariableSpecificationEnumerator(MmsVariableSpecification value)
|
|
|
|
|
{
|
|
|
|
|
this.value = value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region IEnumerator Members
|
|
|
|
|
public void Reset ()
|
|
|
|
|
public void Reset()
|
|
|
|
|
{
|
|
|
|
|
index = -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public object Current {
|
|
|
|
|
public object Current
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
get { return value.GetElement (index);}
|
|
|
|
|
get { return value.GetElement(index); }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool MoveNext ()
|
|
|
|
|
public bool MoveNext()
|
|
|
|
|
{
|
|
|
|
|
index++;
|
|
|
|
|
|
|
|
|
|
if (index >= value.Size ())
|
|
|
|
|
if (index >= value.Size())
|
|
|
|
|
return false;
|
|
|
|
|
else
|
|
|
|
|
return true;
|
|
|
|
|