using System.Text; namespace Sick.ColaB.Commands; /// /// Command to call a method on the scanner (sMN - Method by Name) /// 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 replyData) { // Parse reply: "sAN " or "sMA " or "sFA " (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; } }