Browse Source

python: Neater tuple syntax. usb.read_track() returns index times.

Keir Fraser 5 years ago
parent
commit
34d6cb6ce9
2 changed files with 18 additions and 15 deletions
  1. 5 5
      scripts/greaseweazle/USB.py
  2. 13 10
      scripts/gw.py

+ 5 - 5
scripts/greaseweazle/USB.py

@@ -51,7 +51,7 @@ class Params:
 ## CmdError: Encapsulates a command acknowledgement.
 class CmdError(Exception):
 
-    str = [ "Okay", "Bad Command", "No Index (No disk?)", "Track 0 not found",
+    str = [ "Okay", "Bad Command", "No Index", "Track 0 not found",
             "Flux Overflow", "Flux Underflow", "Disk is Write Protected" ]
 
     def __init__(self, cmd, code):
@@ -98,8 +98,8 @@ class Unit:
         # Initialise the delay properties with current firmware values.
         self.send_cmd(struct.pack("4B", Cmd.GetParams, 4, Params.Delays, 10))
         (self._select_delay, self._step_delay,
-        self._seek_settle_delay, self._motor_delay,
-           self._auto_off_delay) = struct.unpack("<5H", self.ser.read(10))
+         self._seek_settle_delay, self._motor_delay,
+         self._auto_off_delay) = struct.unpack("<5H", self.ser.read(10))
 
 
     ## reset:
@@ -218,8 +218,8 @@ class Unit:
             self.send_cmd(struct.pack("2B", Cmd.GetFluxStatus, 2))
         except CmdError as error:
             del dat
-            return (error.code, None)
-        return (Ack.Okay, dat)
+            return error.code, None, None
+        return Ack.Okay, self.get_index_times(nr_idx), dat
 
 
     ## write_track:

+ 13 - 10
scripts/gw.py

@@ -19,11 +19,10 @@ scp_freq = 40000000
 # flux_to_scp:
 # Converts Greaseweazle flux samples into a Supercard Pro Track.
 # Returns the Track Data Header (TDH) and the SCP "bitcell" array.
-def flux_to_scp(flux, track, nr_revs):
+def flux_to_scp(flux, index_times, track, nr_revs):
 
     factor = scp_freq / usb.sample_freq
 
-    index_times = usb.get_index_times(nr_revs+1)
     tdh = struct.pack("<3sB", b"TRK", track)
     dat = bytearray()
 
@@ -55,7 +54,7 @@ def flux_to_scp(flux, track, nr_revs):
             rev += 1
             if rev > nr_revs:
                 # We're done: We simply discard any surplus flux samples
-                return (tdh, dat)
+                return tdh, dat
             to_index += index_times[rev]
 
         # Process the current flux sample into SCP "bitcell" format
@@ -81,7 +80,7 @@ def flux_to_scp(flux, track, nr_revs):
         len_at_index = len(dat)
         rev += 1
 
-    return (tdh, dat)
+    return tdh, dat
 
 
 # read_to_scp:
@@ -102,7 +101,7 @@ def read_to_scp(args):
         trk_offs.append(len(trk_dat))
         usb.seek(cyl, side)
         for retry in range(1, 5):
-            (ack, enc_flux) = usb.read_track(args.revs+1)
+            ack, index_times, enc_flux = usb.read_track(args.revs+1)
             if ack == USB.Ack.Okay:
                 break
             elif ack == USB.Ack.FluxOverflow and retry < 5:
@@ -110,7 +109,7 @@ def read_to_scp(args):
             else:
                 raise CmdError(ack)
         flux = usb.decode_flux(enc_flux)
-        (tdh, dat) = flux_to_scp(flux, track, args.revs)
+        tdh, dat = flux_to_scp(flux, index_times, track, args.revs)
         trk_dat += tdh
         trk_dat += dat
     print()
@@ -151,8 +150,12 @@ def write_from_scp(args):
     if args.adjust_speed:
         # @drive_ticks is the time in Gresaeweazle ticks between index pulses.
         # We will adjust the flux intervals per track to allow for this.
-        usb.read_track(3)
-        index_times = usb.get_index_times(3)
+        for retry in range(1, 5):
+            ack, index_times, _ = usb.read_track(3)
+            if ack == USB.Ack.Okay:
+                break
+            elif ack != USB.Ack.FluxOverflow or retry >= 5:
+                raise CmdError(ack)
         drive_ticks = (index_times[1] + index_times[2]) / 2
     else:
         # Simple ratio between the Greaseweazle and SCP sample frequencies.
@@ -182,7 +185,7 @@ def write_from_scp(args):
 
         # Parse the SCP track header and extract the flux data.
         thdr = struct.unpack("<3sBIII", dat[trk_offs[i]:trk_offs[i]+16])
-        (sig,_,track_ticks,samples,off) = thdr
+        sig, _, track_ticks, samples,off = thdr
         assert sig == b"TRK"
         tdat = dat[trk_offs[i]+off:trk_offs[i]+off+samples*2]
 
@@ -240,7 +243,7 @@ def update_firmware(args):
     # Read and check the update file.
     with open(args.file, "rb") as f:
         dat = f.read()
-    (sig, maj, min, pad1, pad2, crc) = struct.unpack(">2s4BH", dat[-8:])
+    sig, maj, min, pad1, pad2, crc = struct.unpack(">2s4BH", dat[-8:])
     if len(dat) & 3 != 0 or sig != b'GW' or pad1 != 0 or pad2 != 0:
         print("%s: Bad update file" % (args.file))
         return