scp_info.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import struct, sys
  2. def dump_track(dat, trk_offs, trknr, show_dat):
  3. print("Track %u:" % trknr)
  4. trk_off = trk_offs[trknr]
  5. if trk_off == 0:
  6. print("Empty")
  7. return
  8. # Parse the SCP track header and extract the flux data.
  9. thdr = dat[trk_off:trk_off+4+12*nr_revs]
  10. sig, tnr, _, _, s_off = struct.unpack("<3sB3I", thdr[:16])
  11. assert sig == b"TRK"
  12. assert tnr == trknr
  13. for i in range(nr_revs):
  14. t,n,_ = struct.unpack("<3I", thdr[4+i*12:4+(i+1)*12])
  15. print("Rev %u: time=%uus flux=%u" % (i, t//40, n))
  16. if not show_dat:
  17. return
  18. _, e_nr, e_off = struct.unpack("<3I", thdr[-12:])
  19. tdat = dat[trk_off+s_off:trk_off+e_off+e_nr*2]
  20. fluxl = []
  21. while tdat:
  22. flux, = struct.unpack(">H", tdat[:2])
  23. tdat = tdat[2:]
  24. fluxl.append(flux / 40)
  25. tot = 0.0
  26. i = 0
  27. for x in fluxl:
  28. bad = ""
  29. if (x < 3.6) or ((x > 4.4) and (x < 5.4)) \
  30. or ((x > 6.6) and (x < 7.2)) or (x > 8.8):
  31. bad = "BAD"
  32. print("%d: %f %s" % (i, x, bad))
  33. i += 1
  34. tot += x
  35. print("Total: %uus (%uus per rev)" % (int(tot), tot//nr_revs))
  36. with open(sys.argv[1], "rb") as f:
  37. dat = f.read()
  38. header = struct.unpack("<3s9BI", dat[0:16])
  39. (sig, _, _, nr_revs, s_trk, e_trk, flags, _, ss, _, _) = header
  40. assert sig == b"SCP"
  41. nr_sides = 1 if ss else 2
  42. trk_offs = struct.unpack("<168I", dat[16:0x2b0])
  43. print("Revolutions: %u" % nr_revs)
  44. if len(sys.argv) == 3:
  45. dump_track(dat, trk_offs, int(sys.argv[2]), True)
  46. else:
  47. for i in range(s_trk, e_trk+1):
  48. dump_track(dat, trk_offs, i, False)