wsc_ui.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. import logging
  2. import sys
  3. import time
  4. import sip
  5. from wsc_tools import ParsingTools, EncoderConfig
  6. from wsc_client import WSC_Client
  7. from wsc_device_encoder import EncoderUI
  8. from PyQt5 import QtCore, QtGui, QtWidgets
  9. from pyqt.mainwindow import Ui_MainWindow
  10. from pyqt.ideasxdevice import Ui_IdeasXDevice
  11. from pyqt.encoderconfigurationdialog import Ui_SwitchConfigDialog
  12. from pyqt.devicedialog import Ui_Dialog
  13. logging.basicConfig( level=logging.DEBUG)
  14. log = logging.getLogger("wsc_ui")
  15. class UIDeviceManager():
  16. def __init__(self, deviceClass, wsc):
  17. self.__devices = {}
  18. self.__deviceClass = deviceClass
  19. self.__deviceLayout = QtWidgets.QVBoxLayout()
  20. self.__deviceLayout.setAlignment(QtCore.Qt.AlignTop)
  21. self.__deviceLayout.setContentsMargins(9, 0, 9, 0)
  22. self.__deviceLayout.setSpacing(0)
  23. self.__wsc = wsc
  24. def restart(self):
  25. deviceClass = self.__deviceClass
  26. wsc = self.__wsc
  27. self.__init(deviceClass, wsc)
  28. def refreshDevices(self, devices):
  29. for deviceMAC in list(devices.keys()):
  30. if deviceMAC in self.__devices.keys():
  31. self.__devices[deviceMAC].updateDevice(devices[deviceMAC])
  32. else:
  33. self.__devices[deviceMAC] = self.__deviceClass(devices[deviceMAC])
  34. self.__deviceLayout.addWidget(self.__devices[deviceMAC])
  35. for deviceMAC in list(self.__devices.keys()):
  36. if deviceMAC not in devices.keys():
  37. self.removeDevice(deviceMAC)
  38. def removeDevice(self, deviceMAC):
  39. self.__deviceLayout.removeWidget(self.__devices[deviceMAC])
  40. sip.delete(self.__devices[deviceMAC])
  41. self.__devices.pop(deviceMAC)
  42. def returnLayout(self):
  43. return self.__deviceLayout
  44. def filterDevices(self, searchPhase):
  45. log.debug("This currently doesn't work")
  46. def printDevices(self):
  47. print(self.__devices)
  48. class MainWindow(QtWidgets.QMainWindow):
  49. def __init__(self, wsc):
  50. super(MainWindow, self).__init__()
  51. self.__ui = Ui_MainWindow()
  52. self.__ui.setupUi(self)
  53. self.__wsc = wsc
  54. p = self.__ui.contentEncoder.palette()
  55. p.setColor(self.backgroundRole(), QtCore.Qt.white)
  56. self.__ui.contentEncoder.setPalette(p)
  57. self.__ui.statusMessageWidget = QtWidgets.QLabel()
  58. self.__ui.statusMessageWidget.setText("Starting WSC...")
  59. self.__ui.statusMessageWidget.setAlignment(QtCore.Qt.AlignLeft)
  60. self.__ui.statusbar.addWidget(self.__ui.statusMessageWidget, 1)
  61. self.__ui.tabWidget.setCurrentIndex(0) # set to main window
  62. self.__org = 'IdeasX'
  63. self.__app = 'Workstation-Client'
  64. self.restoreSettings()
  65. self.refreshSerialPorts()
  66. self.selectSerialPort()
  67. #setup UI signals
  68. #self.__ui.buttonSettings.clicked.connect(self.updateBrokerSettings)
  69. self.__ui.buttonBoxNetwork.button(QtWidgets.QDialogButtonBox.Apply).clicked.connect(self.updateBrokerSettings)
  70. self.__ui.buttonBoxNetwork.button(QtWidgets.QDialogButtonBox.Cancel).clicked.connect(self.restoreBrokerSettings)
  71. self.__ui.buttonRefreshPorts.clicked.connect(self.refreshSerialPorts)
  72. #self.__ui.selectPort.activated.connect(self.selectSerialPort)
  73. #self.__ui.selectAP.valueChanged.connect(self.selectDisplayedAP)
  74. self.__ui.wifiSSID.textEdited.connect(self.updateAP)
  75. self.__ui.wifiPassword.textEdited.connect(self.updateAP)
  76. self.__ui.buttonBoxDevice.button(QtWidgets.QDialogButtonBox.Save).clicked.connect(self.saveEncoderConfiguration)
  77. # self.__ui.selectPort.activated.connect(self.updatePort)
  78. #self.__ui.buttonBoxDevice.button(QtWidgets.QDialog.Save).clicked.connect(self.__wsc.encoderConfig.)
  79. def updateAP(self):
  80. #index = self.__ui.selectAP.value() - 1
  81. index = 0
  82. self.__AccessPoints[index][0] = self.__ui.wifiSSID.text()
  83. self.__AccessPoints[index][1] = self.__ui.wifiPassword.text()
  84. def selectDisplayedAP(self):
  85. #print(self.__ui.selectAP.value()-1)
  86. #index = self.__ui.selectAP.value() - 1
  87. index = 0
  88. ssid = self.__AccessPoints[index][0]
  89. password = self.__AccessPoints[index][1]
  90. self.__ui.wifiSSID.setText(ssid)
  91. self.__ui.wifiPassword.setText(password)
  92. def saveEncoderConfiguration(self):
  93. log.info("storing wi-fi credientials as defaults")
  94. settings = QtCore.QSettings(self.__org, self.__app)
  95. settings.beginGroup("Accesspoints")
  96. settings.setValue("Credentials", self.__AccessPoints)
  97. settings.endGroup()
  98. try:
  99. log.info("training device")
  100. self.setStatusBarUpdate("Training Device...")
  101. self.__wsc.encoderConfig.setWifiAPs(self.__AccessPoints, self.__ui.selectPort.currentText())
  102. self.setStatusBarUpdate("Device Successfully Trained")
  103. except Exception as e:
  104. self.__wsc.encoderConfig.close()
  105. log.warning("failure training device")
  106. log.warning(str(e))
  107. self.setStatusBarUpdate("Device Training Failed: " + str(e))
  108. def selectSerialPort(self):
  109. port = self.__ui.selectPort.currentText()
  110. self.__wsc.encoderConfig.setPort(port)
  111. log.info("updated serial port to " + port)
  112. def refreshSerialPorts(self):
  113. ports = self.__wsc.encoderConfig.getPorts()
  114. self.__ui.selectPort.clear()
  115. self.__ui.selectPort.addItems(ports)
  116. self.__ui.selectPort.setEditable(True) # add to UI file
  117. def setEncoderLayout(self, layout):
  118. self.__ui.contentEncoder.setLayout(layout)
  119. def setStatusBarMessage(self, msg):
  120. self.__ui.statusbar.clearMessage()
  121. self.__ui.statusMessageWidget.setText(msg)
  122. def setStatusBarUpdate(self, msg):
  123. self.__ui.statusbar.showMessage(msg, 1000)
  124. def saveSettings(self):
  125. # MainWindow Settings
  126. settings = QtCore.QSettings(self.__org, self.__app)
  127. settings.beginGroup("MainWindow")
  128. settings.setValue("size", self.size())
  129. settings.setValue("pos", self.pos())
  130. settings.endGroup()
  131. def updateBrokerSettings(self):
  132. print(self.__ui.networkBroker.text())
  133. self.__NetworkBroker = self.__ui.networkBroker.text()
  134. self.__LocalBroker = self.__ui.localBroker.text()
  135. self.__NetworkPort = int(self.__ui.networkPort.text())
  136. self.__LocalPort = int(self.__ui.localPort.text())
  137. settings = QtCore.QSettings(self.__org, self.__app)
  138. settings.beginGroup("Broker")
  139. settings.setValue('NetworkBroker', self.__NetworkBroker)
  140. settings.setValue('NetworkPort', self.__NetworkPort)
  141. settings.setValue('LocalBroker', self.__LocalBroker)
  142. settings.setValue('LocalPort', self.__LocalPort)
  143. settings.endGroup()
  144. self.saveSettings()
  145. self.__wsc.restartWSC()
  146. def restoreSettings(self):
  147. settings = QtCore.QSettings(self.__org, self.__app)
  148. settings.beginGroup("MainWindow")
  149. self.resize(settings.value("size", QtCore.QSize(525, 648)))
  150. self.move(settings.value("pos", QtCore.QPoint(0, 0)))
  151. settings.endGroup()
  152. settings.beginGroup("Broker")
  153. self.__NetworkBroker = settings.value('NetworkBroker', 'ideasx.duckdns.org')
  154. self.__NetworkPort = settings.value('NetworkPort', 1883)
  155. self.__LocalBroker = settings.value('LocalBroker', '10.42.0.1')
  156. self.__LocalPort = settings.value('LocalPort', 1883)
  157. settings.endGroup()
  158. self.__ui.networkBroker.setText(self.__NetworkBroker)
  159. self.__ui.networkPort.setText(str(self.__NetworkPort))
  160. self.__ui.localBroker.setText(self.__LocalBroker)
  161. self.__ui.localPort.setText(str(self.__LocalPort))
  162. settings.beginGroup('OTAServer')
  163. self.__OTAServer = settings.value('OTAServer', 'ideasx.duckdns.org')
  164. settings.endGroup()
  165. self.__ui.otaServer.setText(self.__OTAServer)
  166. settings.beginGroup("Accesspoints")
  167. default_APs = [ ['curiousmuch-ThinkPad-T450s', '9dHM8nVi'],
  168. ['',''],
  169. ['',''],
  170. ['',''],
  171. ['',''] ]
  172. self.__AccessPoints = settings.value("Credentials", default_APs)
  173. #self.__AccessPoints = default_APs
  174. settings.endGroup()
  175. self.__ui.wifiSSID.setText(self.__AccessPoints[0][0])
  176. self.__ui.wifiPassword.setText(self.__AccessPoints[0][1])
  177. def restoreBrokerSettings(self):
  178. settings = QtCore.QSettings(self.__org, self.__app)
  179. settings.beginGroup("Broker")
  180. self.__NetworkBroker = settings.value('NetworkBroker', 'ideasx.duckdns.org')
  181. self.__NetworkPort = settings.value('NetworkPort', 1883)
  182. self.__LocalBroker = settings.value('LocalBroker', '10.42.0.1')
  183. self.__LocalPort = settings.value('LocalPort', 1883)
  184. settings.endGroup()
  185. self.__ui.networkBroker.setText(self.__NetworkBroker)
  186. self.__ui.networkPort.setText(str(self.__NetworkPort))
  187. self.__ui.localBroker.setText(self.__LocalBroker)
  188. self.__ui.localPort.setText(str(self.__LocalPort))
  189. def closeEvent(self, event):
  190. self.saveSettings()
  191. super(MainWindow, self).closeEvent(event)
  192. if __name__ == "__main__":
  193. app = QtWidgets.QApplication(['IdeasX Supervisor'])
  194. app.setWindowIcon(QtGui.QIcon('icon/logo/ideasx.png'))
  195. wsc = WSC_Client()
  196. mainWindow = MainWindow(wsc)
  197. encoderManager = UIDeviceManager(EncoderUI, wsc)
  198. mainWindow.setEncoderLayout(encoderManager.returnLayout())
  199. wsc.encoderUpdate.connect(encoderManager.refreshDevices)
  200. wsc.networkStatus.connect(mainWindow.setStatusBarMessage)
  201. wsc.networkUpdate.connect(mainWindow.setStatusBarUpdate)
  202. mainWindow.show()
  203. wsc.StartWorkstationClient(gui=True)
  204. sys.exit(app.exec_())