| 
					
				 | 
			
			
				@@ -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) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |