Files
BQP/srcs/RobotNet10/RobotApp/Communication/Sick.ColaB/Commands/MethodCommand.cs
2026-07-13 09:25:40 +07:00

61 lines
2.1 KiB
C#

using System.Text;
namespace Sick.ColaB.Commands;
/// <summary>
/// Command to call a method on the scanner (sMN - Method by Name)
/// </summary>
public sealed class MethodCommand(string methodName, params string[] parameters) : CommandBase($"sMN {methodName} {string.Join(" ", parameters)}")
{
public string MethodName { get; } = methodName;
public string[] Parameters { get; } = parameters;
public string? ReplyValue { get; private set; }
public override bool ProcessReply(ReadOnlyMemory<byte> replyData)
{
// Parse reply: "sAN <methodName> <result>" or "sMA <methodName> <result>" or "sFA <errorCode>" (Error)
var replyString = Encoding.ASCII.GetString(replyData.Span);
// Check if reply starts with "sFA" (Error) - scanner rejected the command
if (replyString.StartsWith("sFA", StringComparison.Ordinal))
{
// Extract error code if present
var errorParts = replyString.Split(' ', StringSplitOptions.RemoveEmptyEntries);
var errorInfo = errorParts.Length > 1 ? $" (error code: {string.Join(" ", errorParts.Skip(1))})" : "";
WasSuccessful = false;
ReplyValue = null;
return false;
}
// Check if reply starts with "sAN" (Answer) or "sMA" (Method Answer)
if (!replyString.StartsWith("sAN", StringComparison.Ordinal) &&
!replyString.StartsWith("sMA", StringComparison.Ordinal))
{
WasSuccessful = false;
return false;
}
// Extract result after method name
var parts = replyString.Split(' ', StringSplitOptions.RemoveEmptyEntries);
if (parts.Length >= 2 && parts[1] == MethodName)
{
if (parts.Length > 2)
{
ReplyValue = string.Join(" ", parts.Skip(2));
}
else
{
ReplyValue = string.Empty;
}
WasSuccessful = true;
return true;
}
WasSuccessful = false;
return false;
}
}