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