namespace MxNativeCodec; public enum NmxOperationStatusFormat { CompletionOnly, StatusWord, } public sealed record NmxOperationStatusMessage( NmxOperationStatusFormat Format, byte Command, ushort StatusCode, byte CompletionCode, MxStatus Status) { public bool IsMxAccessWriteComplete => Format == NmxOperationStatusFormat.StatusWord && StatusCode == 0x8050 && CompletionCode == 0x00; public static bool TryParseProcessDataReceivedBody(ReadOnlyMemory body, out NmxOperationStatusMessage message) { try { var envelope = NmxObservedEnvelope.ParseProcessDataReceivedBodyFlexible(body); return TryParseInner(envelope.InnerBody.Span, out message); } catch (ArgumentException) { message = null!; return false; } } public static bool TryParseInner(ReadOnlySpan inner, out NmxOperationStatusMessage message) { if (inner.Length == 1) { byte completionCode = inner[0]; message = new NmxOperationStatusMessage( Format: NmxOperationStatusFormat.CompletionOnly, Command: 0, StatusCode: 0, CompletionCode: completionCode, Status: CreateUnpromotedCompletionStatus(completionCode)); return true; } if (inner.Length == 5 && inner[0] == 0x00 && inner[1] == 0x00) { ushort statusCode = (ushort)(inner[2] | (inner[3] << 8)); byte completionCode = inner[4]; message = new NmxOperationStatusMessage( Format: NmxOperationStatusFormat.StatusWord, Command: inner[0], StatusCode: statusCode, CompletionCode: completionCode, Status: statusCode == 0x8050 && completionCode == 0x00 ? MxStatus.WriteCompleteOk : new MxStatus( Success: 0, Category: MxStatusCategory.Unknown, DetectedBy: MxStatusSource.Unknown, Detail: completionCode == 0x00 ? unchecked((short)statusCode) : completionCode)); return true; } message = null!; return false; } private static MxStatus CreateUnpromotedCompletionStatus(byte completionCode) { return new MxStatus( Success: 0, Category: MxStatusCategory.Unknown, DetectedBy: MxStatusSource.Unknown, Detail: completionCode); } }