Эх сурвалжийг харах

gw read, write: Add a --retries parameter (default 3).
Improve diagnostic output.

Keir Fraser 4 жил өмнө
parent
commit
ca2c61396a

+ 5 - 2
scripts/greaseweazle/codec/amiga/amigados.py

@@ -31,8 +31,11 @@ class AmigaDOS:
         self.map = [None] * nsec
 
     def summary_string(self):
-        return ("AmigaDOS (%d/%d sectors)"
-                % (self.nsec - self.nr_missing(), self.nsec))
+        nsec, nbad = self.nsec, self.nr_missing()
+        s = "AmigaDOS (%d/%d sectors)" % (nsec - nbad, nsec)
+        if nbad != 0:
+            s += " - %d sectors missing" % nbad
+        return s
 
     # private
     def exists(self, sec_id, togo):

+ 5 - 1
scripts/greaseweazle/codec/ibm/mfm.py

@@ -106,7 +106,11 @@ class IBM_MFM:
         self.iams = []
 
     def summary_string(self):
-        return "IBM MFM"
+        nsec, nbad = len(self.sectors), self.nr_missing()
+        s = "IBM MFM (%d/%d sectors)" % (nsec - nbad, nsec)
+        if nbad != 0:
+            s += " - %d sectors missing" % nbad
+        return s
 
     def has_sec(self, sec_id):
         return self.sectors[sec_id].crc == 0

+ 9 - 5
scripts/greaseweazle/tools/read.py

@@ -42,10 +42,9 @@ def read_with_retry(usb, args, cyl, head, decoder):
         return flux
     dat = decoder(cyl, head, flux)
     if dat.nr_missing() != 0:
-        for retry in range(3):
-            print("T%u.%u: %s - %d sectors missing - Retrying (%d)"
-                  % (cyl, head, dat.summary_string(),
-                     dat.nr_missing(), retry+1))
+        for retry in range(args.retries):
+            print("T%u.%u: %s - Retrying (%d)"
+                  % (cyl, head, dat.summary_string(), retry+1))
             flux = read_and_normalise(usb, args, max(args.revs, 3))
             dat.decode_raw(flux)
             if dat.nr_missing() == 0:
@@ -100,7 +99,10 @@ def read_to_image(usb, args, image, decoder=None):
         cyl, head = t.cyl, t.head
         usb.seek(t.physical_cyl, head)
         dat = read_with_retry(usb, args, cyl, head, decoder)
-        print("T%u.%u: %s" % (cyl, head, dat.summary_string()))
+        s = "T%u.%u: %s" % (cyl, head, dat.summary_string())
+        if hasattr(dat, 'nr_missing') and dat.nr_missing() != 0:
+            s += " - Giving up"
+        print(s)
         summary[cyl,head] = dat
         image.emit_track(cyl, head, dat)
 
@@ -121,6 +123,8 @@ def main(argv):
                         help="which tracks to read")
     parser.add_argument("--rate", type=int, help="data rate (kbit/s)")
     parser.add_argument("--rpm", type=int, help="convert drive speed to RPM")
+    parser.add_argument("--retries", type=int, default=3,
+                        help="number of retries on decode failure")
     parser.add_argument("file", help="output filename")
     parser.description = description
     parser.prog += ' ' + argv[1]

+ 9 - 17
scripts/greaseweazle/tools/write.py

@@ -20,18 +20,6 @@ def open_image(args):
     cls = util.get_image_class(args.file)
     return cls.from_file(args.file)
 
-class Formatter:
-    def __init__(self):
-        self.length = 0
-    def print(self, s):
-        self.erase()
-        self.length = len(s)
-        print(s, end="", flush=True)
-    def erase(self):
-        l = self.length
-        print("\b"*l + " "*l + "\b"*l, end="", flush=True)
-        self.length = 0
-
 # write_from_image:
 # Writes the specified image file to floppy disk.
 def write_from_image(usb, args, image):
@@ -78,9 +66,11 @@ def write_from_image(usb, args, image):
             flux_list.append(val)
 
         # Encode the flux times for Greaseweazle, and write them out.
-        formatter = Formatter()
         verified = False
-        for retry in range(3):
+        for retry in range(args.retries+1):
+            if retry != 0:
+                print("T%u.%u: Verify Failure - Retry (%d)"
+                      % (cyl, head, retry))
             usb.write_track(flux_list = flux_list,
                             cue_at_index = flux.index_cued,
                             terminate_at_index = flux.terminate_at_index)
@@ -102,9 +92,9 @@ def write_from_image(usb, args, image):
             if verified:
                 verified_count += 1
                 break
-            formatter.print(" Retry %d" % (retry + 1))
-        formatter.erase()
-        error.check(verified, "Failed to write Track %u.%u" % (cyl, head))
+            if retry == 0:
+                print()
+        error.check(verified, "Failed to verify Track %u.%u" % (cyl, head))
 
     print()
     if not_verified_count == 0:
@@ -163,6 +153,8 @@ def main(argv):
                         help="erase empty tracks (default: skip)")
     parser.add_argument("--no-verify", action="store_true",
                         help="disable verify")
+    parser.add_argument("--retries", type=int, default=3,
+                        help="number of retries on verify failure")
     parser.add_argument("--precomp", type=PrecompSpec,
                         help="write precompensation")
     parser.add_argument("file", help="input filename")