docs: backfill XML documentation across 756 files
v2-ci / build (push) Failing after 1m43s
v2-ci / unit-tests (tests/Core/ZB.MOM.WW.OtOpcUa.Cluster.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.ControlPlane.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Security.Tests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.Host.IntegrationTests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests) (push) Has been skipped

Adds <summary>, <param>, <typeparam>, and <inheritdoc/> tags to public
members surfaced by commentchecker — resolves 5,847 of 5,869 issues
(99.6%) across three /fixdocs passes.
This commit is contained in:
Joseph Doherty
2026-05-28 08:10:17 -04:00
parent f9fc7dd2e1
commit 64e3fbe035
756 changed files with 9876 additions and 96 deletions
@@ -30,13 +30,19 @@ public sealed class WireFocasClient : IFocasClient
/// <see cref="FocasWireClient"/> so the per-response Debug entries actually reach
/// the host's logging pipeline (Driver.FOCAS-007).
/// </summary>
/// <param name="logger">Optional logger for debug output from wire client responses.</param>
public WireFocasClient(ILogger<FocasWireClient>? logger)
{
_wire = new FocasWireClient(logger);
}
/// <summary>Gets a value indicating whether the wire client is connected to the FOCAS host.</summary>
public bool IsConnected => _wire.IsConnected;
/// <summary>Connects to a FOCAS host at the specified address.</summary>
/// <param name="address">The host address containing the machine name and port.</param>
/// <param name="timeout">The connection timeout; values less than or equal to zero are clamped to 1 second.</param>
/// <param name="cancellationToken">Cancellation token for the operation.</param>
public async Task ConnectAsync(FocasHostAddress address, TimeSpan timeout, CancellationToken cancellationToken)
{
if (_wire.IsConnected) return;
@@ -48,6 +54,11 @@ public sealed class WireFocasClient : IFocasClient
await _wire.ConnectAsync(address.Host, address.Port, effective, cancellationToken).ConfigureAwait(false);
}
/// <summary>Reads a value from the specified FOCAS address.</summary>
/// <param name="address">The FOCAS address to read from.</param>
/// <param name="type">The FOCAS data type of the value.</param>
/// <param name="cancellationToken">Cancellation token for the operation.</param>
/// <returns>A tuple containing the read value and FOCAS status code.</returns>
public async Task<(object? value, uint status)> ReadAsync(
FocasAddress address, FocasDataType type, CancellationToken cancellationToken)
{
@@ -63,10 +74,19 @@ public sealed class WireFocasClient : IFocasClient
};
}
/// <summary>Writes a value to a FOCAS address (always returns BadNotWritable as OtOpcUa is read-only).</summary>
/// <param name="address">The FOCAS address to write to.</param>
/// <param name="type">The FOCAS data type of the value.</param>
/// <param name="value">The value to write.</param>
/// <param name="cancellationToken">Cancellation token for the operation.</param>
/// <returns>A task that returns the BadNotWritable status code.</returns>
public Task<uint> WriteAsync(
FocasAddress address, FocasDataType type, object? value, CancellationToken cancellationToken)
=> Task.FromResult(FocasStatusMapper.BadNotWritable);
/// <summary>Probes the FOCAS host to verify connectivity.</summary>
/// <param name="cancellationToken">Cancellation token for the operation.</param>
/// <returns>True if the probe succeeds; otherwise false.</returns>
public async Task<bool> ProbeAsync(CancellationToken cancellationToken)
{
if (!_wire.IsConnected) return false;
@@ -81,6 +101,9 @@ public sealed class WireFocasClient : IFocasClient
}
}
/// <summary>Reads all active alarms from the FOCAS host.</summary>
/// <param name="cancellationToken">Cancellation token for the operation.</param>
/// <returns>A list of active alarms; empty if read fails or not connected.</returns>
public async Task<IReadOnlyList<FocasActiveAlarm>> ReadAlarmsAsync(CancellationToken cancellationToken)
{
if (!_wire.IsConnected) return [];
@@ -102,6 +125,9 @@ public sealed class WireFocasClient : IFocasClient
Message: a.Message ?? string.Empty);
}
/// <summary>Gets system information from the FOCAS host.</summary>
/// <param name="cancellationToken">Cancellation token for the operation.</param>
/// <returns>The FOCAS system information.</returns>
public async Task<FocasSysInfo> GetSysInfoAsync(CancellationToken cancellationToken)
{
RequireConnected();
@@ -121,6 +147,9 @@ public sealed class WireFocasClient : IFocasClient
AxesCount: axesCount);
}
/// <summary>Gets the names of all axes on the FOCAS host.</summary>
/// <param name="cancellationToken">Cancellation token for the operation.</param>
/// <returns>A list of axis names; empty if read fails or not connected.</returns>
public async Task<IReadOnlyList<FocasAxisName>> GetAxisNamesAsync(CancellationToken cancellationToken)
{
if (!_wire.IsConnected) return [];
@@ -140,6 +169,9 @@ public sealed class WireFocasClient : IFocasClient
}
}
/// <summary>Gets the names of all spindles on the FOCAS host.</summary>
/// <param name="cancellationToken">Cancellation token for the operation.</param>
/// <returns>A list of spindle names; empty if read fails or not connected.</returns>
public async Task<IReadOnlyList<FocasSpindleName>> GetSpindleNamesAsync(CancellationToken cancellationToken)
{
if (!_wire.IsConnected) return [];
@@ -158,6 +190,10 @@ public sealed class WireFocasClient : IFocasClient
}
}
/// <summary>Reads the dynamic state of a specified axis.</summary>
/// <param name="axisIndex">The index of the axis to read.</param>
/// <param name="cancellationToken">Cancellation token for the operation.</param>
/// <returns>The dynamic snapshot of the axis.</returns>
public async Task<FocasDynamicSnapshot> ReadDynamicAsync(int axisIndex, CancellationToken cancellationToken)
{
RequireConnected();
@@ -179,6 +215,9 @@ public sealed class WireFocasClient : IFocasClient
DistanceToGo: pos.Distance);
}
/// <summary>Gets information about the currently executing program.</summary>
/// <param name="cancellationToken">Cancellation token for the operation.</param>
/// <returns>The current program information.</returns>
public async Task<FocasProgramInfo> GetProgramInfoAsync(CancellationToken cancellationToken)
{
RequireConnected();
@@ -206,6 +245,10 @@ public sealed class WireFocasClient : IFocasClient
Mode: modeResult.IsOk ? modeResult.Value : 0);
}
/// <summary>Gets a timer value from the FOCAS host.</summary>
/// <param name="kind">The kind of timer to read (run time, cutting time, etc.).</param>
/// <param name="cancellationToken">Cancellation token for the operation.</param>
/// <returns>The timer value.</returns>
public async Task<FocasTimer> GetTimerAsync(FocasTimerKind kind, CancellationToken cancellationToken)
{
RequireConnected();
@@ -215,6 +258,9 @@ public sealed class WireFocasClient : IFocasClient
return new FocasTimer(kind, t.Minutes, t.Milliseconds);
}
/// <summary>Gets servo load information for all axes.</summary>
/// <param name="cancellationToken">Cancellation token for the operation.</param>
/// <returns>A list of servo load values for each axis; empty if read fails or not connected.</returns>
public async Task<IReadOnlyList<FocasServoLoad>> GetServoLoadsAsync(CancellationToken cancellationToken)
{
if (!_wire.IsConnected) return [];
@@ -226,9 +272,15 @@ public sealed class WireFocasClient : IFocasClient
.ToList();
}
/// <summary>Gets spindle load information for all spindles.</summary>
/// <param name="cancellationToken">Cancellation token for the operation.</param>
/// <returns>A list of spindle load percentages; empty if read fails or not connected.</returns>
public Task<IReadOnlyList<int>> GetSpindleLoadsAsync(CancellationToken cancellationToken) =>
ReadSpindleMetricAsync((sel, ct) => _wire.ReadSpindleLoadAsync(sel, ct), cancellationToken);
/// <summary>Gets maximum RPM information for all spindles.</summary>
/// <param name="cancellationToken">Cancellation token for the operation.</param>
/// <returns>A list of maximum RPM values for each spindle; empty if read fails or not connected.</returns>
public Task<IReadOnlyList<int>> GetSpindleMaxRpmsAsync(CancellationToken cancellationToken) =>
ReadSpindleMetricAsync((sel, ct) => _wire.ReadSpindleMaxRpmAsync(sel, ct), cancellationToken);
@@ -249,6 +301,7 @@ public sealed class WireFocasClient : IFocasClient
return list;
}
/// <summary>Disposes the wire client and releases all resources.</summary>
public void Dispose() => _wire.Dispose();
// ---- PMC / Parameter / Macro read paths ------------------------------------------
@@ -359,6 +412,7 @@ public sealed class WireFocasClientFactory : IFocasClientFactory
{
private readonly ILogger<FocasWireClient>? _logger;
/// <summary>Initializes a new instance of the WireFocasClientFactory without a logger.</summary>
public WireFocasClientFactory() : this(logger: null) { }
/// <summary>
@@ -367,10 +421,13 @@ public sealed class WireFocasClientFactory : IFocasClientFactory
/// client already emits Debug entries per FOCAS response, but the previous no-arg
/// factory path discarded them.
/// </summary>
/// <param name="logger">Optional logger for debug output from wire client responses.</param>
public WireFocasClientFactory(ILogger<FocasWireClient>? logger)
{
_logger = logger;
}
/// <summary>Creates a new WireFocasClient instance.</summary>
/// <returns>A new IFocasClient implementation.</returns>
public IFocasClient Create() => new WireFocasClient(_logger);
}