Renames all 11 projects (5 src + 6 tests), the .slnx solution file, all source-file namespaces, all axaml namespace references, and all v1 documentation references in CLAUDE.md and docs/*.md (excluding docs/v2/ which is already in OtOpcUa form). Also updates the TopShelf service registration name from "LmxOpcUa" to "OtOpcUa" per Phase 0 Task 0.6.
Preserves runtime identifiers per Phase 0 Out-of-Scope rules to avoid breaking v1/v2 client trust during coexistence: OPC UA `ApplicationUri` defaults (`urn:{GalaxyName}:LmxOpcUa`), server `EndpointPath` (`/LmxOpcUa`), `ServerName` default (feeds cert subject CN), `MxAccessConfiguration.ClientName` default (defensive — stays "LmxOpcUa" for MxAccess audit-trail consistency), client OPC UA identifiers (`ApplicationName = "LmxOpcUaClient"`, `ApplicationUri = "urn:localhost:LmxOpcUaClient"`, cert directory `%LocalAppData%\LmxOpcUaClient\pki\`), and the `LmxOpcUaServer` class name (class rename out of Phase 0 scope per Task 0.5 sed pattern; happens in Phase 1 alongside `LmxNodeManager → GenericDriverNodeManager` Core extraction). 23 LmxOpcUa references retained, all enumerated and justified in `docs/v2/implementation/exit-gate-phase-0.md`.
Build clean: 0 errors, 30 warnings (lower than baseline 167). Tests at strict improvement over baseline: 821 passing / 1 failing vs baseline 820 / 2 (one flaky pre-existing failure passed this run; the other still fails — both pre-existing and unrelated to the rename). `Client.UI.Tests`, `Historian.Aveva.Tests`, `Client.Shared.Tests`, `IntegrationTests` all match baseline exactly. Exit gate compliance results recorded in `docs/v2/implementation/exit-gate-phase-0.md` with all 7 checks PASS or DEFERRED-to-PR-review (#7 service install verification needs Windows service permissions on the reviewer's box).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
57 lines
2.7 KiB
C#
57 lines
2.7 KiB
C#
using Opc.Ua;
|
|
|
|
namespace ZB.MOM.WW.OtOpcUa.Client.Shared.Adapters;
|
|
|
|
/// <summary>
|
|
/// Abstracts OPC UA subscription and monitored item management.
|
|
/// </summary>
|
|
internal interface ISubscriptionAdapter : IDisposable
|
|
{
|
|
/// <summary>
|
|
/// Gets the server-assigned subscription identifier for diagnostics and reconnect workflows.
|
|
/// </summary>
|
|
uint SubscriptionId { get; }
|
|
|
|
/// <summary>
|
|
/// Adds a data-change monitored item and returns its client handle for tracking.
|
|
/// </summary>
|
|
/// <param name="nodeId">The node to monitor.</param>
|
|
/// <param name="samplingIntervalMs">The sampling interval in milliseconds.</param>
|
|
/// <param name="onDataChange">Callback when data changes. Receives (nodeIdString, DataValue).</param>
|
|
/// <param name="ct">Cancellation token.</param>
|
|
/// <returns>A client handle that can be used to remove the item.</returns>
|
|
Task<uint> AddDataChangeMonitoredItemAsync(NodeId nodeId, int samplingIntervalMs,
|
|
Action<string, DataValue> onDataChange, CancellationToken ct = default);
|
|
|
|
/// <summary>
|
|
/// Removes a previously added monitored item by its client handle.
|
|
/// </summary>
|
|
/// <param name="clientHandle">The client handle returned when the monitored item was created.</param>
|
|
/// <param name="ct">The cancellation token that aborts the monitored-item removal.</param>
|
|
Task RemoveMonitoredItemAsync(uint clientHandle, CancellationToken ct = default);
|
|
|
|
/// <summary>
|
|
/// Adds an event monitored item with the given event filter.
|
|
/// </summary>
|
|
/// <param name="nodeId">The node to monitor for events.</param>
|
|
/// <param name="samplingIntervalMs">The sampling interval.</param>
|
|
/// <param name="filter">The event filter defining which fields to select.</param>
|
|
/// <param name="onEvent">Callback when events arrive. Receives the event field list.</param>
|
|
/// <param name="ct">Cancellation token.</param>
|
|
/// <returns>A client handle for the monitored item.</returns>
|
|
Task<uint> AddEventMonitoredItemAsync(NodeId nodeId, int samplingIntervalMs, EventFilter filter,
|
|
Action<EventFieldList> onEvent, CancellationToken ct = default);
|
|
|
|
/// <summary>
|
|
/// Requests a condition refresh for this subscription.
|
|
/// </summary>
|
|
/// <param name="ct">The cancellation token that aborts the condition refresh request.</param>
|
|
Task ConditionRefreshAsync(CancellationToken ct = default);
|
|
|
|
/// <summary>
|
|
/// Removes all monitored items and deletes the subscription.
|
|
/// </summary>
|
|
/// <param name="ct">The cancellation token that aborts subscription deletion.</param>
|
|
Task DeleteAsync(CancellationToken ct = default);
|
|
}
|