From 8f113f018a0e5203f60daa1b2ba6a6779e909761 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Fri, 30 Oct 2015 19:32:55 +0000 Subject: [PATCH] Implemented decoding mode page 1Ah. --- DiscImageChef.Decoders/ChangeLog | 5 ++ DiscImageChef.Decoders/SCSI/Modes.cs | 89 ++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) diff --git a/DiscImageChef.Decoders/ChangeLog b/DiscImageChef.Decoders/ChangeLog index 07fe9d5d..960a518a 100644 --- a/DiscImageChef.Decoders/ChangeLog +++ b/DiscImageChef.Decoders/ChangeLog @@ -1,3 +1,8 @@ +2015-10-30 Natalia Portillo + + * SCSI/Modes.cs: + Implemented decoding mode page 1Ah. + 2015-10-30 Natalia Portillo * SCSI/Modes.cs: diff --git a/DiscImageChef.Decoders/SCSI/Modes.cs b/DiscImageChef.Decoders/SCSI/Modes.cs index 8786d88b..2b34d213 100644 --- a/DiscImageChef.Decoders/SCSI/Modes.cs +++ b/DiscImageChef.Decoders/SCSI/Modes.cs @@ -4143,6 +4143,95 @@ namespace DiscImageChef.Decoders.SCSI return sb.ToString(); } #endregion Mode Page 0x1C: Informational exceptions control page + + #region Mode Page 0x1A: Power condition page + /// + /// Power condition page + /// Page code 0x1A + /// 12 bytes in SPC-1 + /// + public struct ModePage_1A + { + /// + /// Parameters can be saved + /// + public bool PS; + /// + /// Idle timer activated + /// + public bool Idle; + /// + /// Standby timer activated + /// + public bool Standby; + /// + /// Idle timer + /// + public uint IdleTimer; + /// + /// Standby timer + /// + public uint StandbyTimer; + } + + public static ModePage_1A? DecodeModePage_1A(byte[] pageResponse) + { + if (pageResponse == null) + return null; + + if ((pageResponse[0] & 0x3F) != 0x1A) + return null; + + if (pageResponse[1] + 2 != pageResponse.Length) + return null; + + if (pageResponse.Length < 12) + return null; + + ModePage_1A decoded = new ModePage_1A(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + + decoded.Standby |= (pageResponse[3] & 0x01) == 0x01; + decoded.Idle |= (pageResponse[3] & 0x02) == 0x02; + + decoded.IdleTimer = (uint)((pageResponse[4] << 24) + (pageResponse[5] << 16) + (pageResponse[6] << 8) + pageResponse[7]); + decoded.StandbyTimer = (uint)((pageResponse[8] << 24) + (pageResponse[9] << 16) + (pageResponse[10] << 8) + pageResponse[11]); + + return decoded; + } + + public static string PrettifyModePage_1A(byte[] pageResponse) + { + return PrettifyModePage_1A(DecodeModePage_1A(pageResponse)); + } + + public static string PrettifyModePage_1A(ModePage_1A? modePage) + { + if (!modePage.HasValue) + return null; + + ModePage_1A page = modePage.Value; + StringBuilder sb = new StringBuilder(); + + sb.AppendLine("SCSI Power condition page:"); + + if (page.PS) + sb.AppendLine("\tParameters can be saved"); + + if (page.Standby && page.StandbyTimer > 0) + sb.AppendFormat("\tDrive will enter standby mode in {0} ms", page.StandbyTimer).AppendLine(); + else + sb.AppendLine("\tDrive will not enter standy mode"); + + if(page.Idle && page.IdleTimer > 0) + sb.AppendFormat("\tDrive will enter idle mode in {0} ms", page.StandbyTimer).AppendLine(); + else + sb.AppendLine("\tDrive will not enter idle mode"); + + return sb.ToString(); + } + #endregion Mode Page 0x1A: Power condition page } }