in src/Azure.IIoT.OpcUa/src/Encoders/PubSub/MonitoredItemMessage.cs [85:205]
internal override void Encode(JsonEncoderEx encoder, string? publisherId, bool withHeader,
string? property)
{
//
// If not writing with samples header or writing to a property we fail. This is a
// configuration error, rather than throwing constantly we just do not emit anything
// instead.
//
if (!withHeader || property != null)
{
return;
}
if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.NodeId))
{
encoder.WriteString(nameof(NodeId), NodeId);
}
if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.EndpointUrl))
{
encoder.WriteString(nameof(EndpointUrl), EndpointUrl);
}
if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ApplicationUri))
{
encoder.WriteString(nameof(ApplicationUri), ApplicationUri);
}
if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.DisplayName) &&
!string.IsNullOrEmpty(DisplayName))
{
encoder.WriteString(nameof(DisplayName), DisplayName);
}
if (DataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.Timestamp))
{
encoder.WriteDateTime(nameof(Timestamp), Timestamp?.UtcDateTime ?? default);
}
var valuePayload = Value;
if (DataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.Status))
{
var status = Status;
if (status == null)
{
status = valuePayload != null ?
Opc.Ua.StatusCode.IsNotGood(valuePayload.StatusCode) ?
valuePayload.StatusCode : Opc.Ua.StatusCodes.Good :
(Opc.Ua.StatusCode?)Opc.Ua.StatusCodes.BadNoData;
}
encoder.WriteString(nameof(Status), status.Value.AsString());
}
// Create a copy of the data value and update the timestamps and status
var value = new Opc.Ua.DataValue(valuePayload?.WrappedValue ?? Opc.Ua.Variant.Null);
if (DataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.Status) ||
Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.StatusCode))
{
value.StatusCode = valuePayload?.StatusCode ?? Opc.Ua.StatusCodes.BadNoData;
}
if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.SourceTimestamp))
{
value.SourceTimestamp = valuePayload?.SourceTimestamp ?? DateTime.MinValue;
if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.SourcePicoSeconds))
{
value.SourcePicoseconds = valuePayload?.SourcePicoseconds ?? 0;
}
}
if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ServerTimestamp))
{
value.ServerTimestamp = valuePayload?.ServerTimestamp ?? DateTime.MinValue;
if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ServerPicoSeconds))
{
value.ServerPicoseconds = valuePayload?.ServerPicoseconds ?? 0;
}
}
var reversibleMode = encoder.UseReversibleEncoding;
try
{
encoder.UseReversibleEncoding =
DataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.ReversibleFieldEncoding);
encoder.WriteDataValue(nameof(Value), value);
}
finally
{
encoder.UseReversibleEncoding = reversibleMode;
}
if (DataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.SequenceNumber))
{
encoder.WriteUInt32(nameof(SequenceNumber), SequenceNumber);
}
if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ExtensionFields))
{
var extensionFields = (nameof(DataSetWriterId), DataSetWriterName)
.YieldReturn();
if (publisherId != null)
{
extensionFields = extensionFields
.Append((nameof(JsonNetworkMessage.PublisherId), publisherId));
}
if (WriterGroupId != null)
{
extensionFields = extensionFields
.Append((nameof(WriterGroupId), WriterGroupId));
}
if (ExtensionFields != null)
{
extensionFields = extensionFields.Concat(ExtensionFields
.Where(e => e.DataSetFieldName is
not (nameof(DataSetWriterId)) and
not (nameof(EndpointUrl)) and
not (nameof(ApplicationUri)) and
not (nameof(WriterGroupId)) and
not (nameof(JsonNetworkMessage.PublisherId)))
.Select(e => (e.DataSetFieldName, e.Value.Value?.ToString())));
}
// We already wrote application uri and endpoint uri, so do not write again
encoder.WriteStringDictionary(nameof(ExtensionFields), extensionFields);
}
}