/// <summary> /// Convert to results /// </summary> /// <param name="codec"></param> /// <param name="result"></param> /// <returns></returns> public static HistoricValueModel[] DecodeValues(this IVariantEncoder codec, VariantValue result) { var extensionObject = codec.DecodeExtensionObject(result); if (extensionObject?.Body is HistoryData data) { var results = data.DataValues.Select(d => new HistoricValueModel { ServerPicoseconds = d.ServerPicoseconds.ToNullable((ushort)0), SourcePicoseconds = d.SourcePicoseconds.ToNullable((ushort)0), ServerTimestamp = d.ServerTimestamp.ToNullable(DateTime.MinValue), SourceTimestamp = d.SourceTimestamp.ToNullable(DateTime.MinValue), StatusCode = d.StatusCode.ToNullable(StatusCodes.Good)?.CodeBits, Value = d.WrappedValue == Variant.Null ? null : codec.Encode(d.WrappedValue) }).ToArray(); if (extensionObject?.Body is HistoryModifiedData modified) { if (modified.ModificationInfos.Count != data.DataValues.Count) { throw new FormatException("Modification infos and data value count is not the same"); } for (var i = 0; i < modified.ModificationInfos.Count; i++) { results[i].ModificationInfo = new ModificationInfoModel { ModificationTime = modified.ModificationInfos[i].ModificationTime.ToNullable(DateTime.MinValue), UserName = modified.ModificationInfos[i].UserName }; } } return(results); } return(null); }
/// <summary> /// Convert to results /// </summary> /// <param name="codec"></param> /// <param name="result"></param> /// <returns></returns> public static HistoricEventModel[] DecodeEvents(this IVariantEncoder codec, JToken result) { var extensionObject = codec.DecodeExtensionObject(result); if (extensionObject?.Body is HistoryEvent ev) { return(ev.Events.Select(d => new HistoricEventModel { EventFields = d.EventFields .Select(v => v == Variant.Null ? null : codec.Encode(v)) .ToList() }).ToArray()); } return(null); }