scp_info.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import struct, sys
  2. trknr = int(sys.argv[2])
  3. with open(sys.argv[1], "rb") as f:
  4. dat = f.read()
  5. header = struct.unpack("<3s9BI", dat[0:16])
  6. (sig, _, _, nr_revs, s_trk, e_trk, flags, _, ss, _, _) = header
  7. assert sig == b"SCP"
  8. nr_sides = 1 if ss else 2
  9. trk_offs = struct.unpack("<168I", dat[16:0x2b0])
  10. print("Revolutions: %u" % nr_revs)
  11. print("Track %u:" % trknr)
  12. trk_off = trk_offs[trknr]
  13. if trk_off == 0:
  14. print("Empty")
  15. sys.exit(0)
  16. # Parse the SCP track header and extract the flux data.
  17. thdr = dat[trk_off:trk_off+4+12*nr_revs]
  18. sig, tnr, _, _, s_off = struct.unpack("<3sB3I", thdr[:16])
  19. assert sig == b"TRK"
  20. assert tnr == trknr
  21. for i in range(nr_revs):
  22. t,n,_ = struct.unpack("<3I", thdr[4+i*12:4+(i+1)*12])
  23. print("Rev %u: time=%uus flux=%u" % (i, t//40, n))
  24. _, e_nr, e_off = struct.unpack("<3I", thdr[-12:])
  25. tdat = dat[trk_off+s_off:trk_off+e_off+e_nr*2]
  26. fluxl = []
  27. while tdat:
  28. flux, = struct.unpack(">H", tdat[:2])
  29. tdat = tdat[2:]
  30. fluxl.append(flux / 40)
  31. tot = 0.0
  32. for x in fluxl:
  33. print(x)
  34. tot += x
  35. print("Total: %uus (%uus per rev)" % (int(tot), tot//nr_revs))