GTK+ GUI for configuring PD Buddy Sink devices
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

pd-buddy-gtk.py 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #!/usr/bin/env python3
  2. import sys
  3. import serial
  4. import serial.tools.list_ports
  5. import gi
  6. gi.require_version('Gtk', '3.0')
  7. from gi.repository import Gtk
  8. def pdb_send_message(sp, message):
  9. # Open the serial port
  10. # FIXME handle exceptions
  11. sp = serial.Serial(sp.device, baudrate=115200, timeout=0.01)
  12. sp.write(bytes(message, 'utf-8') + b'\r\n')
  13. sp.flush()
  14. answer = sp.readlines()
  15. sp.close()
  16. # Remove the echoed command and prompt
  17. answer = answer[1:-1]
  18. return answer
  19. class SelectListRow(Gtk.ListBoxRow):
  20. def __init__(self, serial_port):
  21. Gtk.EventBox.__init__(self)
  22. self.serial_port = serial_port
  23. self._builder = Gtk.Builder()
  24. self._builder.add_from_file("data/select-list-row.ui")
  25. self._builder.connect_signals(self)
  26. name = self._builder.get_object("name")
  27. name.set_text(serial_port.description)
  28. device = self._builder.get_object("device")
  29. device.set_text(serial_port.device)
  30. self.add(self._builder.get_object("grid"))
  31. self.show_all()
  32. def on_identify_clicked(self, button):
  33. pdb_send_message(self.serial_port, 'identify')
  34. class Handler:
  35. def __init__(self, builder):
  36. self.builder = builder
  37. def on_pdb_window_realize(self, *args):
  38. # Get the list
  39. sl = self.builder.get_object("select-list")
  40. ss = self.builder.get_object("select-stack")
  41. sf = self.builder.get_object("select-frame")
  42. # Search for the serial ports
  43. for serport in serial.tools.list_ports.grep("1209:0001"):
  44. # Show the list if we have a serial port
  45. ss.set_visible_child(sf)
  46. sl.insert(SelectListRow(serport), -1)
  47. def on_pdb_window_delete_event(self, *args):
  48. Gtk.main_quit(*args)
  49. def on_select_list_row_activated(self, box, row):
  50. # Get voltage and current widgets
  51. voltage = self.builder.get_object("voltage-combobox")
  52. current = self.builder.get_object("current-spinbutton")
  53. self.serial_port = row.serial_port
  54. pdb_send_message(self.serial_port, 'load')
  55. lines = pdb_send_message(self.serial_port, 'get_tmpcfg')
  56. # Get information
  57. for line in lines:
  58. if line.startswith(b'v:'):
  59. v = line.split()[1]
  60. if v == b'5.00':
  61. voltage.set_active_id('voltage-five')
  62. elif v == b'9.00':
  63. voltage.set_active_id('voltage-nine')
  64. elif v == b'15.00':
  65. voltage.set_active_id('voltage-fifteen')
  66. if v == b'20.00':
  67. voltage.set_active_id('voltage-twenty')
  68. elif line.startswith(b'i:'):
  69. i = float(line.split()[1])
  70. current.set_value(i)
  71. # Hide the Save button
  72. rev = self.builder.get_object("header-sink-save-revealer")
  73. rev.set_reveal_child(False)
  74. # Show the Sink page
  75. hst = self.builder.get_object("header-stack")
  76. hsink = self.builder.get_object("header-sink")
  77. hsink.set_subtitle(row.serial_port.device)
  78. hst.set_visible_child(hsink)
  79. st = self.builder.get_object("stack")
  80. sink = self.builder.get_object("sink")
  81. st.set_visible_child(sink)
  82. def on_header_sink_back_clicked(self, data):
  83. # Show the Select page
  84. hst = self.builder.get_object("header-stack")
  85. hselect = self.builder.get_object("header-select")
  86. hst.set_visible_child(hselect)
  87. st = self.builder.get_object("stack")
  88. select = self.builder.get_object("select")
  89. st.set_visible_child(select)
  90. def on_header_sink_save_clicked(self, button):
  91. combo = self.builder.get_object("voltage-combobox")
  92. spin = self.builder.get_object("current-spinbutton")
  93. print("{} V".format(combo.get_active_text()))
  94. print("{} A".format(spin.get_value()))
  95. rev = self.builder.get_object("header-sink-save-revealer")
  96. rev.set_reveal_child(False)
  97. pdb_send_message(self.serial_port, 'write')
  98. def on_voltage_combobox_changed(self, combo):
  99. rev = self.builder.get_object("header-sink-save-revealer")
  100. rev.set_reveal_child(True)
  101. pdb_send_message(self.serial_port,
  102. 'set_v {}'.format(int(combo.get_active_text())*1000))
  103. def on_current_spinbutton_changed(self, spin):
  104. rev = self.builder.get_object("header-sink-save-revealer")
  105. rev.set_reveal_child(True)
  106. pdb_send_message(self.serial_port,
  107. 'set_i {}'.format(int(spin.get_value()*1000)))
  108. class Application(Gtk.Application):
  109. def __init__(self, *args, **kwargs):
  110. super().__init__(*args, application_id="com.clayhobbs.pd-buddy-gtk",
  111. **kwargs)
  112. self.window = None
  113. def do_startup(self):
  114. Gtk.Application.do_startup(self)
  115. self.builder = Gtk.Builder()
  116. self.builder.add_from_file("data/pd-buddy-gtk.ui")
  117. self.builder.connect_signals(Handler(self.builder))
  118. def do_activate(self):
  119. # We only allow a single window and raise any existing ones
  120. if not self.window:
  121. # Windows are associated with the application
  122. # when the last one is closed the application shuts down
  123. self.window = self.builder.get_object("pdb-window")
  124. self.add_window(self.window)
  125. self.window.set_wmclass("PD Buddy Configuration",
  126. "PD Buddy Configuration")
  127. self.window.present()
  128. if __name__ == "__main__":
  129. app = Application()
  130. app.run(sys.argv)