/// <summary> /// Creates a new <see cref="DataCellBase"/> from serialization parameters. /// </summary> /// <param name="info">The <see cref="SerializationInfo"/> with populated with data.</param> /// <param name="context">The source <see cref="StreamingContext"/> for this deserialization.</param> protected DataCellBase(SerializationInfo info, StreamingContext context) : base(info, context) { // Deserialize data cell values m_configurationCell = (IConfigurationCell)info.GetValue("configurationCell", typeof(IConfigurationCell)); m_statusFlags = info.GetUInt16("statusFlags"); m_phasorValues = (PhasorValueCollection)info.GetValue("phasorValues", typeof(PhasorValueCollection)); m_frequencyValue = (IFrequencyValue)info.GetValue("frequencyValue", typeof(IFrequencyValue)); m_analogValues = (AnalogValueCollection)info.GetValue("analogValues", typeof(AnalogValueCollection)); m_digitalValues = (DigitalValueCollection)info.GetValue("digitalValues", typeof(DigitalValueCollection)); m_statusAssigned = true; }
/// <summary> /// Parses the binary body image. /// </summary> /// <param name="buffer">Binary image to parse.</param> /// <param name="startIndex">Start index into <paramref name="buffer"/> to begin parsing.</param> /// <param name="length">Length of valid data within <paramref name="buffer"/>.</param> /// <returns>The length of the data that was parsed.</returns> protected override int ParseBodyImage(byte[] buffer, int startIndex, int length) { // Length is validated at a frame level well in advance so that low level parsing routines do not have // to re-validate that enough length is available to parse needed information as an optimization... IDataCellParsingState parsingState = State; IPhasorValue phasorValue; IAnalogValue analogValue; IDigitalValue digitalValue; int x, parsedLength, index = startIndex; StatusFlags = BigEndian.ToUInt16(buffer, startIndex); index += 2; // By the very nature of the major phasor protocols supporting the same order of phasors, frequency, df/dt, analog and digitals // we are able to "automatically" parse this data out in the data cell base class - BEAUTIFUL!!! // Parse out phasor values for (x = 0; x < parsingState.PhasorCount; x++) { phasorValue = parsingState.CreateNewPhasorValue(this, m_configurationCell.PhasorDefinitions[x], buffer, index, out parsedLength); m_phasorValues.Add(phasorValue); index += parsedLength; } // Parse out frequency and dF/dt values m_frequencyValue = parsingState.CreateNewFrequencyValue(this, m_configurationCell.FrequencyDefinition, buffer, index, out parsedLength); index += parsedLength; // Parse out analog values for (x = 0; x < parsingState.AnalogCount; x++) { analogValue = parsingState.CreateNewAnalogValue(this, m_configurationCell.AnalogDefinitions[x], buffer, index, out parsedLength); m_analogValues.Add(analogValue); index += parsedLength; } // Parse out digital values for (x = 0; x < parsingState.DigitalCount; x++) { digitalValue = parsingState.CreateNewDigitalValue(this, m_configurationCell.DigitalDefinitions[x], buffer, index, out parsedLength); m_digitalValues.Add(digitalValue); index += parsedLength; } // Return total parsed length return(index - startIndex); }
/// <summary> /// Parses the binary body image. /// </summary> /// <param name="buffer">Binary image to parse.</param> /// <param name="startIndex">Start index into <paramref name="buffer"/> to begin parsing.</param> /// <param name="length">Length of valid data within <paramref name="buffer"/>.</param> /// <returns>The length of the data that was parsed.</returns> protected override int ParseBodyImage(byte[] buffer, int startIndex, int length) { // Length is validated at a frame level well in advance so that low level parsing routines do not have // to re-validate that enough length is available to parse needed information as an optimization... IDataCellParsingState parsingState = State; IPhasorValue phasorValue; IAnalogValue analogValue; IDigitalValue digitalValue; int x, parsedLength, index = startIndex; StatusFlags = BigEndian.ToUInt16(buffer, startIndex); index += 2; // By the very nature of the major phasor protocols supporting the same order of phasors, frequency, df/dt, analog and digitals // we are able to "automatically" parse this data out in the data cell base class - BEAUTIFUL!!! // Parse out phasor values for (x = 0; x < parsingState.PhasorCount; x++) { phasorValue = parsingState.CreateNewPhasorValue(this, m_configurationCell.PhasorDefinitions[x], buffer, index, out parsedLength); m_phasorValues.Add(phasorValue); index += parsedLength; } // Parse out frequency and dF/dt values m_frequencyValue = parsingState.CreateNewFrequencyValue(this, m_configurationCell.FrequencyDefinition, buffer, index, out parsedLength); index += parsedLength; // Parse out analog values for (x = 0; x < parsingState.AnalogCount; x++) { analogValue = parsingState.CreateNewAnalogValue(this, m_configurationCell.AnalogDefinitions[x], buffer, index, out parsedLength); m_analogValues.Add(analogValue); index += parsedLength; } // Parse out digital values for (x = 0; x < parsingState.DigitalCount; x++) { digitalValue = parsingState.CreateNewDigitalValue(this, m_configurationCell.DigitalDefinitions[x], buffer, index, out parsedLength); m_digitalValues.Add(digitalValue); index += parsedLength; } // Return total parsed length return (index - startIndex); }