diff --git a/DiscImageChef.Core/Devices/Report/SCSI/SSC.cs b/DiscImageChef.Core/Devices/Report/SCSI/SSC.cs index ab6a3f18b..e2168911e 100644 --- a/DiscImageChef.Core/Devices/Report/SCSI/SSC.cs +++ b/DiscImageChef.Core/Devices/Report/SCSI/SSC.cs @@ -30,279 +30,172 @@ // Copyright © 2011-2018 Natalia Portillo // ****************************************************************************/ -using System; -using System.Collections.Generic; -using System.Threading; using DiscImageChef.CommonTypes.Metadata; using DiscImageChef.Console; using DiscImageChef.Decoders.SCSI; using DiscImageChef.Decoders.SCSI.SSC; using DiscImageChef.Devices; -namespace DiscImageChef.Core.Devices.Report.SCSI +namespace DiscImageChef.Core.Devices.Report { - /// - /// Implements creating a report for a SCSI Streaming device - /// - public static class Ssc + public partial class DeviceReport { - /// - /// Fills a SCSI device report with parameters and media tests specific to a Streaming device - /// - /// Device - /// Device report - /// If debug is enabled - public static void Report(Device dev, ref DeviceReportV2 report, bool debug) + public Ssc ReportScsiSsc() { - if(report == null) return; - - bool sense; - const uint TIMEOUT = 5; - ConsoleKeyInfo pressedKey; - - report.SCSI.SequentialDevice = new CommonTypes.Metadata.Ssc(); + Ssc report = new Ssc(); DicConsole.WriteLine("Querying SCSI READ BLOCK LIMITS..."); - sense = dev.ReadBlockLimits(out byte[] buffer, out byte[] senseBuffer, TIMEOUT, out _); + bool sense = dev.ReadBlockLimits(out byte[] buffer, out byte[] _, dev.Timeout, out _); if(!sense) { BlockLimits.BlockLimitsData? decBl = BlockLimits.Decode(buffer); if(decBl.HasValue) { - if(decBl.Value.granularity > 0) - report.SCSI.SequentialDevice.BlockSizeGranularity = decBl.Value.granularity; + if(decBl.Value.granularity > 0) report.BlockSizeGranularity = decBl.Value.granularity; - if(decBl.Value.maxBlockLen > 0) - report.SCSI.SequentialDevice.MaxBlockLength = decBl.Value.maxBlockLen; + if(decBl.Value.maxBlockLen > 0) report.MaxBlockLength = decBl.Value.maxBlockLen; - if(decBl.Value.minBlockLen > 0) - report.SCSI.SequentialDevice.MinBlockLength = decBl.Value.minBlockLen; + if(decBl.Value.minBlockLen > 0) report.MinBlockLength = decBl.Value.minBlockLen; } } DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT..."); - sense = dev.ReportDensitySupport(out buffer, out senseBuffer, false, false, TIMEOUT, out _); + sense = dev.ReportDensitySupport(out buffer, out byte[] _, false, false, dev.Timeout, out _); if(!sense) { DensitySupport.DensitySupportHeader? dsh = DensitySupport.DecodeDensity(buffer); if(dsh.HasValue) { - report.SCSI.SequentialDevice.SupportedDensities = - new SupportedDensity[dsh.Value.descriptors.Length]; + report.SupportedDensities = new SupportedDensity[dsh.Value.descriptors.Length]; for(int i = 0; i < dsh.Value.descriptors.Length; i++) { - report.SCSI.SequentialDevice.SupportedDensities[i].BitsPerMm = dsh.Value.descriptors[i].bpmm; - report.SCSI.SequentialDevice.SupportedDensities[i].Capacity = - dsh.Value.descriptors[i].capacity; - report.SCSI.SequentialDevice.SupportedDensities[i].DefaultDensity = - dsh.Value.descriptors[i].defaultDensity; - report.SCSI.SequentialDevice.SupportedDensities[i].Description = - dsh.Value.descriptors[i].description; - report.SCSI.SequentialDevice.SupportedDensities[i].Duplicate = - dsh.Value.descriptors[i].duplicate; - report.SCSI.SequentialDevice.SupportedDensities[i].Name = dsh.Value.descriptors[i].name; - report.SCSI.SequentialDevice.SupportedDensities[i].Organization = - dsh.Value.descriptors[i].organization; - report.SCSI.SequentialDevice.SupportedDensities[i].PrimaryCode = - dsh.Value.descriptors[i].primaryCode; - report.SCSI.SequentialDevice.SupportedDensities[i].SecondaryCode = - dsh.Value.descriptors[i].secondaryCode; - report.SCSI.SequentialDevice.SupportedDensities[i].Tracks = dsh.Value.descriptors[i].tracks; - report.SCSI.SequentialDevice.SupportedDensities[i].Width = dsh.Value.descriptors[i].width; - report.SCSI.SequentialDevice.SupportedDensities[i].Writable = dsh.Value.descriptors[i].writable; + report.SupportedDensities[i].BitsPerMm = dsh.Value.descriptors[i].bpmm; + report.SupportedDensities[i].Capacity = dsh.Value.descriptors[i].capacity; + report.SupportedDensities[i].DefaultDensity = dsh.Value.descriptors[i].defaultDensity; + report.SupportedDensities[i].Description = dsh.Value.descriptors[i].description; + report.SupportedDensities[i].Duplicate = dsh.Value.descriptors[i].duplicate; + report.SupportedDensities[i].Name = dsh.Value.descriptors[i].name; + report.SupportedDensities[i].Organization = dsh.Value.descriptors[i].organization; + report.SupportedDensities[i].PrimaryCode = dsh.Value.descriptors[i].primaryCode; + report.SupportedDensities[i].SecondaryCode = dsh.Value.descriptors[i].secondaryCode; + report.SupportedDensities[i].Tracks = dsh.Value.descriptors[i].tracks; + report.SupportedDensities[i].Width = dsh.Value.descriptors[i].width; + report.SupportedDensities[i].Writable = dsh.Value.descriptors[i].writable; } } } DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT for medium types..."); - sense = dev.ReportDensitySupport(out buffer, out senseBuffer, true, false, TIMEOUT, out _); + sense = dev.ReportDensitySupport(out buffer, out byte[] _, true, false, dev.Timeout, out _); + if(sense) return report; + + DensitySupport.MediaTypeSupportHeader? mtsh = DensitySupport.DecodeMediumType(buffer); + if(!mtsh.HasValue) return report; + + report.SupportedMediaTypes = new SupportedMedia[mtsh.Value.descriptors.Length]; + for(int i = 0; i < mtsh.Value.descriptors.Length; i++) + { + report.SupportedMediaTypes[i].Description = mtsh.Value.descriptors[i].description; + report.SupportedMediaTypes[i].Length = mtsh.Value.descriptors[i].length; + report.SupportedMediaTypes[i].MediumType = mtsh.Value.descriptors[i].mediumType; + report.SupportedMediaTypes[i].Name = mtsh.Value.descriptors[i].name; + report.SupportedMediaTypes[i].Organization = mtsh.Value.descriptors[i].organization; + report.SupportedMediaTypes[i].Width = mtsh.Value.descriptors[i].width; + if(mtsh.Value.descriptors[i].densityCodes == null) continue; + + report.SupportedMediaTypes[i].DensityCodes = new int[mtsh.Value.descriptors[i].densityCodes.Length]; + for(int j = 0; j < mtsh.Value.descriptors.Length; j++) + report.SupportedMediaTypes[i].DensityCodes[j] = mtsh.Value.descriptors[i].densityCodes[j]; + } + + return report; + } + + public TestedSequentialMedia ReportSscMedia() + { + TestedSequentialMedia seqTest = new TestedSequentialMedia(); + + Modes.DecodedMode? decMode = null; + + DicConsole.WriteLine("Querying SCSI MODE SENSE (10)..."); + bool sense = dev.ModeSense10(out byte[] buffer, out byte[] _, false, true, ScsiModeSensePageControl.Current, + 0x3F, 0x00, dev.Timeout, out _); + if(!sense && !dev.Error) + { + decMode = Modes.DecodeMode10(buffer, dev.ScsiType); + if(debug) seqTest.ModeSense10Data = buffer; + } + + DicConsole.WriteLine("Querying SCSI MODE SENSE..."); + sense = dev.ModeSense(out buffer, out byte[] _, dev.Timeout, out _); + if(!sense && !dev.Error) + { + if(!decMode.HasValue) decMode = Modes.DecodeMode6(buffer, dev.ScsiType); + if(debug) seqTest.ModeSense6Data = buffer; + } + + if(decMode.HasValue) + { + seqTest.MediumType = (byte)decMode.Value.Header.MediumType; + if(decMode.Value.Header.BlockDescriptors != null && decMode.Value.Header.BlockDescriptors.Length > 0) + seqTest.Density = (byte)decMode.Value.Header.BlockDescriptors[0].Density; + } + + DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT for current media..."); + sense = dev.ReportDensitySupport(out buffer, out byte[] _, false, true, dev.Timeout, out _); + if(!sense) + { + DensitySupport.DensitySupportHeader? dsh = DensitySupport.DecodeDensity(buffer); + if(dsh.HasValue) + { + seqTest.SupportedDensities = new SupportedDensity[dsh.Value.descriptors.Length]; + for(int i = 0; i < dsh.Value.descriptors.Length; i++) + { + seqTest.SupportedDensities[i].BitsPerMm = dsh.Value.descriptors[i].bpmm; + seqTest.SupportedDensities[i].Capacity = dsh.Value.descriptors[i].capacity; + seqTest.SupportedDensities[i].DefaultDensity = dsh.Value.descriptors[i].defaultDensity; + seqTest.SupportedDensities[i].Description = dsh.Value.descriptors[i].description; + seqTest.SupportedDensities[i].Duplicate = dsh.Value.descriptors[i].duplicate; + seqTest.SupportedDensities[i].Name = dsh.Value.descriptors[i].name; + seqTest.SupportedDensities[i].Organization = dsh.Value.descriptors[i].organization; + seqTest.SupportedDensities[i].PrimaryCode = dsh.Value.descriptors[i].primaryCode; + seqTest.SupportedDensities[i].SecondaryCode = dsh.Value.descriptors[i].secondaryCode; + seqTest.SupportedDensities[i].Tracks = dsh.Value.descriptors[i].tracks; + seqTest.SupportedDensities[i].Width = dsh.Value.descriptors[i].width; + seqTest.SupportedDensities[i].Writable = dsh.Value.descriptors[i].writable; + } + } + } + + DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT for medium types for current media..."); + sense = dev.ReportDensitySupport(out buffer, out byte[] _, true, true, dev.Timeout, out _); if(!sense) { DensitySupport.MediaTypeSupportHeader? mtsh = DensitySupport.DecodeMediumType(buffer); if(mtsh.HasValue) { - report.SCSI.SequentialDevice.SupportedMediaTypes = - new SupportedMedia[mtsh.Value.descriptors.Length]; + seqTest.SupportedMediaTypes = new SupportedMedia[mtsh.Value.descriptors.Length]; for(int i = 0; i < mtsh.Value.descriptors.Length; i++) { - report.SCSI.SequentialDevice.SupportedMediaTypes[i].Description = - mtsh.Value.descriptors[i].description; - report.SCSI.SequentialDevice.SupportedMediaTypes[i].Length = mtsh.Value.descriptors[i].length; - report.SCSI.SequentialDevice.SupportedMediaTypes[i].MediumType = - mtsh.Value.descriptors[i].mediumType; - report.SCSI.SequentialDevice.SupportedMediaTypes[i].Name = mtsh.Value.descriptors[i].name; - report.SCSI.SequentialDevice.SupportedMediaTypes[i].Organization = - mtsh.Value.descriptors[i].organization; - report.SCSI.SequentialDevice.SupportedMediaTypes[i].Width = mtsh.Value.descriptors[i].width; + seqTest.SupportedMediaTypes[i].Description = mtsh.Value.descriptors[i].description; + seqTest.SupportedMediaTypes[i].Length = mtsh.Value.descriptors[i].length; + seqTest.SupportedMediaTypes[i].MediumType = mtsh.Value.descriptors[i].mediumType; + seqTest.SupportedMediaTypes[i].Name = mtsh.Value.descriptors[i].name; + seqTest.SupportedMediaTypes[i].Organization = mtsh.Value.descriptors[i].organization; + seqTest.SupportedMediaTypes[i].Width = mtsh.Value.descriptors[i].width; if(mtsh.Value.descriptors[i].densityCodes == null) continue; - report.SCSI.SequentialDevice.SupportedMediaTypes[i].DensityCodes = + seqTest.SupportedMediaTypes[i].DensityCodes = new int[mtsh.Value.descriptors[i].densityCodes.Length]; for(int j = 0; j < mtsh.Value.descriptors.Length; j++) - report.SCSI.SequentialDevice.SupportedMediaTypes[i].DensityCodes[j] = - mtsh.Value.descriptors[i].densityCodes[j]; + seqTest.SupportedMediaTypes[i].DensityCodes[j] = mtsh.Value.descriptors[i].densityCodes[j]; } } } - List seqTests = new List(); + DicConsole.WriteLine("Trying SCSI READ MEDIA SERIAL NUMBER..."); + seqTest.CanReadMediaSerial = !dev.ReadMediaSerialNumber(out buffer, out byte[] _, dev.Timeout, out _); - pressedKey = new ConsoleKeyInfo(); - while(pressedKey.Key != ConsoleKey.N) - { - pressedKey = new ConsoleKeyInfo(); - while(pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N) - { - DicConsole.Write("Do you have media that you can insert in the drive? (Y/N): "); - pressedKey = System.Console.ReadKey(); - DicConsole.WriteLine(); - } - - if(pressedKey.Key != ConsoleKey.Y) continue; - - DicConsole.WriteLine("Please insert it in the drive and press any key when it is ready."); - System.Console.ReadKey(true); - - TestedSequentialMedia seqTest = new TestedSequentialMedia(); - DicConsole.Write("Please write a description of the media type and press enter: "); - seqTest.MediumTypeName = System.Console.ReadLine(); - DicConsole.Write("Please write the media manufacturer and press enter: "); - seqTest.Manufacturer = System.Console.ReadLine(); - DicConsole.Write("Please write the media model and press enter: "); - seqTest.Model = System.Console.ReadLine(); - - seqTest.MediaIsRecognized = true; - - dev.Load(out senseBuffer, TIMEOUT, out _); - sense = dev.ScsiTestUnitReady(out senseBuffer, TIMEOUT, out _); - if(sense) - { - FixedSense? decSense = Sense.DecodeFixed(senseBuffer); - if(decSense.HasValue) - if(decSense.Value.ASC == 0x3A) - { - int leftRetries = 20; - while(leftRetries > 0) - { - DicConsole.Write("\rWaiting for drive to become ready"); - Thread.Sleep(2000); - sense = dev.ScsiTestUnitReady(out senseBuffer, TIMEOUT, out _); - if(!sense) break; - - leftRetries--; - } - - seqTest.MediaIsRecognized &= !sense; - } - else if(decSense.Value.ASC == 0x04 && decSense.Value.ASCQ == 0x01) - { - int leftRetries = 20; - while(leftRetries > 0) - { - DicConsole.Write("\rWaiting for drive to become ready"); - Thread.Sleep(2000); - sense = dev.ScsiTestUnitReady(out senseBuffer, TIMEOUT, out _); - if(!sense) break; - - leftRetries--; - } - - seqTest.MediaIsRecognized &= !sense; - } - else seqTest.MediaIsRecognized = false; - else seqTest.MediaIsRecognized = false; - } - - if(seqTest.MediaIsRecognized) - { - Modes.DecodedMode? decMode = null; - - DicConsole.WriteLine("Querying SCSI MODE SENSE (10)..."); - sense = dev.ModeSense10(out buffer, out senseBuffer, false, true, ScsiModeSensePageControl.Current, - 0x3F, 0x00, TIMEOUT, out _); - if(!sense && !dev.Error) - { - report.SCSI.SupportsModeSense10 = true; - decMode = Modes.DecodeMode10(buffer, dev.ScsiType); - if(debug) seqTest.ModeSense10Data = buffer; - } - - DicConsole.WriteLine("Querying SCSI MODE SENSE..."); - sense = dev.ModeSense(out buffer, out senseBuffer, TIMEOUT, out _); - if(!sense && !dev.Error) - { - report.SCSI.SupportsModeSense6 = true; - if(!decMode.HasValue) decMode = Modes.DecodeMode6(buffer, dev.ScsiType); - if(debug) seqTest.ModeSense6Data = buffer; - } - - if(decMode.HasValue) - { - seqTest.MediumType = (byte)decMode.Value.Header.MediumType; - if(decMode.Value.Header.BlockDescriptors != null && - decMode.Value.Header.BlockDescriptors.Length > 0) - seqTest.Density = (byte)decMode.Value.Header.BlockDescriptors[0].Density; - } - } - - DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT for current media..."); - sense = dev.ReportDensitySupport(out buffer, out senseBuffer, false, true, TIMEOUT, out _); - if(!sense) - { - DensitySupport.DensitySupportHeader? dsh = DensitySupport.DecodeDensity(buffer); - if(dsh.HasValue) - { - seqTest.SupportedDensities = new SupportedDensity[dsh.Value.descriptors.Length]; - for(int i = 0; i < dsh.Value.descriptors.Length; i++) - { - seqTest.SupportedDensities[i].BitsPerMm = dsh.Value.descriptors[i].bpmm; - seqTest.SupportedDensities[i].Capacity = dsh.Value.descriptors[i].capacity; - seqTest.SupportedDensities[i].DefaultDensity = dsh.Value.descriptors[i].defaultDensity; - seqTest.SupportedDensities[i].Description = dsh.Value.descriptors[i].description; - seqTest.SupportedDensities[i].Duplicate = dsh.Value.descriptors[i].duplicate; - seqTest.SupportedDensities[i].Name = dsh.Value.descriptors[i].name; - seqTest.SupportedDensities[i].Organization = dsh.Value.descriptors[i].organization; - seqTest.SupportedDensities[i].PrimaryCode = dsh.Value.descriptors[i].primaryCode; - seqTest.SupportedDensities[i].SecondaryCode = dsh.Value.descriptors[i].secondaryCode; - seqTest.SupportedDensities[i].Tracks = dsh.Value.descriptors[i].tracks; - seqTest.SupportedDensities[i].Width = dsh.Value.descriptors[i].width; - seqTest.SupportedDensities[i].Writable = dsh.Value.descriptors[i].writable; - } - } - } - - DicConsole.WriteLine("Querying SCSI REPORT DENSITY SUPPORT for medium types for current media..."); - sense = dev.ReportDensitySupport(out buffer, out senseBuffer, true, true, TIMEOUT, out _); - if(!sense) - { - DensitySupport.MediaTypeSupportHeader? mtsh = DensitySupport.DecodeMediumType(buffer); - if(mtsh.HasValue) - { - seqTest.SupportedMediaTypes = new SupportedMedia[mtsh.Value.descriptors.Length]; - for(int i = 0; i < mtsh.Value.descriptors.Length; i++) - { - seqTest.SupportedMediaTypes[i].Description = mtsh.Value.descriptors[i].description; - seqTest.SupportedMediaTypes[i].Length = mtsh.Value.descriptors[i].length; - seqTest.SupportedMediaTypes[i].MediumType = mtsh.Value.descriptors[i].mediumType; - seqTest.SupportedMediaTypes[i].Name = mtsh.Value.descriptors[i].name; - seqTest.SupportedMediaTypes[i].Organization = mtsh.Value.descriptors[i].organization; - seqTest.SupportedMediaTypes[i].Width = mtsh.Value.descriptors[i].width; - if(mtsh.Value.descriptors[i].densityCodes == null) continue; - - seqTest.SupportedMediaTypes[i].DensityCodes = - new int[mtsh.Value.descriptors[i].densityCodes.Length]; - for(int j = 0; j < mtsh.Value.descriptors.Length; j++) - seqTest.SupportedMediaTypes[i].DensityCodes[j] = - mtsh.Value.descriptors[i].densityCodes[j]; - } - } - } - - DicConsole.WriteLine("Trying SCSI READ MEDIA SERIAL NUMBER..."); - seqTest.CanReadMediaSerial = !dev.ReadMediaSerialNumber(out buffer, out senseBuffer, TIMEOUT, out _); - seqTests.Add(seqTest); - } - - report.SCSI.SequentialDevice.TestedMedia = seqTests.ToArray(); + return seqTest; } } } \ No newline at end of file diff --git a/DiscImageChef/Commands/DeviceReport.cs b/DiscImageChef/Commands/DeviceReport.cs index 6f3e1a321..3436cd304 100644 --- a/DiscImageChef/Commands/DeviceReport.cs +++ b/DiscImageChef/Commands/DeviceReport.cs @@ -42,7 +42,6 @@ using DiscImageChef.Decoders.SCSI; using DiscImageChef.Devices; using Newtonsoft.Json; using Mmc = DiscImageChef.Core.Devices.Report.SCSI.Mmc; -using Ssc = DiscImageChef.Core.Devices.Report.SCSI.Ssc; namespace DiscImageChef.Commands { @@ -71,6 +70,8 @@ namespace DiscImageChef.Commands DeviceReportV2 report = new DeviceReportV2(); bool removable = false; string jsonFile; + byte[] senseBuffer; + bool sense; if(!string.IsNullOrWhiteSpace(dev.Manufacturer) && !string.IsNullOrWhiteSpace(dev.Revision)) jsonFile = dev.Manufacturer + "_" + dev.Model + "_" + dev.Revision + ".json"; @@ -142,6 +143,9 @@ namespace DiscImageChef.Commands if(dev.IsPcmcia) report.PCMCIA = reporter.PcmciaReport(); byte[] buffer; + string mediumTypeName; + string mediumModel; + string mediumManufacturer; switch(dev.Type) { @@ -205,9 +209,9 @@ namespace DiscImageChef.Commands System.Console.ReadKey(true); DicConsole.Write("Please write a description of the media type and press enter: "); - string mediumTypeName = System.Console.ReadLine(); + mediumTypeName = System.Console.ReadLine(); DicConsole.Write("Please write the media model and press enter: "); - string mediumModel = System.Console.ReadLine(); + mediumModel = System.Console.ReadLine(); TestedMedia mediaTest = reporter.ReportAtaMedia(); mediaTest.MediumTypeName = mediumTypeName; @@ -297,7 +301,88 @@ namespace DiscImageChef.Commands Mmc.Report(dev, ref report, options.Debug, cdromMode, productIdentification); break; case PeripheralDeviceTypes.SequentialAccess: - Ssc.Report(dev, ref report, options.Debug); + report.SCSI.SequentialDevice = reporter.ReportScsiSsc(); + + List seqTests = new List(); + + pressedKey = new ConsoleKeyInfo(); + while(pressedKey.Key != ConsoleKey.N) + { + pressedKey = new ConsoleKeyInfo(); + while(pressedKey.Key != ConsoleKey.Y && pressedKey.Key != ConsoleKey.N) + { + DicConsole.Write("Do you have media that you can insert in the drive? (Y/N): "); + pressedKey = System.Console.ReadKey(); + DicConsole.WriteLine(); + } + + if(pressedKey.Key != ConsoleKey.Y) continue; + + DicConsole + .WriteLine("Please insert it in the drive and press any key when it is ready."); + System.Console.ReadKey(true); + + DicConsole.Write("Please write a description of the media type and press enter: "); + mediumTypeName = System.Console.ReadLine(); + DicConsole.Write("Please write the media manufacturer and press enter: "); + mediumManufacturer = System.Console.ReadLine(); + DicConsole.Write("Please write the media model and press enter: "); + mediumModel = System.Console.ReadLine(); + + bool mediaIsRecognized = true; + + dev.Load(out senseBuffer, dev.Timeout, out _); + sense = dev.ScsiTestUnitReady(out senseBuffer, dev.Timeout, out _); + if(sense) + { + FixedSense? decSense = Sense.DecodeFixed(senseBuffer); + if(decSense.HasValue) + if(decSense.Value.ASC == 0x3A) + { + int leftRetries = 20; + while(leftRetries > 0) + { + DicConsole.Write("\rWaiting for drive to become ready"); + Thread.Sleep(2000); + sense = dev.ScsiTestUnitReady(out senseBuffer, dev.Timeout, out _); + if(!sense) break; + + leftRetries--; + } + + mediaIsRecognized &= !sense; + } + else if(decSense.Value.ASC == 0x04 && decSense.Value.ASCQ == 0x01) + { + int leftRetries = 20; + while(leftRetries > 0) + { + DicConsole.Write("\rWaiting for drive to become ready"); + Thread.Sleep(2000); + sense = dev.ScsiTestUnitReady(out senseBuffer, dev.Timeout, out _); + if(!sense) break; + + leftRetries--; + } + + mediaIsRecognized &= !sense; + } + else mediaIsRecognized = false; + else mediaIsRecognized = false; + } + + TestedSequentialMedia seqTest = new TestedSequentialMedia(); + + if(mediaIsRecognized) seqTest = reporter.ReportSscMedia(); + + seqTest.MediumTypeName = mediumTypeName; + seqTest.Manufacturer = mediumManufacturer; + seqTest.Model = mediumModel; + + seqTests.Add(seqTest); + } + + report.SCSI.SequentialDevice.TestedMedia = seqTests.ToArray(); break; default: { @@ -323,15 +408,15 @@ namespace DiscImageChef.Commands System.Console.ReadKey(true); DicConsole.Write("Please write a description of the media type and press enter: "); - string mediumTypeName = System.Console.ReadLine(); + mediumTypeName = System.Console.ReadLine(); DicConsole.Write("Please write the media manufacturer and press enter: "); - string manufacturer = System.Console.ReadLine(); + mediumManufacturer = System.Console.ReadLine(); DicConsole.Write("Please write the media model and press enter: "); - string model = System.Console.ReadLine(); + mediumModel = System.Console.ReadLine(); bool mediaIsRecognized = true; - bool sense = dev.ScsiTestUnitReady(out byte[] senseBuffer, dev.Timeout, out _); + sense = dev.ScsiTestUnitReady(out senseBuffer, dev.Timeout, out _); if(sense) { FixedSense? decSense = Sense.DecodeFixed(senseBuffer); @@ -422,8 +507,8 @@ namespace DiscImageChef.Commands } mediaTest.MediumTypeName = mediumTypeName; - mediaTest.Manufacturer = manufacturer; - mediaTest.Model = model; + mediaTest.Manufacturer = mediumManufacturer; + mediaTest.Model = mediumModel; mediaTests.Add(mediaTest); } @@ -452,8 +537,8 @@ namespace DiscImageChef.Commands for(ushort i = (ushort)report.SCSI.ReadCapabilities.BlockSize;; i++) { DicConsole.Write("\rTrying to READ LONG with a size of {0} bytes...", i); - bool sense = dev.ReadLong10(out buffer, out byte[] senseBuffer, false, - false, 0, i, dev.Timeout, out _); + sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, i, + dev.Timeout, out _); if(!sense) { if(options.Debug) @@ -479,9 +564,9 @@ namespace DiscImageChef.Commands report.SCSI.ReadCapabilities.LongBlockSize != report.SCSI.ReadCapabilities.BlockSize) { - bool sense = dev.ReadLong10(out buffer, out byte[] senseBuffer, false, false, 0, - (ushort)report.SCSI.ReadCapabilities.LongBlockSize, - dev.Timeout, out _); + sense = dev.ReadLong10(out buffer, out senseBuffer, false, false, 0, + (ushort)report.SCSI.ReadCapabilities.LongBlockSize, + dev.Timeout, out _); if(!sense) DataFile.WriteTo("SCSI Report", "readlong10", "_debug_" + dev.Model + ".bin", "read results", buffer);