public static ModePage_1A?DecodeModePage_1A(byte[] pageResponse) { if ((pageResponse?[0] &0x40) == 0x40) { return(null); } if ((pageResponse?[0] &0x3F) != 0x1A) { return(null); } if (pageResponse[1] + 2 != pageResponse.Length) { return(null); } if (pageResponse.Length < 12) { return(null); } var 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]); if (pageResponse.Length < 40) { return(decoded); } decoded.PM_BG_Precedence = (byte)((pageResponse[2] & 0xC0) >> 6); decoded.Standby_Y |= (pageResponse[2] & 0x01) == 0x01; decoded.Idle_B |= (pageResponse[3] & 0x04) == 0x04; decoded.Idle_C |= (pageResponse[3] & 0x08) == 0x08; decoded.IdleTimer_B = (uint)((pageResponse[12] << 24) + (pageResponse[13] << 16) + (pageResponse[14] << 8) + pageResponse[15]); decoded.IdleTimer_C = (uint)((pageResponse[16] << 24) + (pageResponse[17] << 16) + (pageResponse[18] << 8) + pageResponse[19]); decoded.StandbyTimer_Y = (uint)((pageResponse[20] << 24) + (pageResponse[21] << 16) + (pageResponse[22] << 8) + pageResponse[23]); decoded.CCF_Idle = (byte)((pageResponse[39] & 0xC0) >> 6); decoded.CCF_Standby = (byte)((pageResponse[39] & 0x30) >> 4); decoded.CCF_Stopped = (byte)((pageResponse[39] & 0x0C) >> 2); return(decoded); }
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 || page.Standby_Y && page.StandbyTimer_Y > 0) { if (page.Standby && page.StandbyTimer > 0) { sb.AppendFormat("\tStandby timer Z is set to {0} ms", page.StandbyTimer * 100).AppendLine(); } if (page.Standby_Y && page.StandbyTimer_Y > 0) { sb.AppendFormat("\tStandby timer Y is set to {0} ms", page.StandbyTimer_Y * 100).AppendLine(); } } else { sb.AppendLine("\tDrive will not enter standy mode"); } if (page.Idle && page.IdleTimer > 0 || page.Idle_B && page.IdleTimer_B > 0 || page.Idle_C && page.IdleTimer_C > 0) { if (page.Idle && page.IdleTimer > 0) { sb.AppendFormat("\tIdle timer A is set to {0} ms", page.IdleTimer * 100).AppendLine(); } if (page.Idle_B && page.IdleTimer_B > 0) { sb.AppendFormat("\tIdle timer B is set to {0} ms", page.IdleTimer_B * 100).AppendLine(); } if (page.Idle_C && page.IdleTimer_C > 0) { sb.AppendFormat("\tIdle timer C is set to {0} ms", page.IdleTimer_C * 100).AppendLine(); } } else { sb.AppendLine("\tDrive will not enter idle mode"); } switch (page.PM_BG_Precedence) { case 0: break; case 1: sb.AppendLine("\tPerforming background functions take precedence over maintaining low power conditions"); break; case 2: sb.AppendLine("\tMaintaining low power conditions take precedence over performing background functions"); break; } return(sb.ToString()); }