From 3b3c6842ebc08613471739bbd2d387b305d8d11e Mon Sep 17 00:00:00 2001 From: "J. Ritchie Carroll" Date: Tue, 16 Jun 2026 10:48:57 -0500 Subject: [PATCH 1/4] Updates for Linux compile --- src/lib/sttp.core/Common.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/lib/sttp.core/Common.cs b/src/lib/sttp.core/Common.cs index c211ff63..0caac5c1 100644 --- a/src/lib/sttp.core/Common.cs +++ b/src/lib/sttp.core/Common.cs @@ -23,11 +23,7 @@ // //****************************************************************************************************** -#if NET -#define MONO -#endif - -#if !MONO +#if !NET using Microsoft.Win32; #endif @@ -40,7 +36,7 @@ public static class Common { static Common() { - #if MONO + #if NET || MONO UseManagedEncryption = true; #else const string FipsKeyOld = @"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa"; From 152f9526f71d8437feeed7cc20ea5a40a7fbf15b Mon Sep 17 00:00:00 2001 From: "J. Ritchie Carroll" Date: Thu, 18 Jun 2026 16:21:12 -0500 Subject: [PATCH 2/4] Removed unnecessary nullable suppression --- src/lib/sttp.core/DataSubscriber.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/sttp.core/DataSubscriber.cs b/src/lib/sttp.core/DataSubscriber.cs index a53219b2..7744bc55 100644 --- a/src/lib/sttp.core/DataSubscriber.cs +++ b/src/lib/sttp.core/DataSubscriber.cs @@ -3156,7 +3156,7 @@ private void ParseTSSCMeasurements(byte[] buffer, int packetLength, SignalIndexC Measurement measurement = new() { - Metadata = key!.Metadata, + Metadata = key.Metadata, Timestamp = time, StateFlags = (MeasurementStateFlags)quality, Value = value From 4bfadfbacb1477fe4db69c67899eb048115bf1c3 Mon Sep 17 00:00:00 2001 From: "J. Ritchie Carroll" Date: Tue, 23 Jun 2026 15:32:42 -0500 Subject: [PATCH 3/4] Removed unused using directives --- src/lib/sttp.gsf/Properties/AssemblyInfo.cs | 1 - src/lib/sttp.gsf/internal/RequiredMemberAttribute.cs | 1 - 2 files changed, 2 deletions(-) diff --git a/src/lib/sttp.gsf/Properties/AssemblyInfo.cs b/src/lib/sttp.gsf/Properties/AssemblyInfo.cs index 35dd444b..2bb42146 100644 --- a/src/lib/sttp.gsf/Properties/AssemblyInfo.cs +++ b/src/lib/sttp.gsf/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following diff --git a/src/lib/sttp.gsf/internal/RequiredMemberAttribute.cs b/src/lib/sttp.gsf/internal/RequiredMemberAttribute.cs index 1a14e8f5..e8041e72 100644 --- a/src/lib/sttp.gsf/internal/RequiredMemberAttribute.cs +++ b/src/lib/sttp.gsf/internal/RequiredMemberAttribute.cs @@ -1,7 +1,6 @@ #pragma warning disable using System.Diagnostics; - using System.Diagnostics.CodeAnalysis; namespace System.Runtime.CompilerServices { From 69629f02e1008856ec78e5b92519a07b400e2601 Mon Sep 17 00:00:00 2001 From: "J. Ritchie Carroll" Date: Tue, 7 Jul 2026 14:41:09 -0500 Subject: [PATCH 4/4] Fix reverse connection recovery --- src/lib/sttp.core/DataPublisher.cs | 2 +- src/lib/sttp.core/DataSubscriber.cs | 22 ++++++++++++---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/lib/sttp.core/DataPublisher.cs b/src/lib/sttp.core/DataPublisher.cs index 46105e18..f4b99318 100644 --- a/src/lib/sttp.core/DataPublisher.cs +++ b/src/lib/sttp.core/DataPublisher.cs @@ -1671,7 +1671,7 @@ public override void Initialize() PayloadAware = true, PayloadMarker = null, PayloadEndianOrder = EndianOrder.BigEndian, - MaxConnectionAttempts = 1, + MaxConnectionAttempts = -1, CertificateFile = FilePath.GetAbsolutePath(localCertificate!), CheckCertificateRevocation = checkCertificateRevocation, CertificateChecker = m_certificateChecker, diff --git a/src/lib/sttp.core/DataSubscriber.cs b/src/lib/sttp.core/DataSubscriber.cs index 7744bc55..d1e3175a 100644 --- a/src/lib/sttp.core/DataSubscriber.cs +++ b/src/lib/sttp.core/DataSubscriber.cs @@ -2580,7 +2580,7 @@ private void ProcessServerResponse(byte[]? buffer, int length) if (TotalBytesReceived == 0) { // At the point when data is being received, data monitor should be enabled - if (m_dataStreamMonitor is not null && m_dataStreamMonitor.Enabled) + if (m_dataStreamMonitor is not null && !m_dataStreamMonitor.Enabled) m_dataStreamMonitor.Enabled = true; // Establish run-time log for subscriber @@ -2609,7 +2609,7 @@ private void ProcessServerResponse(byte[]? buffer, int length) // Track total data packet bytes received from any channel TotalBytesReceived += m_lastBytesReceived; - m_monitoredBytesReceived += m_lastBytesReceived; + Interlocked.Add(ref m_monitoredBytesReceived, m_lastBytesReceived); // Get data packet flags DataPacketFlags flags = (DataPacketFlags)buffer[responseIndex]; @@ -4214,6 +4214,9 @@ private bool HandleSocketException(Exception? ex) // Disconnect client, restarting if disconnect was not intentional private void DisconnectClient() { + if (m_dataStreamMonitor is not null) + m_dataStreamMonitor.Enabled = false; + // Mark end of any data transmission in run-time log if (m_runTimeLog is not null && m_runTimeLog.Enabled) { @@ -4245,12 +4248,14 @@ private void DisconnectClient() } else { - if (m_activeClientID != Guid.Empty) - m_serverCommandChannel.DisconnectOne(m_activeClientID); + Guid activeClientID = m_activeClientID; + m_activeClientID = Guid.Empty; + + if (activeClientID != Guid.Empty) + m_serverCommandChannel.DisconnectOne(activeClientID); // When subscriber is in server mode, the server does not need to be restarted, but we // will reset client statistics - this is a server of "one" client, the publisher - m_activeClientID = Guid.Empty; m_subscribedDevicesTimer?.Stop(); m_metadataRefreshPending = false; m_expectedBufferBlockSequenceNumber = 0u; @@ -4736,12 +4741,12 @@ protected string GetLoggingPath(string filePath) private void DataStreamMonitor_Elapsed(object? sender, EventArgs e) { - bool dataReceived = m_monitoredBytesReceived > 0; + bool dataReceived = Interlocked.Exchange(ref m_monitoredBytesReceived, 0L) > 0; if (m_dataChannel is null && m_metadataRefreshPending) { if (m_lastReceivedAt > DateTime.MinValue) - dataReceived = (DateTime.UtcNow - m_lastReceivedAt).Seconds < DataLossInterval; + dataReceived = (DateTime.UtcNow - m_lastReceivedAt).TotalSeconds < DataLossInterval; } if (!dataReceived) @@ -4758,9 +4763,6 @@ private void DataStreamMonitor_Elapsed(object? sender, EventArgs e) DisconnectClient(); }); } - - // Reset bytes received bytes being monitored - m_monitoredBytesReceived = 0L; } private void RunTimeLog_ProcessException(object? sender, EventArgs e)