clean.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. # greaseweazle/tools/clean.py
  2. #
  3. # Greaseweazle control script: Scrub drive heads with a cleaning disk.
  4. #
  5. # Uses a zig-zag pattern, after Dave Dunfield's ImageDisk and
  6. # Phil Pemberton's Magpie/DiscFerret.
  7. #
  8. # Written & released by Keir Fraser <keir.xen@gmail.com>
  9. #
  10. # This is free and unencumbered software released into the public domain.
  11. # See the file COPYING for more details, or visit <http://unlicense.org>.
  12. description = "Clean a drive in a zig-zag pattern using a cleaning disk."
  13. import sys, time
  14. from greaseweazle.tools import util
  15. from greaseweazle import usb as USB
  16. def seek(cyl, usb, args):
  17. c = min(cyl, args.cyls - 1)
  18. print("%d " % c, end='', flush=True)
  19. usb.seek(c, 0)
  20. def clean(usb, args):
  21. step = max(args.cyls // 8, 2)
  22. for p in range(args.passes):
  23. print('Pass %d: ' % p, end='', flush=True)
  24. for cyl in range(0, args.cyls, step):
  25. seek(cyl + step - 1, usb, args)
  26. time.sleep(args.linger / 1000)
  27. seek(cyl, usb, args)
  28. time.sleep(args.linger / 1000)
  29. print()
  30. def main(argv):
  31. parser = util.ArgumentParser(usage='%(prog)s [options]')
  32. parser.add_argument("--device", help="greaseweazle device name")
  33. parser.add_argument("--drive", type=util.drive_letter, default='A',
  34. help="drive to write (A,B,0,1,2)")
  35. parser.add_argument("--cyls", type=int, default=80,
  36. help="number of drive cylinders")
  37. parser.add_argument("--passes", type=int, default=3,
  38. help="number of passes across the cleaning disk")
  39. parser.add_argument("--linger", type=int, default=100,
  40. help="linger time per step, milliseconds")
  41. parser.description = description
  42. parser.prog += ' ' + argv[1]
  43. args = parser.parse_args(argv[2:])
  44. try:
  45. usb = util.usb_open(args.device)
  46. util.with_drive_selected(clean, usb, args)
  47. except USB.CmdError as error:
  48. print("Command Failed: %s" % error)
  49. if __name__ == "__main__":
  50. main(sys.argv)
  51. # Local variables:
  52. # python-indent: 4
  53. # End: