IdeasXWSCGUI.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import sys
  2. import time
  3. from PyQt5 import QtCore, QtGui, QtWidgets, QtSql
  4. from mainwindow import Ui_MainWindow
  5. from ideasxdevice import Ui_IdeasXDevice
  6. from WorkstationClientClass import WorkstationClientClass
  7. from ParsingToolsClass import ParsingTools
  8. def generateMACID():
  9. import numpy as np
  10. macID = np.random.randint(255, size=5)
  11. macStr = ""
  12. for val in macID:
  13. macStr = macStr+ format(val, 'x') + ":"
  14. return macStr[:-1]
  15. def generateRSSI():
  16. import numpy as np
  17. rssi = np.random.randint(80)
  18. rssiStr = "RSSI: -" + str(rssi) + "dBm"
  19. return rssiStr
  20. def generateSOC():
  21. import numpy as np
  22. soc = np.random.randint(100)
  23. socStr = "Battery: " + str(soc) + "%"
  24. return socStr
  25. def generateStatus():
  26. import numpy as np
  27. hr = np.random.randint(12) + 1
  28. min = np.random.randint(60)
  29. ampm = np.random.randint(1)
  30. statusStr = "Last Update: " + str(hr) + ":" + str(min)
  31. return statusStr
  32. class IdeasXEncoder(QtWidgets.QWidget):
  33. def __init__(self, wsc, encoder): #, encoderID, encoderRSSI, encoderBattery, encoderStatus):
  34. super(IdeasXEncoder, self).__init__()
  35. self.ui = Ui_IdeasXDevice()
  36. self.ui.setupUi(self)
  37. # self.ui.labelModuleID.setText(encoderID)
  38. # self.ui.labelRSSI.setText(encoderRSSI)
  39. # self.ui.labelBattery.setText(encoderBattery)
  40. # self.ui.labelStatus.setText("I don't really have something here yet...")
  41. self.parserTools = ParsingTools()
  42. self.wsc = wsc
  43. self.ui.labelModuleID.setText(self.parserTools.macToString(encoder['module_id']))
  44. self.ui.labelRSSI.setText("RSSI: " + str(encoder['rssi']) + "dBm")
  45. self.ui.labelBattery.setText("Battery: " + str(self.parserTools.calculateSOC(encoder['soc'])) + "%" +
  46. " (" + str(round(self.parserTools.calculateVCell(encoder['vcell']), 3)) +"V)")
  47. self.ui.labelStatus.setText("Last Update: " + time.ctime(encoder['time']))
  48. self.ui.buttonActivate.clicked.connect(self.activateEncoder)
  49. deviceMenu = QtWidgets.QMenu()
  50. deviceMenu.addSection("General Actions")
  51. deviceMenu.addAction("Pair Encoder with Actuator")
  52. deviceMenu.addAction("Train Adaptive Switch")
  53. deviceMenu.addAction("Configure Module")
  54. deviceMenu.addSection("Encoder Commands")
  55. deviceMenu.addAction("Shutdown Encoder")
  56. deviceMenu.addAction("Restart Encoder")
  57. deviceMenu.addAction("Update Firmware")
  58. #deviceMenu.setLayoutDirection(QtCore.Qt.LeftToRight)
  59. self.ui.buttonMenu.setPopupMode(2)
  60. self.ui.buttonMenu.setMenu(deviceMenu)
  61. self.ui.buttonMenu.setStyleSheet("* { padding-right: 3px } QToolButton::menu-indicator { image: none }")
  62. # self.ui.buttonMenu.setToolbarButtonSytel
  63. def activateEncoder(self):
  64. if self.ui.buttonActivate.text() == "Activate":
  65. print("Activating Encoder: " + self.ui.labelModuleID.text())
  66. self.ui.buttonActivate.setText("Deactivate")
  67. else:
  68. print("Deactivating Encoder: " + self.ui.labelModuleID.text())
  69. self.ui.buttonActivate.setText("Activate")
  70. # self.widgetText = QtWidgets.QLabel(generateMACID())
  71. # self.widgetButton = QtWidgets.QPushButton("Activate")
  72. # self.layout = QtWidgets.QHBoxLayout()
  73. # self.layout.addWidget(self.widgetText)
  74. # self.layout.addWidget(self.widgetButton)
  75. # self.setLayout(self.layout)
  76. # font = QtGui.QFont()
  77. # font.setFamily("Roboto Condensed")
  78. # font.setPointSize(20)
  79. # font.setItalic(False)
  80. # self.widgetText.setFont(font)
  81. class IdeasXMainWindow(QtWidgets.QMainWindow):
  82. def __init__(self):
  83. super(IdeasXMainWindow, self).__init__()
  84. self.ui = Ui_MainWindow()
  85. self.ui.setupUi(self)
  86. 'module_id', b'\x18\xfe4\xf1\xf2\x8d'
  87. self.encoders = {'23:4d:12:2a:ad': {'module_id': b'\x18\xfe4\xf1\xf2\x8d', 'rssi': -54, 'soc': 32432},
  88. '43:3d:12:3a:ad': {'module_id': b'\x18\xfe4\xf1\xf2\x8d', 'rssi': -73, 'soc': 24243}}
  89. # self.wsc = WorkstationClientClass()
  90. # self.wsc.guiStartWorkstationClient('10.41.0.1')
  91. # self.wsc.refreshCallBack(self.refreshList)
  92. #self.ui.searchEncoder.textChanged.connect(self.filterEncoders)
  93. # itemN = QtWidgets.QListWidgetItem()
  94. # widget = IdeasXEncoder()
  95. # itemN.setSizeHint(widget.minimumSize())
  96. # self.ui.listEncoder.addItem(itemN)
  97. # self.ui.listEncoder.setItemWidget(itemN, widget)
  98. #widgetLayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
  99. #widget.setLayout(widgetLayout)
  100. # self.widgetIndex = []
  101. # self.widgetNames = []
  102. # self.itemIndex = []
  103. # for i in range(100):
  104. # self.itemIndex.append(QtWidgets.QListWidgetItem())
  105. # self.widgetIndex.append(IdeasXEncoder())
  106. # itemN = self.itemIndex[i]
  107. # widget = self.widgetIndex[i]
  108. # itemN.setSizeHint(widget.minimumSize())
  109. #
  110. # #widget = IdeasXEncoder()
  111. # self.ui.listEncoder.addItem(itemN)
  112. # self.ui.listEncoder.setItemWidget(itemN, widget)
  113. # self.widgetNames.append(widget.ui.labelModuleID.text())
  114. #
  115. # print("List of Encoder IDs: ")
  116. # print(self.widgetNames)
  117. self.wsc = WorkstationClientClass()
  118. #self.wsc.attachRefreshCallback(self.generateEncoderList)
  119. self.wsc.guiStartWorkstationClient('ideasx.duckdns.org')
  120. #self.generateEncoderList()
  121. def generateEncoders(self):
  122. self.widgetIndex = []
  123. self.itemIndex = []
  124. for i in range(100):
  125. itemN = QtWidgets.QListWidgetItem()
  126. self.widgetIndex.append(IdeasXEncoder(self.wsc))
  127. widget = self.widgetIndex[i]
  128. itemN.setSizeHint(widget.minimumSize())
  129. #widget = IdeasXEncoder()
  130. self.ui.listEncoder.addItem(itemN)
  131. self.ui.listEncoder.setItemWidget(itemN, widget)
  132. #
  133. def generateEncoder(self, wsc, encoder):
  134. itemN = QtWidgets.QListWidgetItem()
  135. #self.widgetIndex.append(IdeasXEncoder())
  136. widget = IdeasXEncoder(wsc, encoder)#self.widgetIndex[-1]
  137. itemN.setSizeHint(widget.minimumSize())
  138. self.ui.listEncoder.addItem(itemN)
  139. self.ui.listEncoder.setItemWidget(itemN, widget)
  140. return widget
  141. def clearEncoders(self):
  142. self.ui.listEncoder.clear()
  143. self.widgetIndex = []
  144. def generateEncoderList(self):
  145. self.clearEncoders()
  146. for encoderMAC in self.wsc.encoders.keys():
  147. self.generateEncoder(self.wsc, self.wsc.encoders[encoderMAC])
  148. def filterEncoders(self):
  149. searchInput = self.ui.searchEncoder.text()
  150. if searchInput == "":
  151. print("Search field is clear")
  152. for item in self.itemIndex:
  153. self.ui.listEncoder.setItemHidden(item, False)
  154. else:
  155. for item in self.itemIndex:
  156. self.ui.listEncoder.setItemHidden(item, False)
  157. print("Seaching based on "+ searchInput)
  158. # hid all items
  159. # make only items in view searchable
  160. def encoderSettingsDialog(self):
  161. print("Open Settings Dialog")
  162. if __name__ == "__main__":
  163. app = QtWidgets.QApplication(sys.argv)
  164. app.setWindowIcon(QtGui.QIcon('icon/ideasx.png'))
  165. mainWindow = IdeasXMainWindow()
  166. mainWindow.show()
  167. timer = QtCore.QTimer()
  168. timer.timeout.connect(mainWindow.generateEncoderList)
  169. timer.start(1000)
  170. time.sleep(2)
  171. mainWindow.generateEncoderList()
  172. sys.exit(app.exec_())