Decode fixed or descriptor SCSI sense in a single pass, use whichever was returned by drive.

This commit is contained in:
2021-03-26 00:37:54 +00:00
parent 5646d81e4b
commit 6e22b04ed0

View File

@@ -45,6 +45,16 @@ namespace Aaru.Decoders.SCSI
Unknown
}
public struct DecodedSense
{
public FixedSense? Fixed;
public DescriptorSense? Descriptor;
public byte ASC => Descriptor?.ASC ?? (Fixed?.ASC ?? 0);
public byte ASCQ => Descriptor?.ASCQ ?? (Fixed?.ASCQ ?? 0);
public SenseKeys SenseKey => Descriptor?.SenseKey ?? (Fixed?.SenseKey ?? SenseKeys.NoSense);
public string Description => Sense.GetSenseDescription(ASC, ASCQ);
}
[SuppressMessage("ReSharper", "MemberCanBeInternal"), SuppressMessage("ReSharper", "NotAccessedField.Global"),
SuppressMessage("ReSharper", "InconsistentNaming")]
public struct StandardSense
@@ -198,6 +208,27 @@ namespace Aaru.Decoders.SCSI
return decoded;
}
public static DecodedSense? Decode(byte[] sense)
{
var decoded = new DecodedSense();
switch(sense[0])
{
case 0x70:
case 0x71:
decoded.Fixed = DecodeFixed(sense);
break;
case 0x72:
case 0x73:
decoded.Descriptor = DecodeDescriptor(sense);
break;
}
return decoded.Fixed is null && decoded.Descriptor is null ? (DecodedSense?)null : decoded;
}
public static FixedSense? DecodeFixed(byte[] sense) => DecodeFixed(sense, out _);
public static FixedSense? DecodeFixed(byte[] sense, out string senseDescription)