Browse Source

scp_info: Extend the script to briefly list all tracks or give all flux on one specified track.

Keir Fraser 5 năm trước cách đây
mục cha
commit
5b9ef4c3d6
1 tập tin đã thay đổi với 43 bổ sung27 xóa
  1. 43 27
      scripts/misc/scp_info.py

+ 43 - 27
scripts/misc/scp_info.py

@@ -1,6 +1,43 @@
 import struct, sys
 
-trknr = int(sys.argv[2])
+def dump_track(dat, trk_offs, trknr, show_dat):
+    print("Track %u:" % trknr)
+
+    trk_off = trk_offs[trknr]
+    if trk_off == 0:
+        print("Empty")
+        return
+    
+    # Parse the SCP track header and extract the flux data.
+    thdr = dat[trk_off:trk_off+4+12*nr_revs]
+    sig, tnr, _, _, s_off = struct.unpack("<3sB3I", thdr[:16])
+    assert sig == b"TRK"
+    assert tnr == trknr
+    for i in range(nr_revs):
+        t,n,_ = struct.unpack("<3I", thdr[4+i*12:4+(i+1)*12])
+        print("Rev %u: time=%uus flux=%u" % (i, t//40, n))
+    if not show_dat:
+        return
+    
+    _, e_nr, e_off = struct.unpack("<3I", thdr[-12:])
+    tdat = dat[trk_off+s_off:trk_off+e_off+e_nr*2]
+    fluxl = []
+    while tdat:
+        flux, = struct.unpack(">H", tdat[:2])
+        tdat = tdat[2:]
+        fluxl.append(flux / 40)
+    tot = 0.0
+    i = 0
+    for x in fluxl:
+        bad = ""
+        if (x < 3.6) or ((x > 4.4) and (x < 5.4)) \
+           or ((x > 6.6) and (x < 7.2)) or (x > 8.8):
+            bad = "BAD"
+        print("%d: %f %s" % (i, x, bad))
+        i += 1
+        tot += x
+    print("Total: %uus (%uus per rev)" % (int(tot), tot//nr_revs))
+
 
 with open(sys.argv[1], "rb") as f:
     dat = f.read()
@@ -13,31 +50,10 @@ nr_sides = 1 if ss else 2
 trk_offs = struct.unpack("<168I", dat[16:0x2b0])
 
 print("Revolutions: %u" % nr_revs)
-print("Track %u:" % trknr)
 
-trk_off = trk_offs[trknr]
-if trk_off == 0:
-    print("Empty")
-    sys.exit(0)
-    
-# Parse the SCP track header and extract the flux data.
-thdr = dat[trk_off:trk_off+4+12*nr_revs]
-sig, tnr, _, _, s_off = struct.unpack("<3sB3I", thdr[:16])
-assert sig == b"TRK"
-assert tnr == trknr
-for i in range(nr_revs):
-    t,n,_ = struct.unpack("<3I", thdr[4+i*12:4+(i+1)*12])
-    print("Rev %u: time=%uus flux=%u" % (i, t//40, n))
-_, e_nr, e_off = struct.unpack("<3I", thdr[-12:])
-tdat = dat[trk_off+s_off:trk_off+e_off+e_nr*2]
-fluxl = []
-while tdat:
-    flux, = struct.unpack(">H", tdat[:2])
-    tdat = tdat[2:]
-    fluxl.append(flux / 40)
-tot = 0.0
-for x in fluxl:
-    print(x)
-    tot += x
-print("Total: %uus (%uus per rev)" % (int(tot), tot//nr_revs))
+if len(sys.argv) == 3:
+    dump_track(dat, trk_offs, int(sys.argv[2]), True)
+else:
+    for i in range(s_trk, e_trk+1):
+        dump_track(dat, trk_offs, i, False)