From c714b04136e7cbbab24b43d269be8ae5e0ab25ee Mon Sep 17 00:00:00 2001 From: Mark Lanning Date: Sat, 24 Aug 2024 12:16:27 -0500 Subject: [PATCH] updating telemetry data type --- .../ThingsLibrary.Base/DataType/Telemetry.cs | 52 +++++++++++++++++++ .../ThingsLibrary.Base.csproj | 2 +- .../DataType/Telemetry.cs | 26 ++++++++++ ...ngsLibrary.Entity.Tests.Integration.csproj | 2 +- .../ThingsLibrary.Services.csproj | 2 +- 5 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 Base/src/ThingsLibrary.Base/DataType/Telemetry.cs create mode 100644 Base/tests/ThingsLibrary.Base.Tests/DataType/Telemetry.cs diff --git a/Base/src/ThingsLibrary.Base/DataType/Telemetry.cs b/Base/src/ThingsLibrary.Base/DataType/Telemetry.cs new file mode 100644 index 0000000..3114782 --- /dev/null +++ b/Base/src/ThingsLibrary.Base/DataType/Telemetry.cs @@ -0,0 +1,52 @@ +using ThingsLibrary.Schema.Library.Extensions; + +namespace ThingsLibrary.DataType +{ + public class TelemetryEntry + { + [JsonPropertyName("date")] + public DateTimeOffset Timestamp { get; set; } = DateTime.UtcNow; + + [JsonPropertyName("type")] + public string Type { get; set; } = string.Empty; + + [JsonPropertyName("tags")] + public Dictionary Attributes { get; set; } = []; + + public TelemetryEntry() + { + //nothing + } + + public TelemetryEntry(string type, DateTimeOffset timestamp) + { + this.Type = type; + this.Timestamp = timestamp; + } + + + + /// + /// Generate the telemetry sentence + /// + /// Telemetry Sentence.. IE: $1724387849602|PA|r:1|s:143|p:PPE Mask|q:1|p:000*79 + public override string ToString() + { + var sentence = new StringBuilder($"${this.Timestamp.ToUnixTimeMilliseconds()}|{this.Type}"); + sentence.Append(string.Join(string.Empty, this.Attributes.Select(x => $"|{x.Key}:{x.Value}"))); + + sentence.AppendChecksum(); + + return sentence.ToString(); + } + + #region --- Static --- + + public static TelemetryEntry Parse(string telemetrySentence) + { + throw new NotImplementedException(); + } + + #endregion + } +} diff --git a/Base/src/ThingsLibrary.Base/ThingsLibrary.Base.csproj b/Base/src/ThingsLibrary.Base/ThingsLibrary.Base.csproj index 555320b..9a5c23f 100644 --- a/Base/src/ThingsLibrary.Base/ThingsLibrary.Base.csproj +++ b/Base/src/ThingsLibrary.Base/ThingsLibrary.Base.csproj @@ -21,6 +21,6 @@ - + diff --git a/Base/tests/ThingsLibrary.Base.Tests/DataType/Telemetry.cs b/Base/tests/ThingsLibrary.Base.Tests/DataType/Telemetry.cs new file mode 100644 index 0000000..6238f11 --- /dev/null +++ b/Base/tests/ThingsLibrary.Base.Tests/DataType/Telemetry.cs @@ -0,0 +1,26 @@ +using ThingsLibrary.DataType; + +namespace ThingsLibrary.Tests.DataType +{ + [TestClass, ExcludeFromCodeCoverage] + public class TelemetryTests + { + [TestMethod] + public void Basic() + { + var telem = new TelemetryEntry("sens", DateTime.UtcNow); + + telem.Attributes.Add("gn", "Mark"); + telem.Attributes.Add("cp", "Starlight"); + telem.Attributes.Add("r", "1"); + + var sentence = telem.ToString(); + + var expectedPrefix = $"${telem.Timestamp.ToUnixTimeMilliseconds()}|{telem.Type}|"; + + Assert.IsTrue(sentence.StartsWith(expectedPrefix)); + Assert.IsTrue(sentence.Contains('*')); + } + + } +} diff --git a/Entity/tests-integration/ThingsLibrary.Entity.Tests.Integration/ThingsLibrary.Entity.Tests.Integration.csproj b/Entity/tests-integration/ThingsLibrary.Entity.Tests.Integration/ThingsLibrary.Entity.Tests.Integration.csproj index 3786b14..376b50b 100644 --- a/Entity/tests-integration/ThingsLibrary.Entity.Tests.Integration/ThingsLibrary.Entity.Tests.Integration.csproj +++ b/Entity/tests-integration/ThingsLibrary.Entity.Tests.Integration/ThingsLibrary.Entity.Tests.Integration.csproj @@ -1,7 +1,7 @@  - net8.0 + net8.0 false diff --git a/Services/src/ThingsLibrary.Services/ThingsLibrary.Services.csproj b/Services/src/ThingsLibrary.Services/ThingsLibrary.Services.csproj index 6342ea5..7371840 100644 --- a/Services/src/ThingsLibrary.Services/ThingsLibrary.Services.csproj +++ b/Services/src/ThingsLibrary.Services/ThingsLibrary.Services.csproj @@ -30,7 +30,7 @@ - +