Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/Gemstone.Timeseries/Adapters/AdapterCache.cs
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,18 @@ public static IEnumerable<ConnectionParameter> GetConnectionParameters(string as
return GetConnectionParameters(assemblyName, typeName, connectionSettings?.ParseKeyValuePairs());
}

/// <summary>
/// Gets the AdapterProtocol attribute for the protocol acronym.
/// </summary>
/// <param name="acronym"></param>
/// <returns>Adapter Protocl for the protocol acronym.</returns>
public static AdapterProtocolAttribute? GetProtocolAttribute(string acronym)
{
return AdapterProtocols.Values
.SelectMany(info => info.Attributes)
.FirstOrDefault(attr => string.Equals(attr.Acronym, acronym, StringComparison.OrdinalIgnoreCase));
}

/// <summary>
/// Gets the connection parameters for the adapter and type name, optionally applying connection settings.
/// </summary>
Expand Down
20 changes: 15 additions & 5 deletions src/Gemstone.Timeseries/Adapters/AdapterCollectionBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1204,6 +1204,13 @@ protected internal virtual void OnProcessException(MessageLevel level, Exception
}
}

private static string WrapItemMessage(T item, string message) => $"[{item.Name}] {message}";

private void OnItemStatusMessage(T item, MessageLevel level, string status, string? eventName = null, MessageFlags flags = MessageFlags.None) =>
OnStatusMessage(level, WrapItemMessage(item, status), eventName, flags);

private static InvalidOperationException WrapItemException(T item, string message, Exception exception) => new(WrapItemMessage(item, $"{message}: {exception.Message}"), exception);

/// <summary>
/// Raises <see cref="InputMeasurementKeysUpdated"/> event.
/// </summary>
Expand Down Expand Up @@ -1327,8 +1334,7 @@ protected virtual void InitializeItem(T? item)
catch (Exception ex)
{
// Process exception for logging
string errorMessage = $"Failed to queue initialize operation for adapter {item.Name}: {ex.Message}";
OnProcessException(MessageLevel.Warning, new InvalidOperationException(errorMessage, ex));
OnProcessException(MessageLevel.Warning, WrapItemException(item, "Failed to queue initialize operation", ex));
}
}

Expand Down Expand Up @@ -1373,7 +1379,11 @@ private void Initialize(T item)
" try adjusting the initialization timeout to suppress this message during" +
" normal operations.";

OnStatusMessage(MessageLevel.Warning, string.Format(MessageFormat, item.Name, item.InitializationTimeout / 1000.0), "Initialization");
OnItemStatusMessage(
item,
MessageLevel.Warning,
string.Format(MessageFormat, item.Name, item.InitializationTimeout / 1000.0),
"Initialization");

// ReSharper disable once AccessToModifiedClosure
cancelInitializationTimeout = initializationTimeoutAction?.DelayAndExecute(item.InitializationTimeout);
Expand Down Expand Up @@ -1429,7 +1439,7 @@ private void Initialize(T item)
catch (Exception ex)
{
// We report any errors encountered during initialization...
OnProcessException(MessageLevel.Warning, new InvalidOperationException($"Failed to initialize adapter {item.Name}: {ex.Message}", ex), "Initialization");
OnProcessException(MessageLevel.Warning, WrapItemException(item, "Failed to initialize adapter", ex), "Initialization");

// Initialization failed, so stop the timeout timer
cancelInitializationTimeout?.Invoke();
Expand All @@ -1449,7 +1459,7 @@ private void Start(T item)
catch (Exception ex)
{
// We report any errors encountered during startup...
OnProcessException(MessageLevel.Warning, new InvalidOperationException($"Failed to start adapter {item.Name}: {ex.Message}", ex), "Startup");
OnProcessException(MessageLevel.Warning, WrapItemException(item, "Failed to start adapter", ex), "Startup");
}
}

Expand Down
30 changes: 29 additions & 1 deletion src/Gemstone.Timeseries/Adapters/AdapterProtocolAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,21 @@

public Application[] Applications { get; }

/// <summary>
/// Device fields locked when the device is external. Empty = nothing locked.
/// </summary>
public string[] LockedDeviceFields { get; }

/// <summary>
/// Measurement fields locked when the measurement is external. Empty = nothing locked.
/// </summary>
public string[] LockedMeasurementFields { get; }

/// <summary>
/// Phasor fields locked when the phasor is external. Empty = nothing locked.
/// </summary>
public string[] LockedPhasorFields { get; }

