blackmagic.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from SCons.Errors import StopError
  2. class BlackmagicResolver:
  3. BLACKMAGIC_HOSTNAME = "blackmagic.local"
  4. def __init__(self, env):
  5. self.env = env
  6. # On Win:
  7. # 'location': '1-5:x.0', 'name': 'COM4',
  8. # 'location': '1-5:x.2', 'name': 'COM13',
  9. # On Linux:
  10. # 'location': '1-1.2:1.0', 'name': 'ttyACM0',
  11. # 'location': '1-1.2:1.2', 'name': 'ttyACM1',
  12. # On MacOS:
  13. # 'location': '0-1.3', 'name': 'cu.usbmodemblackmagic1',
  14. # 'location': '0-1.3', 'name': 'cu.usbmodemblackmagic3',
  15. def _find_probe(self):
  16. import serial.tools.list_ports as list_ports
  17. ports = list(list_ports.grep("blackmagic"))
  18. if len(ports) == 0:
  19. # Blackmagic probe serial port not found, will be handled later
  20. pass
  21. elif len(ports) > 2:
  22. raise StopError("More than one Blackmagic probe found")
  23. else:
  24. # If you're getting any issues with auto lookup, uncomment this
  25. # print("\n".join([f"{p.device} {vars(p)}" for p in ports]))
  26. return sorted(ports, key=lambda p: f"{p.location}_{p.name}")[0]
  27. # Look up blackmagic probe hostname with dns
  28. def _resolve_hostname(self):
  29. import socket
  30. try:
  31. return socket.gethostbyname(self.BLACKMAGIC_HOSTNAME)
  32. except socket.gaierror:
  33. print("Failed to resolve Blackmagic hostname")
  34. return None
  35. def get_serial(self):
  36. if not (probe := self._find_probe()):
  37. return None
  38. # print(f"Found Blackmagic probe on {probe.device}")
  39. if self.env.subst("$PLATFORM") == "win32":
  40. return f"\\\\.\\{probe.device}"
  41. return probe.device
  42. def get_networked(self):
  43. if not (probe := self._resolve_hostname()):
  44. return None
  45. return f"tcp:{probe}:2345"
  46. def __str__(self):
  47. # print("distenv blackmagic", self.env.subst("$BLACKMAGIC"))
  48. if (blackmagic := self.env.subst("$BLACKMAGIC")) != "auto":
  49. return blackmagic
  50. # print("Looking for Blackmagic...")
  51. if probe := self.get_serial() or self.get_networked():
  52. return probe
  53. raise StopError("Please specify BLACKMAGIC=...")
  54. def generate(env):
  55. env.SetDefault(BLACKMAGIC_ADDR=BlackmagicResolver(env))
  56. def exists(env):
  57. return True