feat(focas): add cnc_getfigure wire command + focas-mock handler
This commit is contained in:
@@ -385,6 +385,41 @@ public sealed class FocasWireClient : IAsyncDisposable, IDisposable
|
||||
return new FocasResult<IReadOnlyList<WireServoMeter>>(rc, result);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Read the per-axis position decimal-place figures via <c>cnc_getfigure</c>
|
||||
/// (command <c>0x00d3</c>). The response payload is a self-delimiting sequence of
|
||||
/// big-endian <c>short</c> decimal-place counts — one per configured axis — which the
|
||||
/// driver applies as a <c>10^figure</c> scale on raw position reads.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The <c>0x00d3</c> command id is co-designed with the in-tree <c>focas_mock</c> sim and
|
||||
/// validated against it; like the rest of this managed wire backend the binary shape is
|
||||
/// sim-consistent and has not been validated against a real Fanuc CNC (bench-CNC-gated).
|
||||
/// </remarks>
|
||||
/// <param name="cancellationToken">Cancellation token for the read operation.</param>
|
||||
/// <param name="timeout">Optional per-call timeout override.</param>
|
||||
/// <param name="pathId">Optional path ID override; defaults to <see cref="PathId"/>.</param>
|
||||
public async Task<FocasResult<IReadOnlyList<int>>> ReadPositionFiguresAsync(
|
||||
CancellationToken cancellationToken = default,
|
||||
TimeSpan? timeout = null,
|
||||
ushort? pathId = null)
|
||||
{
|
||||
using var callTimeout = CreateCallTimeout(cancellationToken, timeout);
|
||||
var requestPathId = EffectivePathId(pathId);
|
||||
var block = await SendSingleRequestAsync(
|
||||
callTimeout.Token,
|
||||
new RequestBlock(0x00d3, PathId: requestPathId)).ConfigureAwait(false);
|
||||
|
||||
if (block.Rc != 0) return new FocasResult<IReadOnlyList<int>>(block.Rc, null);
|
||||
|
||||
var payload = block.Payload;
|
||||
var figures = new List<int>(payload.Length / 2);
|
||||
for (var offset = 0; offset + 2 <= payload.Length; offset += 2)
|
||||
figures.Add(ReadInt16(payload, offset));
|
||||
|
||||
return new FocasResult<IReadOnlyList<int>>(block.Rc, figures);
|
||||
}
|
||||
|
||||
/// <summary>Read per-spindle load percentages via <c>cnc_rdspload</c> (command <c>0x0040</c> with arg1=0).</summary>
|
||||
/// <param name="spindleSelector">Spindle selector; -1 selects all spindles.</param>
|
||||
/// <param name="cancellationToken">Cancellation token for the read operation.</param>
|
||||
|
||||
Reference in New Issue
Block a user