Simple RGB LED controller for Mac OS X
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

caselights 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #!/usr/bin/env python3
  2. # CaseLights Linux Qt System Tray client
  3. # depends on:
  4. # - python-pyqt5
  5. # - python-pyserial
  6. import sys
  7. import os.path
  8. import serial, serial.tools, serial.tools.list_ports
  9. from PyQt5 import QtWidgets, QtGui, QtCore
  10. from PyQt5.QtWidgets import QSystemTrayIcon, QAction, QMenu
  11. from PyQt5.QtGui import QIcon, QPixmap
  12. from PyQt5.QtCore import QCoreApplication, QSettings
  13. class CaseLights():
  14. name = "CaseLights"
  15. vendor = "xythobuz"
  16. version = "0.1"
  17. iconPath = "/usr/share/pixmaps/"
  18. iconName = "caselights_icon.png"
  19. staticColors = [
  20. [ "Off", "0", "0", "0", None ],
  21. [ "Red", "255", "0", "0", None ],
  22. [ "Green", "0", "255", "0", None ],
  23. [ "Blue", "0", "0", "255", None ],
  24. [ "White", "255", "255", "255", None ],
  25. ]
  26. usedPort = None
  27. serial = None
  28. menu = None
  29. portMenu = None
  30. portActions = None
  31. refreshAction = None
  32. quitAction = None
  33. def __init__(self):
  34. app = QtWidgets.QApplication(sys.argv)
  35. QCoreApplication.setApplicationName(self.name)
  36. if not QSystemTrayIcon.isSystemTrayAvailable():
  37. print("System Tray is not available on this platform!")
  38. sys.exit(0)
  39. self.readSettings()
  40. if self.usedPort is not None:
  41. self.connect()
  42. self.menu = QMenu()
  43. colorMenu = QMenu("&Colors")
  44. for color in self.staticColors:
  45. color[4] = QAction(color[0])
  46. colorMenu.addAction(color[4])
  47. colorMenu.triggered.connect(self.setStaticColor)
  48. self.menu.addMenu(colorMenu)
  49. lightMenu = QMenu("&UV-Light")
  50. lightOnAction = QAction("O&n")
  51. lightOnAction.triggered.connect(self.lightsOn)
  52. lightMenu.addAction(lightOnAction)
  53. lightOffAction = QAction("O&ff")
  54. lightOffAction.triggered.connect(self.lightsOff)
  55. lightMenu.addAction(lightOffAction)
  56. self.menu.addMenu(lightMenu)
  57. self.refreshSerialPorts()
  58. self.quitAction = QAction("&Quit")
  59. self.quitAction.triggered.connect(self.exit)
  60. self.menu.addAction(self.quitAction)
  61. iconPathName = ""
  62. if os.path.isfile(self.iconName):
  63. iconPathName = self.iconName
  64. elif os.path.isfile(self.iconPath + self.iconName):
  65. iconPathName = self.iconPath + self.iconName
  66. else:
  67. print("no icon found")
  68. icon = QIcon()
  69. if iconPathName is not "":
  70. pic = QPixmap(32, 32)
  71. pic.load(iconPathName)
  72. icon = QIcon(pic)
  73. trayIcon = QSystemTrayIcon(icon)
  74. trayIcon.setToolTip(self.name + " " + self.version)
  75. trayIcon.setContextMenu(self.menu)
  76. trayIcon.setVisible(True)
  77. sys.exit(app.exec_())
  78. def exit(self):
  79. if self.serial is not None:
  80. if self.serial.is_open:
  81. print("turning off lights")
  82. self.serial.write(b'RGB 0 0 0\n')
  83. self.serial.write(b'UV 0\n')
  84. print("closing connection")
  85. self.serial.close()
  86. QCoreApplication.quit()
  87. def readSettings(self):
  88. settings = QSettings(self.vendor, self.name)
  89. self.usedPort = settings.value("serial_port")
  90. if self.usedPort is not None:
  91. print("serial port stored: " + self.usedPort)
  92. else:
  93. print("no serial port stored")
  94. def writeSettings(self):
  95. settings = QSettings(self.vendor, self.name)
  96. settings.setValue("serial_port", self.usedPort)
  97. if self.usedPort is not None:
  98. print("storing serial port: " + self.usedPort)
  99. else:
  100. print("not storing any serial port")
  101. del settings
  102. def refreshSerialPorts(self):
  103. self.portMenu = QMenu("Port")
  104. ports = serial.tools.list_ports.comports()
  105. self.portActions = []
  106. for port in ports:
  107. action = QAction(port.device)
  108. self.portActions.append(action)
  109. self.portMenu.addAction(action)
  110. self.portMenu.triggered.connect(self.selectSerialPort)
  111. if self.refreshAction == None:
  112. self.refreshAction = QAction("&Refresh")
  113. self.refreshAction.triggered.connect(self.refreshSerialPorts)
  114. self.portMenu.addAction(self.refreshAction)
  115. self.menu.insertMenu(self.quitAction, self.portMenu)
  116. def selectSerialPort(self, action):
  117. self.usedPort = action.text()
  118. self.writeSettings()
  119. if self.connect():
  120. self.portMenu.setActiveAction(action)
  121. def connect(self):
  122. if self.usedPort is None:
  123. print("not connecting to any serial port")
  124. return False
  125. if self.serial is not None:
  126. print("closing previous port")
  127. self.serial.close()
  128. self.serial = serial.Serial()
  129. self.serial.port = self.usedPort
  130. self.serial.baudrate = 115200
  131. self.serial.open()
  132. if self.serial.is_open:
  133. print("connected to: " + self.usedPort)
  134. else:
  135. print("error connecting to: " + self.usedPort)
  136. return self.serial.is_open
  137. def setStaticColor(self, action):
  138. for color in self.staticColors:
  139. if color[4] is action:
  140. if self.serial.is_open:
  141. r = str.encode(color[1])
  142. g = str.encode(color[2])
  143. b = str.encode(color[3])
  144. self.serial.write(b'RGB ' + r + b' ' + g + b' ' + b + b'\n')
  145. else:
  146. print("not connected")
  147. return True
  148. print("color not found")
  149. return False
  150. def lightsOn(self):
  151. if self.serial.is_open:
  152. self.serial.write(b'UV 1\n')
  153. else:
  154. print("not connected")
  155. def lightsOff(self):
  156. if self.serial.is_open:
  157. self.serial.write(b'UV 0\n')
  158. else:
  159. print("not connected")
  160. if __name__ == "__main__":
  161. tray = CaseLights()