/// <summary>
/// Creates a new instance of the <see cref="AdapterProtocolAttribute"/> class.
/// </summary>
Expand All @@ -115,7 +130,17 @@
/// <param name="supportsConnectionTest">Determines if the adapter protocol supports a connection test.</param>
/// <param name="loadOrder">Load order of the adapter protocol.</param>
/// <param name="applications">Applications that support this protocol in the UI.</param>
public AdapterProtocolAttribute(string acronym, string name, ProtocolType type, UIVisibility visibility, bool supportsConnectionTest = true, int loadOrder = 0, Application[] applications = null)
public AdapterProtocolAttribute(
string acronym,
string name,
ProtocolType type,
UIVisibility visibility,
bool supportsConnectionTest = true,
int loadOrder = 0,
Application[] applications = null,

Check warning on line 140 in src/Gemstone.Timeseries/Adapters/AdapterProtocolAttribute.cs

View workflow job for this annotation

GitHub Actions / Analyze (csharp)

Cannot convert null literal to non-nullable reference type.

Check warning on line 140 in src/Gemstone.Timeseries/Adapters/AdapterProtocolAttribute.cs

View workflow job for this annotation

GitHub Actions / Analyze (csharp)

Cannot convert null literal to non-nullable reference type.
string[] lockedDeviceFields = null,

Check warning on line 141 in src/Gemstone.Timeseries/Adapters/AdapterProtocolAttribute.cs

View workflow job for this annotation

GitHub Actions / Analyze (csharp)

Cannot convert null literal to non-nullable reference type.

Check warning on line 141 in src/Gemstone.Timeseries/Adapters/AdapterProtocolAttribute.cs

View workflow job for this annotation

GitHub Actions / Analyze (csharp)

Cannot convert null literal to non-nullable reference type.
string[] lockedMeasurementFields = null,

Check warning on line 142 in src/Gemstone.Timeseries/Adapters/AdapterProtocolAttribute.cs

View workflow job for this annotation

GitHub Actions / Analyze (csharp)

Cannot convert null literal to non-nullable reference type.

Check warning on line 142 in src/Gemstone.Timeseries/Adapters/AdapterProtocolAttribute.cs

View workflow job for this annotation

GitHub Actions / Analyze (csharp)

Cannot convert null literal to non-nullable reference type.
string[] lockedPhasorFields = null)

Check warning on line 143 in src/Gemstone.Timeseries/Adapters/AdapterProtocolAttribute.cs

View workflow job for this annotation

GitHub Actions / Analyze (csharp)

Cannot convert null literal to non-nullable reference type.

Check warning on line 143 in src/Gemstone.Timeseries/Adapters/AdapterProtocolAttribute.cs

View workflow job for this annotation

GitHub Actions / Analyze (csharp)

Cannot convert null literal to non-nullable reference type.
{
ArgumentException.ThrowIfNullOrWhiteSpace(acronym);
ArgumentException.ThrowIfNullOrWhiteSpace(name);
Expand All @@ -127,6 +152,9 @@
SupportsConnectionTest = supportsConnectionTest;
LoadOrder = loadOrder;
Applications = applications ?? DefaultApplications;
LockedDeviceFields = lockedDeviceFields ?? Array.Empty<string>();
LockedMeasurementFields = lockedMeasurementFields ?? Array.Empty<string>();
LockedPhasorFields = lockedPhasorFields ?? Array.Empty<string>();
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/Gemstone.Timeseries/ConcentratorBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -856,7 +856,7 @@ public virtual int ProcessingInterval
[ConnectionStringParameter]
[Label("Time Resolution")]
[Category("Frame Timing")]
[DefaultValue(Ticks.PerMillisecond)]
[DefaultValueExpression("Settings.Instance[\"System\"][\"DefaultTimeResolution\"]")]
[Description("Defines the maximum time resolution, in ticks, to use when sorting measurements by timestamps into their proper destination frame in Ticks.")]
public long TimeResolution
{
Expand Down
1 change: 1 addition & 0 deletions src/Gemstone.Timeseries/ServiceHostBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4219,6 +4219,7 @@ public static void DefineSettings(Settings settings, string settingsCategory = S
section.DefaultFrameRate = (30, "Defines the default frame rate used for adapters in frames per second.");
section.DefaultLeadTime = (10.0D, "Defines the default lead time used for adapters in seconds.");
section.DefaultLagTime = (10.0D, "Defines the default lag time used for adapters in seconds.");
section.DefaultTimeResolution = (10000L, "Defines the default time resolution used for adapters in ticks");

// Classic with condensed phase information
//private const string DefaultPointTagNameExpression = "{Company.Acronym}_{DeviceAcronym}[?{SignalType.Source}=Phasor[-{SignalType.Suffix}{SignalIndex}]]:[?{Vendor.Acronym}!=[{VendorAcronym}_]][?{Phase}=A[APH]][?{Phase}=B[BPH]][?{Phase}=C[CPH]][?{Phase}=+[PSQ]][?{Phase}=-[NSQ]][?{Phase}=0[ZSQ]]{SignalType.Abbreviation}[?{SignalType.Source}!=Phasor[?{SignalIndex}!=-1[{SignalIndex}]]]";
Expand Down
Loading