//****************************************************************************************************** // ConfigurationFrame.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: // ---------------------------------------------------------------------------------------------------- // 02/08/2007 - J. Ritchie Carroll & Jian Ryan Zuo // Generated original version of source code. // 08/07/2009 - Josh L. Patterson // Edited Comments. // 09/15/2009 - Stephen C. Wills // Added new header and license agreement. // 12/17/2012 - Starlynn Danyelle Gilliam // Modified Header. // //****************************************************************************************************** using System; using System.Runtime.Serialization; using GSF.Units.EE; namespace GSF.PhasorProtocols.FNET { /// /// Represents the F-NET implementation of a that can be sent or received. /// [Serializable] public class ConfigurationFrame : ConfigurationFrameBase { #region [ Constructors ] /// /// Creates a new from specified parameters. /// /// The ID code of this . /// The exact timestamp, in , of the data represented by this . /// The defined frame rate of this . /// The nominal of this . /// The time offset of F-NET device in . /// The station name of the F-NET device. /// /// This constructor is used by a consumer to generate an F-NET configuration frame. /// public ConfigurationFrame(ushort idCode, Ticks timestamp, ushort frameRate, LineFrequency nominalFrequency, Ticks timeOffset, string stationName) : base(idCode, new ConfigurationCellCollection(), timestamp, frameRate) { ConfigurationCell configCell = new(this, nominalFrequency, timeOffset); // FNet protocol sends data for one device Cells.Add(configCell); // Assign station name configCell.StationName = string.IsNullOrEmpty(stationName) ? $"F-NET Unit-{idCode}" : stationName; // Add a single frequency definition configCell.FrequencyDefinition = new FrequencyDefinition(configCell, "Line frequency"); // Add a single phasor definition configCell.PhasorDefinitions.Add(new PhasorDefinition(configCell, "120V Phasor", PhasorType.Voltage, null)); } /// /// Creates a new from serialization parameters. /// /// The with populated with data. /// The source for this deserialization. protected ConfigurationFrame(SerializationInfo info, StreamingContext context) : base(info, context) { } #endregion #region [ Properties ] /// /// Gets reference to the for this . /// public new ConfigurationCellCollection Cells => base.Cells as ConfigurationCellCollection; /// /// Gets or sets the nominal of this . /// public LineFrequency NominalFrequency { // Since F-NET only supports a single device there will only be one cell, so we just share this value // with our only child and expose the value at the parent level for convenience get => Cells[0].NominalFrequency; set => Cells[0].NominalFrequency = value; } /// /// Gets or sets the time offset of F-NET device in . /// /// /// F-NET devices normally report time in 11 seconds past real-time, this property defines the offset for this artificial delay. /// Note that the parameter value is in ticks to allow a very high-resolution offset; 1 second = 10,000,000 ticks. /// public Ticks TimeOffset { // Since F-NET only supports a single device there will only be one cell, so we just share this value // with our only child and expose the value at the parent level for convenience get => Cells[0].TimeOffset; set => Cells[0].TimeOffset = value; } /// /// Gets or sets the longitude (i.e., East/West geospatial position) of the device. /// public double Longitude { // Since F-NET only supports a single device there will only be one cell, so we just share this value // with our only child and expose the value at the parent level for convenience get => Cells[0].Longitude; set => Cells[0].Longitude = value; } /// /// Gets or sets the latitude (i.e., North/South geospatial position) of the device. /// public double Latitude { // Since F-NET only supports a single device there will only be one cell, so we just share this value // with our only child and expose the value at the parent level for convenience get => Cells[0].Latitude; set => Cells[0].Latitude = value; } /// /// Gets or sets the number of satellites visible to the GPS timing source of the device. /// public int NumberOfSatellites { // Since F-NET only supports a single device there will only be one cell, so we just share this value // with our only child and expose the value at the parent level for convenience get => Cells[0].NumberOfSatellites; set => Cells[0].NumberOfSatellites = value; } #endregion #region [ Methods ] /// /// Determines if checksum in the is valid. /// /// Buffer image to validate. /// Start index into to perform checksum. /// Flag that determines if checksum over is valid. /// /// F-NET doesn't use checksums - this always returns true. /// protected override bool ChecksumIsValid(byte[] buffer, int startIndex) { return true; } /// /// Method is not implemented. /// /// F-NET doesn't use checksums. /// An . /// A array. /// An for the offset. /// An for the length. protected override ushort CalculateChecksum(byte[] buffer, int offset, int length) { throw new NotImplementedException(); } #endregion } }