//******************************************************************************************************
// DataFrameBase.cs - Gbtc
//
// Copyright © 2012, Grid Protection Alliance. All Rights Reserved.
//
// Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
// the NOTICE file distributed with this work for additional information regarding copyright ownership.
// The GPA licenses this file to you under the MIT License (MIT), the "License"; you may
// not use this file except in compliance with the License. You may obtain a copy of the License at:
//
// http://www.opensource.org/licenses/MIT
//
// Unless agreed to in writing, the subject software distributed under the License is distributed on an
// "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
// License for the specific language governing permissions and limitations.
//
// Code Modification History:
// ----------------------------------------------------------------------------------------------------
// 01/14/2005 - J. Ritchie Carroll
// Generated original version of source code.
// 09/15/2009 - Stephen C. Wills
// Added new header and license agreement.
// 10/5/2012 - Gavin E. Holden
// Added new header and license agreement.
// 12/17/2012 - Starlynn Danyelle Gilliam
// Modified Header.
//
//******************************************************************************************************
using System;
using System.Runtime.Serialization;
using GSF.TimeSeries;
namespace GSF.PhasorProtocols
{
///
/// Represents the protocol independent common implementation of any that can be sent or received.
///
[Serializable]
public abstract class DataFrameBase : ChannelFrameBase, IDataFrame
{
#region [ Members ]
// Fields
private IConfigurationFrame m_configurationFrame;
#endregion
#region [ Constructors ]
///
/// Creates a new from specified parameters.
///
/// The reference to the collection of cells for this .
/// The exact timestamp, in , of the data represented by this .
/// The associated with this .
protected DataFrameBase(DataCellCollection cells, Ticks timestamp, IConfigurationFrame configurationFrame)
: base(0, cells, timestamp)
{
m_configurationFrame = configurationFrame;
}
///
/// Creates a new from serialization parameters.
///
/// The with populated with data.
/// The source for this deserialization.
protected DataFrameBase(SerializationInfo info, StreamingContext context)
: base(info, context)
{
// Deserialize data frame
m_configurationFrame = (IConfigurationFrame)info.GetValue("configurationFrame", typeof(IConfigurationFrame));
}
#endregion
#region [ Properties ]
///
/// Gets the for this .
///
public override FundamentalFrameType FrameType => FundamentalFrameType.DataFrame;
///
/// Gets or sets associated with this .
///
public virtual IConfigurationFrame ConfigurationFrame
{
get => m_configurationFrame;
set => m_configurationFrame = value;
}
///
/// Gets reference to the for this .
///
public new virtual DataCellCollection Cells => base.Cells as DataCellCollection;
///
/// Gets or sets the parsing state for the this .
///
public new virtual IDataFrameParsingState State
{
get => base.State as IDataFrameParsingState;
set => base.State = value;
}
///
/// Gets or sets protocol specific quality flags for this .
///
public virtual uint QualityFlags { get; set; }
///
/// Gets the numeric ID code for this .
///
///
/// This value is read-only for ; assigning a value will throw an exception. Value returned
/// is the of the associated .
///
/// IDCode of a data frame is read-only, change IDCode in associated configuration frame instead.
public override ushort IDCode
{
get => m_configurationFrame?.IDCode ?? 0;
set => throw new NotSupportedException("IDCode of a data frame is read-only, change IDCode in associated configuration frame instead");
}
#endregion
#region [ Methods ]
///
/// Parses the binary image.
///
/// Binary image to parse.
/// Start index into to begin parsing.
/// Length of valid data within .
/// The length of the data that was parsed.
///
/// This method is overridden to ensure assignment of configuration frame.
///
public override int ParseBinaryImage(byte[] buffer, int startIndex, int length)
{
// Make sure configuration frame gets assigned before parsing begins...
IDataFrameParsingState state = State;
IConfigurationFrame configurationFrame = state.ConfigurationFrame;
if (configurationFrame is null)
return state.ParsedBinaryLength;
ConfigurationFrame = configurationFrame;
// Handle normal parsing
return base.ParseBinaryImage(buffer, startIndex, length);
}
///
/// Populates a with the data needed to serialize the target object.
///
/// The to populate with data.
/// The destination for this serialization.
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
// Serialize data frame
info.AddValue("configurationFrame", m_configurationFrame, typeof(IConfigurationFrame));
}
// Gets the quality flags of the data frame as a measurement value.
IMeasurement IDataFrame.GetQualityFlagsMeasurement()
{
return new Measurement()
{
Timestamp = Timestamp,
Value = QualityFlags
};
}
#endregion
}
}