/// <summary> /// Encode payload data delta frame /// </summary> /// <param name="binaryEncoder"></param> private void EncodeMessageDataDeltaFrame(BinaryEncoder binaryEncoder) { // calculate the number of fields that will be written int fieldCount = DataSet.Fields.Count(f => f != null); // The field count is written for RadData encoding too unlike for KeyFrame message binaryEncoder.WriteUInt16("FieldCount", (UInt16)fieldCount); FieldTypeEncodingMask fieldType = (FieldTypeEncodingMask)(((byte)DataSetFlags1 & kFieldTypeUsedBits) >> 1); for (int i = 0; i < DataSet.Fields.Length; i++) { Field field = DataSet.Fields[i]; if (field == null) { continue; // ignore null fields } // write field index binaryEncoder.WriteUInt16("FieldIndex", (UInt16)i); switch (fieldType) { case FieldTypeEncodingMask.Variant: // 00 Variant type binaryEncoder.WriteVariant("FieldValue", field.Value.WrappedValue); break; case FieldTypeEncodingMask.DataValue: // 10 DataValue type binaryEncoder.WriteDataValue("FieldValue", field.Value); break; case FieldTypeEncodingMask.RawData: EncodeFieldAsRawData(binaryEncoder, field); break; case FieldTypeEncodingMask.Reserved: // ignore break; } } }
/// <summary> /// Encode payload data /// </summary> /// <param name="binaryEncoder"></param> private void EncodeMessageDataKeyFrame(BinaryEncoder binaryEncoder) { FieldTypeEncodingMask fieldType = (FieldTypeEncodingMask)(((byte)DataSetFlags1 & kFieldTypeUsedBits) >> 1); switch (fieldType) { case FieldTypeEncodingMask.Variant: binaryEncoder.WriteUInt16("DataSetFieldCount", (UInt16)DataSet.Fields.Length); foreach (Field field in DataSet.Fields) { // 00 Variant type binaryEncoder.WriteVariant("Variant", field.Value.WrappedValue); } break; case FieldTypeEncodingMask.DataValue: binaryEncoder.WriteUInt16("DataSetFieldCount", (UInt16)DataSet.Fields.Length); foreach (Field field in DataSet.Fields) { // 10 DataValue type binaryEncoder.WriteDataValue("DataValue", field.Value); } break; case FieldTypeEncodingMask.RawData: // DataSetFieldCount is not persisted for RawData foreach (Field field in DataSet.Fields) { EncodeFieldAsRawData(binaryEncoder, field); } break; case FieldTypeEncodingMask.Reserved: // ignore break; } }