Browse Source

million mods

curiousmuch 7 years ago
parent
commit
f1bb1bc712
84 changed files with 1012 additions and 913 deletions
  1. 30 11
      IdeasXWSCBackend.py
  2. 0 201
      IdeasXWSCGUI.py
  3. 208 0
      IdeasXWSCView.py
  4. 53 0
      ParsingTools.py
  5. 0 24
      ParsingToolsClass.py
  6. 64 0
      Qt/encoderconfigurationdialog.ui
  7. 167 55
      Qt/ideasxdevice.ui
  8. 89 95
      Qt/mainwindow.ui
  9. 0 379
      Qt/mainwindow.ui.autosave
  10. 48 0
      encoderconfigurationdialog.py
  11. 0 0
      examples/IdeasXDatabaseManager.py
  12. 0 0
      icon/battery/Archive/battery-caution-charging-symbolic.svg
  13. 0 0
      icon/battery/Archive/battery-caution-symbolic.svg
  14. 0 0
      icon/battery/Archive/battery-empty-charging-symbolic.svg
  15. 0 0
      icon/battery/Archive/battery-empty-symbolic.svg
  16. 0 0
      icon/battery/Archive/battery-full-charged-symbolic.svg
  17. 0 0
      icon/battery/Archive/battery-full-charging-symbolic.svg
  18. 0 0
      icon/battery/Archive/battery-full-symbolic.svg
  19. 0 0
      icon/battery/Archive/battery-good-charging-symbolic.svg
  20. 0 0
      icon/battery/Archive/battery-good-symbolic.svg
  21. 0 0
      icon/battery/Archive/battery-low-charging-symbolic.svg
  22. 0 0
      icon/battery/Archive/battery-low-symbolic.svg
  23. 0 0
      icon/battery/Archive/battery-missing-symbolic.svg
  24. BIN
      icon/battery/battery-caution-charging-symbolic.png
  25. BIN
      icon/battery/battery-caution-symbolic.png
  26. BIN
      icon/battery/battery-empty-charging-symbolic.png
  27. BIN
      icon/battery/battery-empty-symbolic.png
  28. BIN
      icon/battery/battery-full-charged-symbolic.png
  29. BIN
      icon/battery/battery-full-symbolic.png
  30. BIN
      icon/battery/battery-good-charging-symbolic.png
  31. BIN
      icon/battery/battery-good-symbolic.png
  32. BIN
      icon/battery/battery-low-charging-symbolic.png
  33. BIN
      icon/battery/battery-low-symbolic.png
  34. BIN
      icon/battery/original/battery-caution-charging-symbolic.png
  35. BIN
      icon/battery/original/battery-caution-symbolic.png
  36. BIN
      icon/battery/original/battery-empty-charging-symbolic.png
  37. BIN
      icon/battery/original/battery-empty-symbolic.png
  38. BIN
      icon/battery/original/battery-full-charged-symbolic.png
  39. BIN
      icon/battery/original/battery-full-symbolic.png
  40. BIN
      icon/battery/original/battery-good-charging-symbolic.png
  41. BIN
      icon/battery/original/battery-good-symbolic.png
  42. BIN
      icon/battery/original/battery-low-charging-symbolic.png
  43. BIN
      icon/battery/original/battery-low-symbolic.png
  44. BIN
      icon/devicetype/modulev3.png
  45. BIN
      icon/devicetype/modulev3a.png
  46. BIN
      icon/devicetype/modulev3b.png
  47. 0 0
      icon/logo/ideasx.png
  48. 0 0
      icon/logo/ideasx2.png
  49. 0 0
      icon/network/Archive/arc/network-wired-acquiring-symbolic.svg
  50. 0 0
      icon/network/Archive/arc/network-wired-disconnected-symbolic.svg
  51. 0 0
      icon/network/Archive/arc/network-wired-no-route-symbolic.svg
  52. 0 0
      icon/network/Archive/arc/network-wired-offline-symbolic.svg
  53. 0 0
      icon/network/Archive/arc/network-wired-symbolic.svg
  54. 0 0
      icon/network/Archive/arc/network-wireless-acquiring-symbolic.svg
  55. 0 0
      icon/network/Archive/arc/network-wireless-connected-symbolic.svg
  56. 0 0
      icon/network/Archive/arc/network-wireless-encrypted-symbolic.svg
  57. 0 0
      icon/network/Archive/arc/network-wireless-no-route-symbolic.svg
  58. 0 0
      icon/network/Archive/arc/network-wireless-offline-symbolic.svg
  59. 0 0
      icon/network/Archive/arc/network-wireless-signal-excellent-symbolic.svg
  60. 0 0
      icon/network/Archive/arc/network-wireless-signal-good-symbolic.svg
  61. 0 0
      icon/network/Archive/arc/network-wireless-signal-none-symbolic.svg
  62. 0 0
      icon/network/Archive/arc/network-wireless-signal-ok-symbolic.svg
  63. 0 0
      icon/network/Archive/arc/network-wireless-signal-weak-symbolic.svg
  64. BIN
      icon/network/network-wireless-offline-symbolic.png
  65. BIN
      icon/network/network-wireless-signal-excellent-symbolic.png
  66. BIN
      icon/network/network-wireless-signal-good-symbolic.png
  67. BIN
      icon/network/network-wireless-signal-ok-symbolic.png
  68. BIN
      icon/network/network-wireless-signal-weak-symbolic.png
  69. BIN
      icon/network/original/network-wireless-offline-symbolic.png
  70. BIN
      icon/network/original/network-wireless-signal-excellent-symbolic.png
  71. BIN
      icon/network/original/network-wireless-signal-good-symbolic.png
  72. BIN
      icon/network/original/network-wireless-signal-ok-symbolic.png
  73. BIN
      icon/network/original/network-wireless-signal-weak-symbolic.png
  74. 275 0
      icon/svg/icons.svg
  75. BIN
      icon/switch/switch-adaptive-disabled.png
  76. BIN
      icon/switch/switch-adaptive-enabled.png
  77. BIN
      icon/switch/switch-one-disabled.png
  78. BIN
      icon/switch/switch-one-enabled.png
  79. BIN
      icon/switch/switch-two-disabled.png
  80. BIN
      icon/switch/switch-two-enabled.png
  81. 64 21
      ideasxdevice.py
  82. 0 74
      ideasxdevice2.py
  83. 0 39
      listwidgetexample.py
  84. 14 14
      mainwindow.py

+ 30 - 11
WorkstationClientClass.py → IdeasXWSCBackend.py

@@ -22,7 +22,7 @@ This class requires the following functionality:
 import sys
 import time
 import collections
-from ParsingToolsClass import ParsingTools
+from ParsingTools import ParsingTools
 
 try:
     import paho.mqtt.client as mqtt
@@ -44,9 +44,18 @@ try:
 except ImportError: 
     print("The python classes for IdeasX are missing. Try running the Makefile in" +
             "ideasX-messages.")
+
+from PyQt5.QtCore import QObject, pyqtSignal
+    
+    
+class IdeasXWSCNetworkThread(QObject): 
+    
+    # define Qt signals (I don't understand why this is here) 
+    encoderUpdate = pyqtSignal([dict], name='encoderUpdate')
+    
     
-class WorkstationClientClass(): 
     def __init__(self, settingFile=None, clientID = None, debug=True, mqttdebug=True):
+        super(IdeasXWSCNetworkThread, self).__init__()
         # Private Class Flags and Variables
         self.__clientID = clientID
         self.__settingFile = settingFile
@@ -71,7 +80,7 @@ class WorkstationClientClass():
         self._dataParser = IdeasXMessages.DataMessage()
         self._commandParser = IdeasXMessages.CommandMessage()
         self._parserTools = ParsingTools()
-
+        
         # MQTT Client Object
         self._mqttc = mqtt.Client(self.__clientID, clean_session=True, userdata=None, protocol='MQTTv311')
         
@@ -136,16 +145,14 @@ class WorkstationClientClass():
                     temp_list.append((field[0].name, field[1]))  
                 temp_list.append(('time', time.time()))          
                 self.encoders[macID] = collections.OrderedDict(temp_list)
+                self.encoderUpdate.emit(self.getDevices())
             else:
                 try: 
                     self.encoders.pop(macID)
+                    self.encoderUpdate.emit()
                 except KeyError: 
                     self.printError("Encoder ID " +macID+" is not stored")
             
-            if self.__refreshCb: 
-                print("FUUUUUUUUUUUUUUUUUCK")
-                self.__refreshCb()
-            
             if self.__debug:
                 for encoder, fields in zip(self.encoders.keys(), self.encoders.values()): 
                     print(str(encoder) +" : "+ str(fields))
@@ -155,7 +162,11 @@ class WorkstationClientClass():
             if self.__debug:
                 print("Raw Message: %s" %msg.payload)
             self.printLine()
-        
+            try: 
+                self.encoders.pop(msg.topic.split('/')[2])
+                self.encoderUpdate.emit(self.getDevices())
+            except: 
+                print("This is a fucking joke anyway")
 
 
         
@@ -212,6 +223,8 @@ class WorkstationClientClass():
     def attachRefreshCallback(self, cb):
         self.__refreshCb = cb
         
+    def getDevices(self):
+        return self.encoders
             
     def activateEncoder(self, deviceMACAddress, deviceType=None):
         '''
@@ -275,11 +288,17 @@ class WorkstationClientClass():
     def printInfo(self, msgStr):
         print("WSC: " + msgStr)
         
+class IdeasXDeviceTypes():
+    def __init__(self): 
+        self.encoder = 'encoder'
+        self.actuator = 'actuator'
+                
+        
 
 if __name__ == "__main__": 
     Host = "ideasx.duckdns.org"
-    Host = "192.168.0.101"
-    Host = "10.42.0.1"
+#    Host = "192.168.0.101"
+#    Host = "10.42.0.1"
     Port = 1883 
     KeepAlive = 30
     msgFlag = False;     
@@ -290,7 +309,7 @@ if __name__ == "__main__":
     
     
     wsc = WorkstationClientClass()
-    
+        
     if cmdTest: 
         wsc.cmdStartWorkstationClient(Host, Port, KeepAlive)
     else: 

+ 0 - 201
IdeasXWSCGUI.py

@@ -1,201 +0,0 @@
-import sys
-import time
-from PyQt5 import QtCore, QtGui, QtWidgets, QtSql
-from mainwindow import Ui_MainWindow
-from ideasxdevice import Ui_IdeasXDevice
-from WorkstationClientClass import WorkstationClientClass
-from ParsingToolsClass import ParsingTools
-
-
-def generateMACID():
-    import numpy as np
-    macID = np.random.randint(255, size=5)
-    macStr = ""
-    for val in macID: 
-        macStr = macStr+ format(val, 'x') + ":" 
-    return macStr[:-1]
-
-def generateRSSI():
-    import numpy as np 
-    rssi = np.random.randint(80)
-    rssiStr = "RSSI:  -" + str(rssi) + "dBm"
-    return rssiStr 
-
-def generateSOC():
-    import numpy as np
-    soc = np.random.randint(100)
-    socStr = "Battery:  " + str(soc) + "%"
-    return socStr
-    
-def generateStatus():
-    import numpy as np 
-    hr = np.random.randint(12) + 1
-    min = np.random.randint(60)
-    ampm = np.random.randint(1)
-    statusStr = "Last Update: " + str(hr) + ":" + str(min)
-    return statusStr
-
-class IdeasXEncoder(QtWidgets.QWidget):
-    def __init__(self, wsc, encoder): #, encoderID, encoderRSSI, encoderBattery, encoderStatus):
-        super(IdeasXEncoder, self).__init__()
-        self.ui = Ui_IdeasXDevice()
-        self.ui.setupUi(self)
-#         self.ui.labelModuleID.setText(encoderID)
-#         self.ui.labelRSSI.setText(encoderRSSI)
-#         self.ui.labelBattery.setText(encoderBattery)
-#         self.ui.labelStatus.setText("I don't really have something here yet...")
-        self.parserTools = ParsingTools()
-        self.wsc = wsc
-
-        self.ui.labelModuleID.setText(self.parserTools.macToString(encoder['module_id']))
-        self.ui.labelRSSI.setText("RSSI: " + str(encoder['rssi']) + "dBm")
-        self.ui.labelBattery.setText("Battery: " + str(self.parserTools.calculateSOC(encoder['soc'])) + "%" +
-                                     " (" + str(round(self.parserTools.calculateVCell(encoder['vcell']), 3)) +"V)")
-        self.ui.labelStatus.setText("Last Update: " + time.ctime(encoder['time']))
-        self.ui.buttonActivate.clicked.connect(self.activateEncoder)
-        
-        deviceMenu = QtWidgets.QMenu()
-        deviceMenu.addSection("General Actions")
-        deviceMenu.addAction("Pair Encoder with Actuator")
-        deviceMenu.addAction("Train Adaptive Switch")
-        deviceMenu.addAction("Configure Module")
-        deviceMenu.addSection("Encoder Commands")
-        deviceMenu.addAction("Shutdown Encoder")
-        deviceMenu.addAction("Restart Encoder")
-        deviceMenu.addAction("Update Firmware")
-        
-        #deviceMenu.setLayoutDirection(QtCore.Qt.LeftToRight)
-        self.ui.buttonMenu.setPopupMode(2)
-        self.ui.buttonMenu.setMenu(deviceMenu)
-        self.ui.buttonMenu.setStyleSheet("* { padding-right: 3px } QToolButton::menu-indicator { image: none }")
-#         self.ui.buttonMenu.setToolbarButtonSytel
-        
-        
-             
-    def activateEncoder(self):
-        if self.ui.buttonActivate.text() == "Activate":
-            print("Activating Encoder: " + self.ui.labelModuleID.text())
-            self.ui.buttonActivate.setText("Deactivate")
-        else: 
-            print("Deactivating Encoder: " + self.ui.labelModuleID.text())
-            self.ui.buttonActivate.setText("Activate")
-        
-#         self.widgetText = QtWidgets.QLabel(generateMACID())
-#         self.widgetButton = QtWidgets.QPushButton("Activate")
-#         self.layout = QtWidgets.QHBoxLayout()
-#         self.layout.addWidget(self.widgetText)
-#         self.layout.addWidget(self.widgetButton)
-#         self.setLayout(self.layout)
-#         font = QtGui.QFont()
-#         font.setFamily("Roboto Condensed")
-#         font.setPointSize(20)
-#         font.setItalic(False)
-#         self.widgetText.setFont(font)
-    
-
-class IdeasXMainWindow(QtWidgets.QMainWindow):
-    def __init__(self):
-        super(IdeasXMainWindow, self).__init__()
-        self.ui = Ui_MainWindow()
-        self.ui.setupUi(self)
-        'module_id', b'\x18\xfe4\xf1\xf2\x8d'
-        self.encoders = {'23:4d:12:2a:ad': {'module_id': b'\x18\xfe4\xf1\xf2\x8d', 'rssi': -54, 'soc': 32432}, 
-                         '43:3d:12:3a:ad': {'module_id': b'\x18\xfe4\xf1\xf2\x8d', 'rssi': -73, 'soc': 24243}}
-        
-#         self.wsc = WorkstationClientClass()
-#         self.wsc.guiStartWorkstationClient('10.41.0.1')
-#         self.wsc.refreshCallBack(self.refreshList)
-        
-        #self.ui.searchEncoder.textChanged.connect(self.filterEncoders)
-#         itemN = QtWidgets.QListWidgetItem()
-#         widget = IdeasXEncoder()
-#         itemN.setSizeHint(widget.minimumSize())
-#         self.ui.listEncoder.addItem(itemN)
-#         self.ui.listEncoder.setItemWidget(itemN, widget)
-        
-        #widgetLayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
-        #widget.setLayout(widgetLayout)
-        
-#         self.widgetIndex = []
-#         self.widgetNames = []
-#         self.itemIndex = []
-#         for i in range(100):
-#             self.itemIndex.append(QtWidgets.QListWidgetItem())
-#             self.widgetIndex.append(IdeasXEncoder())
-#             itemN = self.itemIndex[i]
-#             widget = self.widgetIndex[i]
-#             itemN.setSizeHint(widget.minimumSize())
-#          
-#             #widget = IdeasXEncoder()
-#             self.ui.listEncoder.addItem(itemN)
-#             self.ui.listEncoder.setItemWidget(itemN, widget)
-#             self.widgetNames.append(widget.ui.labelModuleID.text())
-#             
-#         print("List of Encoder IDs: ")
-#         print(self.widgetNames)
-        self.wsc = WorkstationClientClass()
-        #self.wsc.attachRefreshCallback(self.generateEncoderList)
-        self.wsc.guiStartWorkstationClient('ideasx.duckdns.org')
-        #self.generateEncoderList()
-        
-    def generateEncoders(self):
-        self.widgetIndex = []
-        self.itemIndex = []
-        for i in range(100):
-            itemN = QtWidgets.QListWidgetItem()
-            self.widgetIndex.append(IdeasXEncoder(self.wsc))
-            widget = self.widgetIndex[i]
-            itemN.setSizeHint(widget.minimumSize())
-         
-            #widget = IdeasXEncoder()
-            self.ui.listEncoder.addItem(itemN)
-            self.ui.listEncoder.setItemWidget(itemN, widget)
-#             
-    def generateEncoder(self, wsc, encoder):
-        itemN = QtWidgets.QListWidgetItem()
-        #self.widgetIndex.append(IdeasXEncoder())
-        widget = IdeasXEncoder(wsc, encoder)#self.widgetIndex[-1]
-        itemN.setSizeHint(widget.minimumSize())
-        self.ui.listEncoder.addItem(itemN)
-        self.ui.listEncoder.setItemWidget(itemN, widget)
-        return widget
-        
-    def clearEncoders(self):
-        self.ui.listEncoder.clear()
-        self.widgetIndex = []
-        
-    def generateEncoderList(self):
-        self.clearEncoders()
-        for encoderMAC in self.wsc.encoders.keys():
-            self.generateEncoder(self.wsc, self.wsc.encoders[encoderMAC])
-            
-    def filterEncoders(self):
-        searchInput = self.ui.searchEncoder.text()
-        if searchInput == "":
-            print("Search field is clear")
-            for item in self.itemIndex:
-                self.ui.listEncoder.setItemHidden(item, False)
-        else:
-            for item in self.itemIndex: 
-                self.ui.listEncoder.setItemHidden(item, False)
-            print("Seaching based on "+ searchInput)
-            # hid all items 
-            # make only items in view searchable 
-            
-    def encoderSettingsDialog(self):
-        print("Open Settings Dialog")
-        
-if __name__ == "__main__":
-    app = QtWidgets.QApplication(sys.argv)
-    app.setWindowIcon(QtGui.QIcon('icon/ideasx.png'))
-    mainWindow = IdeasXMainWindow()
-    mainWindow.show()
-    
-    timer = QtCore.QTimer()
-    timer.timeout.connect(mainWindow.generateEncoderList)
-    timer.start(1000)
-    time.sleep(2)
-    mainWindow.generateEncoderList()
-     
-    sys.exit(app.exec_())
-    

+ 208 - 0
IdeasXWSCView.py

@@ -0,0 +1,208 @@
+import sys
+import time
+import sip
+from PyQt5 import QtCore, QtGui, QtWidgets
+from mainwindow import Ui_MainWindow
+from ideasxdevice import Ui_IdeasXDevice
+from IdeasXWSCBackend import IdeasXWSCNetworkThread
+from ParsingTools import ParsingTools
+from encoderconfigurationdialog import Ui_SwitchConfigDialog
+
+class IdeasXDeviceManager():
+    def __init__(self, deviceClass, wsc): 
+        self.__devices = {} 
+        self.__deviceClass = deviceClass
+        self.__deviceLayout = QtWidgets.QVBoxLayout()
+        self.__deviceLayout.setAlignment(QtCore.Qt.AlignTop)
+        self.__deviceLayout.setContentsMargins(9, 0, 9, 0)
+        self.__deviceLayout.setSpacing(0)
+        self.__wsc = wsc
+          
+    def refreshDevices(self, devices):
+        for deviceMAC in devices.keys(): 
+            if deviceMAC in self.__devices.keys(): 
+                print("Updating Device")
+                self.__devices[deviceMAC].updateDevice(devices[deviceMAC])
+            else: 
+                print("Adding Device")
+                self.__devices[deviceMAC] = self.__deviceClass(devices[deviceMAC], self.__wsc)
+                self.__deviceLayout.addWidget(self.__devices[deviceMAC])
+        for deviceMAC in list(self.__devices.keys()): 
+            if deviceMAC not in devices.keys(): 
+                print("Removing Device")
+                self.removeDevice(deviceMAC)
+                
+    def removeDevice(self, deviceMAC): 
+        self.__deviceLayout.removeWidget(self.__devices[deviceMAC])
+        sip.delete(self.__devices[deviceMAC])
+        self.__devices.pop(deviceMAC)
+        
+    def returnLayout(self):
+        return self.__deviceLayout
+        
+    def filterDevices(self, searchPhase):
+        print("This currently doesn't work")
+        
+    def printDevices(self):
+        print(self.__devices)
+
+class IdeasXEncoder(QtWidgets.QWidget):
+    sendCommand = QtCore.pyqtSignal(['QString'], name='sendCommand')
+    
+    def __init__(self, encoder, wsc): 
+        # This should become a static variable for the class
+        self.__pathToIcon = {'network': './icon/network/', 
+                             'battery': './icon/battery/', 
+                             'battery_charging': './icon/battery/'
+                            }
+        self.__icon = {'network': ['network-wireless-offline-symbolic.png',
+                                   'network-wireless-signal-weak-symbolic.png',
+                                   'network-wireless-signal-ok-symbolic.png',
+                                   'network-wireless-signal-good-symbolic.png',
+                                   'network-wireless-signal-excellent-symbolic.png'],
+                        'battery': ['battery-empty-symbolic.png', 
+                                    'battery-caution-symbolic.png',
+                                    'battery-low-symbolic.png', 
+                                    'battery-good-symbolic.png',
+                                    'battery-full-symbolic.png'],
+                        'battery_charging': ['battery-empty-charging-symbolic.png', 
+                                             'battery-caution-charging-symbolic.png', 
+                                             'battery-low-charging-symbolic.png', 
+                                             'battery-good-charging-symbolic.png', 
+                                             'battery-full-charged-symbolic.png']
+                       }
+        self.__deviceType = 'encoder'
+        self.__wsc = wsc
+        # Setup UI components
+        super(IdeasXEncoder, self).__init__()
+        self.__ui = Ui_IdeasXDevice()
+        self.__ui.setupUi(self)
+        self._parserTools = ParsingTools()
+        self.updateDevice(encoder)        
+
+        self.setupMenu()
+        self.__ui.buttonActivate.clicked.connect(self.activateEncoder)
+        self.__ui.buttonSwitchOne.clicked.connect(self.openSwitchDialog)
+        self.__ui.buttonSwitchTwo.clicked.connect(self.openSwitchDialog)
+
+    def openSwitchDialog(self):
+        dialog = QtWidgets.QDialog()
+        dialog.ui = Ui_SwitchConfigDialog()
+        dialog.ui.setupUi(dialog)
+        dialog.exec_()
+             
+    def setupMenu(self):
+        shutdownAction = QtWidgets.QAction('Shutdown Encoder', self)
+        shutdownAction.triggered.connect(lambda: self.__wsc.shutdownDevice(self.__strModuleID, None))
+        
+        deviceMenu = QtWidgets.QMenu()
+        deviceMenu.addSection("General Actions")
+        deviceMenu.addAction("Pair Encoder with Actuator")
+        deviceMenu.addAction("Train Adaptive Switch")
+        deviceMenu.addAction("Configure Module")
+        deviceMenu.addSection("Encoder Commands")
+        deviceMenu.addAction(shutdownAction)
+        deviceMenu.addAction("Restart Encoder")
+        deviceMenu.addAction("Update Firmware")
+        
+        self.__ui.buttonMenu.setPopupMode(2)
+        self.__ui.buttonMenu.setMenu(deviceMenu)
+        self.__ui.buttonMenu.setStyleSheet("* { padding-right: 3px } QToolButton::menu-indicator { image: none }")    
+        
+    def activateEncoder(self):
+        if self.__ui.buttonActivate.text() == "Activate":
+            print("Activating Encoder: " + self.__ui.labelModuleID.text())
+            self.__ui.buttonActivate.setText("Deactivate")
+        else: 
+            print("Deactivating Encoder: " + self.__ui.labelModuleID.text())
+            self.__ui.buttonActivate.setText("Activate")
+            self.sendCommand.emit(self.__ui.labelModuleID.text())
+        
+    def updateDevice(self, encoder):      
+        self.__rssi = encoder['rssi']
+        self.__soc = self._parserTools.calculateSOC(encoder['soc'])
+        self.__vcell = self._parserTools.calculateVCell(encoder['vcell'])
+        self.__strModuleID = self._parserTools.macToString(encoder['module_id'])
+        self.__updateTime = encoder['time']
+        
+        self.setModuleID(self.__strModuleID)
+        self.setSOCIcon(self.__soc)
+        self.setRSSIIcon(self.__rssi)
+        self.setStatusTime(self.__updateTime)
+
+    def setModuleID(self, strModuleID):      
+        self.__ui.labelModuleID.setText(strModuleID)
+
+    def setSOCIcon(self, soc):
+        if soc >= 75: 
+            batteryIcon = 4
+        elif soc >= 50 and soc < 75: 
+            batteryIcon = 3
+        elif soc >= 25 and soc < 50: 
+            batteryIcon = 2 
+        elif soc >=10 and soc < 25: 
+            batteryIcon = 1
+        elif soc < 10: 
+            batteryIcon = 0 
+        batteryIcon = self.__pathToIcon['battery']+self.__icon['battery'][batteryIcon]
+        self.__ui.labelBattery.setPixmap(QtGui.QPixmap(batteryIcon))
+        self.__ui.labelBattery.setToolTip(str(soc) + "%")
+        
+    def setStatusTime(self, updateTime):
+        # set last update time or date
+        lastUpdate = time.ctime(updateTime).split(" ")
+        currentTime = time.ctime().split(" ")
+        if currentTime[1] != lastUpdate[1] or currentTime[2] != lastUpdate[2] or currentTime[4] != lastUpdate[4]: 
+            lastUpdate = lastUpdate[1] + " " + lastUpdate[2] + " " + lastUpdate[4]
+        else: 
+            lastUpdate = lastUpdate[3]
+        self.__ui.labelStatus.setText("Last Update: " + lastUpdate)
+        
+    def setRSSIIcon(self, rssi): 
+        # set rssi icon
+        if rssi >= -50: 
+            rssiIcon = 4
+        elif rssi >= -60 and rssi < -50: 
+            rssiIcon = 3 
+        elif rssi >= -70 and rssi < -60: 
+            rssiIcon = 2 
+        elif rssi < -70: 
+            rssiIcon = 1  
+        rssiIcon = self.__pathToIcon['network'] + self.__icon['network'][rssiIcon]  
+        self.__ui.labelSignal.setPixmap(QtGui.QPixmap(rssiIcon))
+        self.__ui.labelSignal.setToolTip(str(rssi) + " dBm")
+            
+
+
+class IdeasXMainWindow(QtWidgets.QMainWindow):
+    def __init__(self):
+        super(IdeasXMainWindow, self).__init__()
+        self.__ui = Ui_MainWindow()
+        self.__ui.setupUi(self)
+
+        p = self.__ui.contentEncoder.palette()
+        p.setColor(self.backgroundRole(), QtCore.Qt.white)
+        self.__ui.contentEncoder.setPalette(p)
+
+    def setEncoderLayout(self, layout):
+        self.__ui.contentEncoder.setLayout(layout)
+    
+        
+if __name__ == "__main__":
+    app = QtWidgets.QApplication(sys.argv)
+    app.setWindowIcon(QtGui.QIcon('icon/logo/ideasx.png'))
+    mainWindow = IdeasXMainWindow()
+    wsc = IdeasXWSCNetworkThread()
+    encoderManager = IdeasXDeviceManager(IdeasXEncoder, wsc)
+    mainWindow.setEncoderLayout(encoderManager.returnLayout())
+    wsc.encoderUpdate.connect(encoderManager.refreshDevices)
+    wsc.guiStartWorkstationClient('ideasx.duckdns.org')
+    
+    #timer = QtCore.QTimer()
+    #timer.timeout.connect(mainWindow.hideEncoder)
+    #timer.start(1000)
+    #time.sleep(0.5)
+    
+    mainWindow.show()
+    sys.exit(app.exec_())
+    

+ 53 - 0
ParsingTools.py

@@ -0,0 +1,53 @@
+class ParsingTools():
+    def macToString(self, mac_bytes):
+        ''' Convert uint8 byte string to "XX:XX:XX:XX:XX" 
+        '''
+        mac_str = ""
+        for byte in mac_bytes: 
+            mac_str = mac_str + format(byte, 'x') + ':'
+        return mac_str[:-1].format('utf-8')
+            
+    def calculateVCell(self, raw_Vcell):
+        return raw_Vcell*1.25e-3
+    
+    def calculateSOC(self, raw_SOC):
+        return raw_SOC.to_bytes(2, 'big')[0]
+    
+class FieldGenerator():
+    def generateMACID(self):
+        import numpy as np
+        macID = np.random.randint(255, size=5)
+        macStr = ""
+        for val in macID: 
+            macStr = macStr+ format(val, 'x') + ":" 
+        return macStr[:-1]
+
+    def generateRSSI(self):
+        import numpy as np 
+        rssi = np.random.randint(80)
+        rssiStr = "RSSI:  -" + str(rssi) + "dBm"
+        return rssiStr 
+    
+    def generateSOC(self):
+        import numpy as np
+        soc = np.random.randint(100)
+        socStr = "Battery:  " + str(soc) + "%"
+        return socStr
+        
+    def generateStatus(self):
+        import numpy as np 
+        hr = np.random.randint(12) + 1
+        min = np.random.randint(60)
+        ampm = np.random.randint(1)
+        statusStr = "Last Update: " + str(hr) + ":" + str(min)
+        return statusStr
+    
+
+if __name__ == '__main__':
+    print("I never developed self-test, but if I did they would go here.")
+    
+    pt = ParsingTools()
+    
+    print("Testing macToString")
+    print(pt.macToString(b'023430'))
+    

+ 0 - 24
ParsingToolsClass.py

@@ -1,24 +0,0 @@
-class ParsingTools():
-    def macToString(self, mac_bytes):
-        ''' Convert uint8 byte string to "XX:XX:XX:XX:XX" 
-        '''
-        mac_str = ""
-        for byte in mac_bytes: 
-            mac_str = mac_str + format(byte, 'x') + ':'
-        return mac_str[:-1].format('utf-8')
-            
-    def calculateVCell(self, raw_Vcell):
-        return raw_Vcell*1.25e-3
-    
-    def calculateSOC(self, raw_SOC):
-        return raw_SOC.to_bytes(2, 'big')[0]
-    
-
-if __name__ == '__main__':
-    print("I never developed self-test, but if I did they would go here.")
-    
-    pt = ParsingTools()
-    
-    print("Testing macToString")
-    print(pt.macToString(b'023430'))
-    

+ 64 - 0
Qt/encoderconfigurationdialog.ui

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SwitchConfigDialog</class>
+ <widget class="QDialog" name="SwitchConfigDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>217</width>
+    <height>110</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>Switch Configuration:</string>
+     </property>
+     <layout class="QFormLayout" name="formLayout">
+      <item row="0" column="1">
+       <widget class="QCheckBox" name="checkSwitchEnable">
+        <property name="text">
+         <string>Enable</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QSpinBox" name="spinLatchTime">
+        <property name="suffix">
+         <string> sec.</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="0">
+       <widget class="QLineEdit" name="lineSwitchKey">
+        <property name="text">
+         <string/>
+        </property>
+        <property name="placeholderText">
+         <string>Enter Keystroke</string>
+        </property>
+        <property name="clearButtonEnabled">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="labelLatch">
+        <property name="text">
+         <string>Latching Delay:</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 167 - 55
Qt/ideasxdevice.ui

@@ -6,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>506</width>
+    <width>452</width>
     <height>84</height>
    </rect>
   </property>
@@ -38,10 +38,25 @@
    <bool>false</bool>
   </property>
   <layout class="QHBoxLayout" name="horizontalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="leftMargin">
+    <number>9</number>
+   </property>
+   <property name="topMargin">
+    <number>3</number>
+   </property>
+   <property name="rightMargin">
+    <number>9</number>
+   </property>
+   <property name="bottomMargin">
+    <number>3</number>
+   </property>
    <item>
     <widget class="QWidget" name="widgetInfo" native="true">
      <property name="sizePolicy">
-      <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+      <sizepolicy hsizetype="Expanding" vsizetype="Ignored">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
@@ -49,92 +64,186 @@
      <property name="minimumSize">
       <size>
        <width>290</width>
-       <height>66</height>
+       <height>70</height>
       </size>
      </property>
-     <widget class="QLabel" name="label">
+     <widget class="QLabel" name="labelDeviceType">
       <property name="geometry">
        <rect>
-        <x>4</x>
-        <y>5</y>
-        <width>90</width>
-        <height>60</height>
+        <x>5</x>
+        <y>0</y>
+        <width>101</width>
+        <height>76</height>
        </rect>
       </property>
-      <property name="text">
+      <property name="toolTip">
+       <string extracomment="RSSI: -20 dBm"/>
+      </property>
+      <property name="statusTip">
        <string/>
       </property>
       <property name="pixmap">
-       <pixmap>../../../Dropbox/curiousmuch/20160820/Module V0.3 Artwork 20160820/g4139.png</pixmap>
+       <pixmap>../icon/devicetype/modulev3b.png</pixmap>
       </property>
-     </widget>
-     <widget class="QLabel" name="labelRSSI">
-      <property name="geometry">
-       <rect>
-        <x>100</x>
-        <y>50</y>
-        <width>86</width>
-        <height>16</height>
-       </rect>
-      </property>
-      <property name="text">
-       <string>RSSI:  -54dBm</string>
+      <property name="scaledContents">
+       <bool>false</bool>
       </property>
      </widget>
      <widget class="QLabel" name="labelModuleID">
       <property name="geometry">
        <rect>
-        <x>100</x>
-        <y>0</y>
-        <width>231</width>
-        <height>35</height>
+        <x>119</x>
+        <y>5</y>
+        <width>311</width>
+        <height>36</height>
        </rect>
       </property>
+      <property name="sizePolicy">
+       <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+        <horstretch>0</horstretch>
+        <verstretch>0</verstretch>
+       </sizepolicy>
+      </property>
       <property name="font">
        <font>
-        <family>Roboto Condensed</family>
+        <family>TakaoPGothic</family>
         <pointsize>20</pointsize>
+        <weight>50</weight>
         <italic>false</italic>
+        <bold>false</bold>
        </font>
       </property>
       <property name="frameShape">
        <enum>QFrame::NoFrame</enum>
       </property>
       <property name="text">
-       <string>2f:32:56:4f:72:d8</string>
+       <string>Sarah Stanton</string>
+      </property>
+      <property name="scaledContents">
+       <bool>true</bool>
+      </property>
+     </widget>
+     <widget class="QLabel" name="labelSignal">
+      <property name="geometry">
+       <rect>
+        <x>117</x>
+        <y>43</y>
+        <width>31</width>
+        <height>31</height>
+       </rect>
+      </property>
+      <property name="toolTip">
+       <string extracomment="-40 dBm"/>
+      </property>
+      <property name="pixmap">
+       <pixmap>../icon/network/network-wireless-signal-ok-symbolic.png</pixmap>
+      </property>
+      <property name="scaledContents">
+       <bool>false</bool>
       </property>
      </widget>
      <widget class="QLabel" name="labelBattery">
       <property name="geometry">
        <rect>
-        <x>100</x>
-        <y>35</y>
-        <width>166</width>
-        <height>16</height>
+        <x>157</x>
+        <y>43</y>
+        <width>31</width>
+        <height>31</height>
+       </rect>
+      </property>
+      <property name="toolTip">
+       <string extracomment="50%"/>
+      </property>
+      <property name="statusTip">
+       <string extracomment="50%"/>
+      </property>
+      <property name="pixmap">
+       <pixmap>../icon/battery/battery-good-charging-symbolic.png</pixmap>
+      </property>
+      <property name="scaledContents">
+       <bool>false</bool>
+      </property>
+     </widget>
+     <widget class="QToolButton" name="buttonSwitchOne">
+      <property name="geometry">
+       <rect>
+        <x>197</x>
+        <y>43</y>
+        <width>25</width>
+        <height>31</height>
        </rect>
       </property>
       <property name="text">
-       <string>Battery:  98%</string>
+       <string>...</string>
+      </property>
+      <property name="icon">
+       <iconset>
+        <normaloff>../icon/switch/switch-one-enabled.png</normaloff>../icon/switch/switch-one-enabled.png</iconset>
+      </property>
+      <property name="iconSize">
+       <size>
+        <width>30</width>
+        <height>30</height>
+       </size>
+      </property>
+      <property name="autoRaise">
+       <bool>true</bool>
+      </property>
+     </widget>
+     <widget class="QToolButton" name="buttonSwitchTwo">
+      <property name="geometry">
+       <rect>
+        <x>219</x>
+        <y>43</y>
+        <width>21</width>
+        <height>31</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>...</string>
+      </property>
+      <property name="icon">
+       <iconset>
+        <normaloff>../icon/switch/switch-two-enabled.png</normaloff>../icon/switch/switch-two-enabled.png</iconset>
+      </property>
+      <property name="iconSize">
+       <size>
+        <width>30</width>
+        <height>30</height>
+       </size>
+      </property>
+      <property name="autoRaise">
+       <bool>true</bool>
+      </property>
+     </widget>
+     <widget class="QToolButton" name="buttonSwitchAdaptive">
+      <property name="geometry">
+       <rect>
+        <x>238</x>
+        <y>43</y>
+        <width>25</width>
+        <height>31</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>...</string>
+      </property>
+      <property name="icon">
+       <iconset>
+        <normaloff>../icon/switch/switch-adaptive-disabled.png</normaloff>../icon/switch/switch-adaptive-disabled.png</iconset>
+      </property>
+      <property name="iconSize">
+       <size>
+        <width>30</width>
+        <height>30</height>
+       </size>
+      </property>
+      <property name="autoRaise">
+       <bool>true</bool>
       </property>
      </widget>
     </widget>
    </item>
-   <item>
-    <spacer name="horizontalSpacer">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeType">
-      <enum>QSizePolicy::MinimumExpanding</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>10</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
    <item>
     <widget class="QWidget" name="widgetControls" native="true">
      <property name="sizePolicy">
@@ -158,10 +267,10 @@
      <widget class="QLabel" name="labelStatus">
       <property name="geometry">
        <rect>
-        <x>-5</x>
-        <y>55</y>
-        <width>116</width>
-        <height>10</height>
+        <x>-70</x>
+        <y>47</y>
+        <width>181</width>
+        <height>31</height>
        </rect>
       </property>
       <property name="font">
@@ -211,8 +320,11 @@
       <property name="checkable">
        <bool>true</bool>
       </property>
-      <property name="autoRaise">
-       <bool>false</bool>
+      <property name="popupMode">
+       <enum>QToolButton::DelayedPopup</enum>
+      </property>
+      <property name="toolButtonStyle">
+       <enum>Qt::ToolButtonTextOnly</enum>
       </property>
      </widget>
     </widget>

+ 89 - 95
Qt/mainwindow.ui

@@ -60,7 +60,7 @@
        <enum>QTabWidget::West</enum>
       </property>
       <property name="currentIndex">
-       <number>0</number>
+       <number>2</number>
       </property>
       <property name="elideMode">
        <enum>Qt::ElideNone</enum>
@@ -97,7 +97,7 @@
         <property name="bottomMargin">
          <number>9</number>
         </property>
-        <item row="1" column="1">
+        <item row="1" column="2">
          <widget class="QLineEdit" name="searchEncoder">
           <property name="placeholderText">
            <string>Search for Encoders...</string>
@@ -107,7 +107,7 @@
           </property>
          </widget>
         </item>
-        <item row="1" column="0">
+        <item row="1" column="1">
          <spacer name="horizontalSpacer">
           <property name="orientation">
            <enum>Qt::Horizontal</enum>
@@ -120,20 +120,27 @@
           </property>
          </spacer>
         </item>
-        <item row="0" column="0" colspan="2">
-         <widget class="QListWidget" name="listEncoder">
-          <property name="sizePolicy">
-           <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
+        <item row="0" column="0" colspan="3">
+         <widget class="QScrollArea" name="scrollEncoder">
+          <property name="autoFillBackground">
+           <bool>false</bool>
           </property>
-          <property name="alternatingRowColors">
-           <bool>true</bool>
+          <property name="styleSheet">
+           <string notr="true"/>
           </property>
-          <property name="sortingEnabled">
-           <bool>false</bool>
+          <property name="widgetResizable">
+           <bool>true</bool>
           </property>
+          <widget class="QWidget" name="contentEncoder">
+           <property name="geometry">
+            <rect>
+             <x>0</x>
+             <y>0</y>
+             <width>459</width>
+             <height>556</height>
+            </rect>
+           </property>
+          </widget>
          </widget>
         </item>
        </layout>
@@ -155,6 +162,19 @@
         <property name="bottomMargin">
          <number>9</number>
         </property>
+        <item row="1" column="0">
+         <spacer name="horizontalSpacer_2">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>40</width>
+            <height>20</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
         <item row="1" column="1">
          <widget class="QLineEdit" name="searchActuator">
           <property name="autoFillBackground">
@@ -171,19 +191,6 @@
           </property>
          </widget>
         </item>
-        <item row="1" column="0">
-         <spacer name="horizontalSpacer_2">
-          <property name="orientation">
-           <enum>Qt::Horizontal</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>40</width>
-            <height>20</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
         <item row="0" column="0" colspan="2">
          <widget class="QTableView" name="tableActuator">
           <property name="enabled">
@@ -215,7 +222,7 @@
        <attribute name="title">
         <string>Settings</string>
        </attribute>
-       <layout class="QGridLayout" name="gridLayout_4">
+       <layout class="QFormLayout" name="formLayout">
         <property name="leftMargin">
          <number>9</number>
         </property>
@@ -228,72 +235,79 @@
         <property name="bottomMargin">
          <number>9</number>
         </property>
-        <item row="9" column="0">
-         <widget class="QLabel" name="labelPassword">
-          <property name="text">
-           <string>Password:</string>
-          </property>
-         </widget>
-        </item>
-        <item row="9" column="1" colspan="2">
-         <widget class="QLineEdit" name="wifiPassword"/>
-        </item>
-        <item row="1" column="0">
+        <item row="0" column="0">
          <widget class="QLabel" name="labelNetworkBroker">
           <property name="text">
            <string>Network Broker:</string>
           </property>
          </widget>
         </item>
-        <item row="3" column="1" colspan="2">
-         <widget class="QLineEdit" name="localBroker">
+        <item row="0" column="1">
+         <widget class="QLineEdit" name="networkBroker">
           <property name="placeholderText">
            <string>URL or IP</string>
           </property>
          </widget>
         </item>
-        <item row="1" column="1" colspan="2">
-         <widget class="QLineEdit" name="networkBroker">
+        <item row="2" column="1">
+         <widget class="QLineEdit" name="networkPort">
+          <property name="text">
+           <string/>
+          </property>
           <property name="placeholderText">
-           <string>URL or IP</string>
+           <string>Port</string>
           </property>
          </widget>
         </item>
-        <item row="8" column="0">
-         <widget class="QLabel" name="labelSSID">
+        <item row="4" column="0">
+         <widget class="QLabel" name="labelLocalBroker">
           <property name="text">
-           <string>SSID:</string>
+           <string>Local Broker:</string>
           </property>
          </widget>
         </item>
-        <item row="4" column="1" colspan="2">
+        <item row="4" column="1">
+         <widget class="QLineEdit" name="localBroker">
+          <property name="placeholderText">
+           <string>URL or IP</string>
+          </property>
+         </widget>
+        </item>
+        <item row="6" column="1">
          <widget class="QLineEdit" name="localPort">
           <property name="placeholderText">
            <string>Port</string>
           </property>
          </widget>
         </item>
-        <item row="8" column="1" colspan="2">
-         <widget class="QLineEdit" name="wifiSSID"/>
-        </item>
-        <item row="7" column="0">
-         <widget class="QLabel" name="labelAPSelector">
+        <item row="8" column="1">
+         <widget class="QPushButton" name="buttonSettings">
           <property name="text">
-           <string>Wi-Fi Access Point:</string>
+           <string>Apply Settings</string>
           </property>
          </widget>
         </item>
-        <item row="2" column="1" colspan="2">
-         <widget class="QLineEdit" name="networkPort">
-          <property name="text">
-           <string/>
+        <item row="9" column="0">
+         <spacer name="verticalSpacer">
+          <property name="orientation">
+           <enum>Qt::Vertical</enum>
           </property>
-          <property name="placeholderText">
-           <string>Port</string>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>20</width>
+            <height>40</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item row="10" column="0">
+         <widget class="QLabel" name="labelAPSelector">
+          <property name="text">
+           <string>Wi-Fi Access Point:</string>
           </property>
          </widget>
         </item>
-        <item row="7" column="1">
+        <item row="10" column="1">
          <widget class="QSpinBox" name="selectAP">
           <property name="suffix">
            <string/>
@@ -309,50 +323,30 @@
           </property>
          </widget>
         </item>
-        <item row="6" column="0" colspan="2">
-         <spacer name="verticalSpacer">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>40</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item row="3" column="0">
-         <widget class="QLabel" name="labelLocalBroker">
+        <item row="11" column="0">
+         <widget class="QLabel" name="labelSSID">
           <property name="text">
-           <string>Local Broker:</string>
+           <string>SSID:</string>
           </property>
          </widget>
         </item>
-        <item row="7" column="2">
-         <spacer name="horizontalSpacer_3">
-          <property name="orientation">
-           <enum>Qt::Horizontal</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>40</width>
-            <height>20</height>
-           </size>
-          </property>
-         </spacer>
+        <item row="11" column="1">
+         <widget class="QLineEdit" name="wifiSSID"/>
         </item>
-        <item row="10" column="2">
-         <widget class="QPushButton" name="buttonTrainDevice">
+        <item row="13" column="0">
+         <widget class="QLabel" name="labelPassword">
           <property name="text">
-           <string>Train IdeasX Device</string>
+           <string>Password:</string>
           </property>
          </widget>
         </item>
-        <item row="5" column="2">
-         <widget class="QPushButton" name="buttonSettings">
+        <item row="13" column="1">
+         <widget class="QLineEdit" name="wifiPassword"/>
+        </item>
+        <item row="15" column="1">
+         <widget class="QPushButton" name="buttonTrainDevice">
           <property name="text">
-           <string>Apply Settings</string>
+           <string>Train IdeasX Device</string>
           </property>
          </widget>
         </item>

+ 0 - 379
Qt/mainwindow.ui.autosave

@@ -1,379 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>MainWindow</class>
- <widget class="QMainWindow" name="MainWindow">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>525</width>
-    <height>648</height>
-   </rect>
-  </property>
-  <property name="sizePolicy">
-   <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-    <horstretch>0</horstretch>
-    <verstretch>0</verstretch>
-   </sizepolicy>
-  </property>
-  <property name="windowTitle">
-   <string>IdeasX Workstation Client</string>
-  </property>
-  <property name="documentMode">
-   <bool>false</bool>
-  </property>
-  <property name="dockNestingEnabled">
-   <bool>true</bool>
-  </property>
-  <property name="dockOptions">
-   <set>QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks|QMainWindow::VerticalTabs</set>
-  </property>
-  <property name="unifiedTitleAndToolBarOnMac">
-   <bool>false</bool>
-  </property>
-  <widget class="QWidget" name="centralwidget">
-   <property name="sizePolicy">
-    <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-     <horstretch>0</horstretch>
-     <verstretch>0</verstretch>
-    </sizepolicy>
-   </property>
-   <layout class="QVBoxLayout" name="verticalLayout">
-    <property name="spacing">
-     <number>6</number>
-    </property>
-    <property name="sizeConstraint">
-     <enum>QLayout::SetDefaultConstraint</enum>
-    </property>
-    <item>
-     <widget class="QTabWidget" name="tabWidget">
-      <property name="contextMenuPolicy">
-       <enum>Qt::DefaultContextMenu</enum>
-      </property>
-      <property name="layoutDirection">
-       <enum>Qt::LeftToRight</enum>
-      </property>
-      <property name="autoFillBackground">
-       <bool>true</bool>
-      </property>
-      <property name="tabPosition">
-       <enum>QTabWidget::West</enum>
-      </property>
-      <property name="currentIndex">
-       <number>0</number>
-      </property>
-      <property name="elideMode">
-       <enum>Qt::ElideNone</enum>
-      </property>
-      <property name="documentMode">
-       <bool>false</bool>
-      </property>
-      <property name="tabBarAutoHide">
-       <bool>true</bool>
-      </property>
-      <widget class="QWidget" name="tabEncoder">
-       <property name="maximumSize">
-        <size>
-         <width>16777215</width>
-         <height>16777215</height>
-        </size>
-       </property>
-       <attribute name="title">
-        <string>Encoders</string>
-       </attribute>
-       <layout class="QGridLayout" name="gridLayout">
-        <property name="sizeConstraint">
-         <enum>QLayout::SetDefaultConstraint</enum>
-        </property>
-        <property name="leftMargin">
-         <number>9</number>
-        </property>
-        <property name="topMargin">
-         <number>9</number>
-        </property>
-        <property name="rightMargin">
-         <number>9</number>
-        </property>
-        <property name="bottomMargin">
-         <number>9</number>
-        </property>
-        <item row="1" column="1">
-         <widget class="QLineEdit" name="searchEncoder">
-          <property name="placeholderText">
-           <string>Search for Encoders...</string>
-          </property>
-          <property name="clearButtonEnabled">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item row="1" column="0">
-         <spacer name="horizontalSpacer">
-          <property name="orientation">
-           <enum>Qt::Horizontal</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>40</width>
-            <height>20</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item row="0" column="0" colspan="2">
-         <widget class="QListWidget" name="listEncoder">
-          <property name="sizePolicy">
-           <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-          <property name="alternatingRowColors">
-           <bool>true</bool>
-          </property>
-          <property name="sortingEnabled">
-           <bool>false</bool>
-          </property>
-         </widget>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="tabActuator">
-       <attribute name="title">
-        <string>Actuators</string>
-       </attribute>
-       <layout class="QGridLayout" name="gridLayout_2">
-        <property name="leftMargin">
-         <number>9</number>
-        </property>
-        <property name="topMargin">
-         <number>9</number>
-        </property>
-        <property name="rightMargin">
-         <number>9</number>
-        </property>
-        <property name="bottomMargin">
-         <number>9</number>
-        </property>
-        <item row="1" column="1">
-         <widget class="QLineEdit" name="searchActuator">
-          <property name="autoFillBackground">
-           <bool>false</bool>
-          </property>
-          <property name="frame">
-           <bool>true</bool>
-          </property>
-          <property name="placeholderText">
-           <string>Search for Actuator</string>
-          </property>
-          <property name="clearButtonEnabled">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item row="1" column="0">
-         <spacer name="horizontalSpacer_2">
-          <property name="orientation">
-           <enum>Qt::Horizontal</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>40</width>
-            <height>20</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item row="0" column="0" colspan="2">
-         <widget class="QTableView" name="tableActuator">
-          <property name="enabled">
-           <bool>true</bool>
-          </property>
-          <property name="frameShadow">
-           <enum>QFrame::Plain</enum>
-          </property>
-          <property name="alternatingRowColors">
-           <bool>true</bool>
-          </property>
-          <property name="showGrid">
-           <bool>false</bool>
-          </property>
-          <property name="sortingEnabled">
-           <bool>true</bool>
-          </property>
-          <attribute name="horizontalHeaderStretchLastSection">
-           <bool>true</bool>
-          </attribute>
-          <attribute name="verticalHeaderVisible">
-           <bool>false</bool>
-          </attribute>
-         </widget>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="tabSetting">
-       <attribute name="title">
-        <string>Settings</string>
-       </attribute>
-       <layout class="QGridLayout" name="gridLayout_4">
-        <property name="leftMargin">
-         <number>9</number>
-        </property>
-        <property name="topMargin">
-         <number>9</number>
-        </property>
-        <property name="rightMargin">
-         <number>9</number>
-        </property>
-        <property name="bottomMargin">
-         <number>9</number>
-        </property>
-        <item row="9" column="0">
-         <widget class="QLabel" name="labelPassword">
-          <property name="text">
-           <string>Password:</string>
-          </property>
-         </widget>
-        </item>
-        <item row="9" column="1" colspan="2">
-         <widget class="QLineEdit" name="wifiPassword"/>
-        </item>
-        <item row="1" column="0">
-         <widget class="QLabel" name="labelNetworkBroker">
-          <property name="text">
-           <string>Network Broker:</string>
-          </property>
-         </widget>
-        </item>
-        <item row="3" column="1" colspan="2">
-         <widget class="QLineEdit" name="localBroker">
-          <property name="placeholderText">
-           <string>URL or IP</string>
-          </property>
-         </widget>
-        </item>
-        <item row="1" column="1" colspan="2">
-         <widget class="QLineEdit" name="networkBroker">
-          <property name="placeholderText">
-           <string>URL or IP</string>
-          </property>
-         </widget>
-        </item>
-        <item row="8" column="0">
-         <widget class="QLabel" name="labelSSID">
-          <property name="text">
-           <string>SSID:</string>
-          </property>
-         </widget>
-        </item>
-        <item row="4" column="1" colspan="2">
-         <widget class="QLineEdit" name="localPort">
-          <property name="placeholderText">
-           <string>Port</string>
-          </property>
-         </widget>
-        </item>
-        <item row="8" column="1" colspan="2">
-         <widget class="QLineEdit" name="wifiSSID"/>
-        </item>
-        <item row="7" column="0">
-         <widget class="QLabel" name="labelAPSelector">
-          <property name="text">
-           <string>Wi-Fi Access Point:</string>
-          </property>
-         </widget>
-        </item>
-        <item row="2" column="1" colspan="2">
-         <widget class="QLineEdit" name="networkPort">
-          <property name="text">
-           <string/>
-          </property>
-          <property name="placeholderText">
-           <string>Port</string>
-          </property>
-         </widget>
-        </item>
-        <item row="7" column="1">
-         <widget class="QSpinBox" name="selectAP">
-          <property name="suffix">
-           <string/>
-          </property>
-          <property name="prefix">
-           <string>AP </string>
-          </property>
-          <property name="minimum">
-           <number>1</number>
-          </property>
-          <property name="maximum">
-           <number>5</number>
-          </property>
-         </widget>
-        </item>
-        <item row="6" column="0" colspan="2">
-         <spacer name="verticalSpacer">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>40</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item row="3" column="0">
-         <widget class="QLabel" name="labelLocalBroker">
-          <property name="text">
-           <string>Local Broker:</string>
-          </property>
-         </widget>
-        </item>
-        <item row="7" column="2">
-         <spacer name="horizontalSpacer_3">
-          <property name="orientation">
-           <enum>Qt::Horizontal</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>40</width>
-            <height>20</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item row="10" column="2">
-         <widget class="QPushButton" name="buttonTrainDevice">
-          <property name="text">
-           <string>Train IdeasX Device</string>
-          </property>
-         </widget>
-        </item>
-        <item row="5" column="2">
-         <widget class="QPushButton" name="buttonSettings">
-          <property name="text">
-           <string>Apply Settings</string>
-          </property>
-         </widget>
-        </item>
-       </layout>
-      </widget>
-     </widget>
-    </item>
-   </layout>
-  </widget>
-  <widget class="QStatusBar" name="statusbar">
-   <property name="enabled">
-    <bool>true</bool>
-   </property>
-   <property name="toolTipDuration">
-    <number>-7</number>
-   </property>
-   <property name="layoutDirection">
-    <enum>Qt::RightToLeft</enum>
-   </property>
-  </widget>
- </widget>
- <resources/>
- <connections/>
-</ui>

+ 48 - 0
encoderconfigurationdialog.py

@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'encoderconfigurationdialog.ui'
+#
+# Created by: PyQt5 UI code generator 5.7
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_SwitchConfigDialog(object):
+    def setupUi(self, SwitchConfigDialog):
+        SwitchConfigDialog.setObjectName("SwitchConfigDialog")
+        SwitchConfigDialog.resize(217, 110)
+        self.verticalLayout = QtWidgets.QVBoxLayout(SwitchConfigDialog)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.groupBox = QtWidgets.QGroupBox(SwitchConfigDialog)
+        self.groupBox.setObjectName("groupBox")
+        self.formLayout = QtWidgets.QFormLayout(self.groupBox)
+        self.formLayout.setObjectName("formLayout")
+        self.checkSwitchEnable = QtWidgets.QCheckBox(self.groupBox)
+        self.checkSwitchEnable.setObjectName("checkSwitchEnable")
+        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.checkSwitchEnable)
+        self.spinLatchTime = QtWidgets.QSpinBox(self.groupBox)
+        self.spinLatchTime.setObjectName("spinLatchTime")
+        self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.spinLatchTime)
+        self.lineSwitchKey = QtWidgets.QLineEdit(self.groupBox)
+        self.lineSwitchKey.setText("")
+        self.lineSwitchKey.setClearButtonEnabled(True)
+        self.lineSwitchKey.setObjectName("lineSwitchKey")
+        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.lineSwitchKey)
+        self.labelLatch = QtWidgets.QLabel(self.groupBox)
+        self.labelLatch.setObjectName("labelLatch")
+        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.labelLatch)
+        self.verticalLayout.addWidget(self.groupBox)
+
+        self.retranslateUi(SwitchConfigDialog)
+        QtCore.QMetaObject.connectSlotsByName(SwitchConfigDialog)
+
+    def retranslateUi(self, SwitchConfigDialog):
+        _translate = QtCore.QCoreApplication.translate
+        SwitchConfigDialog.setWindowTitle(_translate("SwitchConfigDialog", "Dialog"))
+        self.groupBox.setTitle(_translate("SwitchConfigDialog", "Switch Configuration:"))
+        self.checkSwitchEnable.setText(_translate("SwitchConfigDialog", "Enable"))
+        self.spinLatchTime.setSuffix(_translate("SwitchConfigDialog", " sec."))
+        self.lineSwitchKey.setPlaceholderText(_translate("SwitchConfigDialog", "Enter Keystroke"))
+        self.labelLatch.setText(_translate("SwitchConfigDialog", "Latching Delay:"))
+

+ 0 - 0
IdeasXDatabaseManager.py → examples/IdeasXDatabaseManager.py


+ 0 - 0
icon/battery/battery-caution-charging-symbolic.svg → icon/battery/Archive/battery-caution-charging-symbolic.svg


+ 0 - 0
icon/battery/battery-caution-symbolic.svg → icon/battery/Archive/battery-caution-symbolic.svg


+ 0 - 0
icon/battery/battery-empty-charging-symbolic.svg → icon/battery/Archive/battery-empty-charging-symbolic.svg


+ 0 - 0
icon/battery/battery-empty-symbolic.svg → icon/battery/Archive/battery-empty-symbolic.svg


+ 0 - 0
icon/battery/battery-full-charged-symbolic.svg → icon/battery/Archive/battery-full-charged-symbolic.svg


+ 0 - 0
icon/battery/battery-full-charging-symbolic.svg → icon/battery/Archive/battery-full-charging-symbolic.svg


+ 0 - 0
icon/battery/battery-full-symbolic.svg → icon/battery/Archive/battery-full-symbolic.svg


+ 0 - 0
icon/battery/battery-good-charging-symbolic.svg → icon/battery/Archive/battery-good-charging-symbolic.svg


+ 0 - 0
icon/battery/battery-good-symbolic.svg → icon/battery/Archive/battery-good-symbolic.svg


+ 0 - 0
icon/battery/battery-low-charging-symbolic.svg → icon/battery/Archive/battery-low-charging-symbolic.svg


+ 0 - 0
icon/battery/battery-low-symbolic.svg → icon/battery/Archive/battery-low-symbolic.svg


+ 0 - 0
icon/battery/battery-missing-symbolic.svg → icon/battery/Archive/battery-missing-symbolic.svg


BIN
icon/battery/battery-caution-charging-symbolic.png


BIN
icon/battery/battery-caution-symbolic.png


BIN
icon/battery/battery-empty-charging-symbolic.png


BIN
icon/battery/battery-empty-symbolic.png


BIN
icon/battery/battery-full-charged-symbolic.png


BIN
icon/battery/battery-full-symbolic.png


BIN
icon/battery/battery-good-charging-symbolic.png


BIN
icon/battery/battery-good-symbolic.png


BIN
icon/battery/battery-low-charging-symbolic.png


BIN
icon/battery/battery-low-symbolic.png


BIN
icon/battery/original/battery-caution-charging-symbolic.png


BIN
icon/battery/original/battery-caution-symbolic.png


BIN
icon/battery/original/battery-empty-charging-symbolic.png


BIN
icon/battery/original/battery-empty-symbolic.png


BIN
icon/battery/original/battery-full-charged-symbolic.png


BIN
icon/battery/original/battery-full-symbolic.png


BIN
icon/battery/original/battery-good-charging-symbolic.png


BIN
icon/battery/original/battery-good-symbolic.png


BIN
icon/battery/original/battery-low-charging-symbolic.png


BIN
icon/battery/original/battery-low-symbolic.png


BIN
icon/devicetype/modulev3.png


BIN
icon/devicetype/modulev3a.png


BIN
icon/devicetype/modulev3b.png


+ 0 - 0
icon/ideasx.png → icon/logo/ideasx.png


+ 0 - 0
icon/ideasx2.png → icon/logo/ideasx2.png


+ 0 - 0
icon/network/network-wired-acquiring-symbolic.svg → icon/network/Archive/arc/network-wired-acquiring-symbolic.svg


+ 0 - 0
icon/network/network-wired-disconnected-symbolic.svg → icon/network/Archive/arc/network-wired-disconnected-symbolic.svg


+ 0 - 0
icon/network/network-wired-no-route-symbolic.svg → icon/network/Archive/arc/network-wired-no-route-symbolic.svg


+ 0 - 0
icon/network/network-wired-offline-symbolic.svg → icon/network/Archive/arc/network-wired-offline-symbolic.svg


+ 0 - 0
icon/network/network-wired-symbolic.svg → icon/network/Archive/arc/network-wired-symbolic.svg


+ 0 - 0
icon/network/network-wireless-acquiring-symbolic.svg → icon/network/Archive/arc/network-wireless-acquiring-symbolic.svg


+ 0 - 0
icon/network/network-wireless-connected-symbolic.svg → icon/network/Archive/arc/network-wireless-connected-symbolic.svg


+ 0 - 0
icon/network/network-wireless-encrypted-symbolic.svg → icon/network/Archive/arc/network-wireless-encrypted-symbolic.svg


+ 0 - 0
icon/network/network-wireless-no-route-symbolic.svg → icon/network/Archive/arc/network-wireless-no-route-symbolic.svg


+ 0 - 0
icon/network/network-wireless-offline-symbolic.svg → icon/network/Archive/arc/network-wireless-offline-symbolic.svg


+ 0 - 0
icon/network/network-wireless-signal-excellent-symbolic.svg → icon/network/Archive/arc/network-wireless-signal-excellent-symbolic.svg


+ 0 - 0
icon/network/network-wireless-signal-good-symbolic.svg → icon/network/Archive/arc/network-wireless-signal-good-symbolic.svg


+ 0 - 0
icon/network/network-wireless-signal-none-symbolic.svg → icon/network/Archive/arc/network-wireless-signal-none-symbolic.svg


+ 0 - 0
icon/network/network-wireless-signal-ok-symbolic.svg → icon/network/Archive/arc/network-wireless-signal-ok-symbolic.svg


+ 0 - 0
icon/network/network-wireless-signal-weak-symbolic.svg → icon/network/Archive/arc/network-wireless-signal-weak-symbolic.svg


BIN
icon/network/network-wireless-offline-symbolic.png


BIN
icon/network/network-wireless-signal-excellent-symbolic.png


BIN
icon/network/network-wireless-signal-good-symbolic.png


BIN
icon/network/network-wireless-signal-ok-symbolic.png


BIN
icon/network/network-wireless-signal-weak-symbolic.png


BIN
icon/network/original/network-wireless-offline-symbolic.png


BIN
icon/network/original/network-wireless-signal-excellent-symbolic.png


BIN
icon/network/original/network-wireless-signal-good-symbolic.png


BIN
icon/network/original/network-wireless-signal-ok-symbolic.png


BIN
icon/network/original/network-wireless-signal-weak-symbolic.png


File diff suppressed because it is too large
+ 275 - 0
icon/svg/icons.svg


BIN
icon/switch/switch-adaptive-disabled.png


BIN
icon/switch/switch-adaptive-enabled.png


BIN
icon/switch/switch-one-disabled.png


BIN
icon/switch/switch-one-enabled.png


BIN
icon/switch/switch-two-disabled.png


BIN
icon/switch/switch-two-enabled.png


+ 64 - 21
ideasxdevice.py

@@ -11,7 +11,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
 class Ui_IdeasXDevice(object):
     def setupUi(self, IdeasXDevice):
         IdeasXDevice.setObjectName("IdeasXDevice")
-        IdeasXDevice.resize(506, 84)
+        IdeasXDevice.resize(452, 84)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
@@ -22,38 +22,79 @@ class Ui_IdeasXDevice(object):
         IdeasXDevice.setAcceptDrops(False)
         IdeasXDevice.setAutoFillBackground(False)
         self.horizontalLayout = QtWidgets.QHBoxLayout(IdeasXDevice)
+        self.horizontalLayout.setContentsMargins(9, 3, 9, 3)
+        self.horizontalLayout.setSpacing(0)
         self.horizontalLayout.setObjectName("horizontalLayout")
         self.widgetInfo = QtWidgets.QWidget(IdeasXDevice)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Ignored)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(self.widgetInfo.sizePolicy().hasHeightForWidth())
         self.widgetInfo.setSizePolicy(sizePolicy)
-        self.widgetInfo.setMinimumSize(QtCore.QSize(290, 66))
+        self.widgetInfo.setMinimumSize(QtCore.QSize(290, 70))
         self.widgetInfo.setObjectName("widgetInfo")
-        self.label = QtWidgets.QLabel(self.widgetInfo)
-        self.label.setGeometry(QtCore.QRect(4, 5, 90, 60))
-        self.label.setText("")
-        self.label.setPixmap(QtGui.QPixmap("./icon/devicetype/modulev3.png"))
-        self.label.setObjectName("label")
-        self.labelRSSI = QtWidgets.QLabel(self.widgetInfo)
-        self.labelRSSI.setGeometry(QtCore.QRect(100, 50, 86, 16))
-        self.labelRSSI.setObjectName("labelRSSI")
+        self.labelDeviceType = QtWidgets.QLabel(self.widgetInfo)
+        self.labelDeviceType.setGeometry(QtCore.QRect(5, 0, 101, 76))
+        self.labelDeviceType.setToolTip("")
+        self.labelDeviceType.setStatusTip("")
+        self.labelDeviceType.setPixmap(QtGui.QPixmap("./icon/devicetype/modulev3b.png"))
+        self.labelDeviceType.setScaledContents(False)
+        self.labelDeviceType.setObjectName("labelDeviceType")
         self.labelModuleID = QtWidgets.QLabel(self.widgetInfo)
-        self.labelModuleID.setGeometry(QtCore.QRect(100, 0, 231, 35))
+        self.labelModuleID.setGeometry(QtCore.QRect(119, 5, 311, 36))
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.labelModuleID.sizePolicy().hasHeightForWidth())
+        self.labelModuleID.setSizePolicy(sizePolicy)
         font = QtGui.QFont()
-        font.setFamily("Roboto Condensed")
+        font.setFamily("TakaoPGothic")
         font.setPointSize(20)
+        font.setBold(False)
         font.setItalic(False)
+        font.setWeight(50)
         self.labelModuleID.setFont(font)
         self.labelModuleID.setFrameShape(QtWidgets.QFrame.NoFrame)
+        self.labelModuleID.setScaledContents(True)
         self.labelModuleID.setObjectName("labelModuleID")
+        self.labelSignal = QtWidgets.QLabel(self.widgetInfo)
+        self.labelSignal.setGeometry(QtCore.QRect(117, 43, 31, 31))
+        self.labelSignal.setToolTip("")
+        self.labelSignal.setPixmap(QtGui.QPixmap("./icon/network/network-wireless-signal-ok-symbolic.png"))
+        self.labelSignal.setScaledContents(False)
+        self.labelSignal.setObjectName("labelSignal")
         self.labelBattery = QtWidgets.QLabel(self.widgetInfo)
-        self.labelBattery.setGeometry(QtCore.QRect(100, 35, 166, 16))
+        self.labelBattery.setGeometry(QtCore.QRect(157, 43, 31, 31))
+        self.labelBattery.setToolTip("")
+        self.labelBattery.setStatusTip("")
+        self.labelBattery.setPixmap(QtGui.QPixmap("./icon/battery/battery-good-charging-symbolic.png"))
+        self.labelBattery.setScaledContents(False)
         self.labelBattery.setObjectName("labelBattery")
+        self.buttonSwitchOne = QtWidgets.QToolButton(self.widgetInfo)
+        self.buttonSwitchOne.setGeometry(QtCore.QRect(197, 43, 25, 31))
+        icon = QtGui.QIcon()
+        icon.addPixmap(QtGui.QPixmap("./icon/switch/switch-one-disabled.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.buttonSwitchOne.setIcon(icon)
+        self.buttonSwitchOne.setIconSize(QtCore.QSize(30, 30))
+        self.buttonSwitchOne.setAutoRaise(True)
+        self.buttonSwitchOne.setObjectName("buttonSwitchOne")
+        self.buttonSwitchTwo = QtWidgets.QToolButton(self.widgetInfo)
+        self.buttonSwitchTwo.setGeometry(QtCore.QRect(219, 43, 21, 31))
+        icon1 = QtGui.QIcon()
+        icon1.addPixmap(QtGui.QPixmap("./icon/switch/switch-two-disabled.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.buttonSwitchTwo.setIcon(icon1)
+        self.buttonSwitchTwo.setIconSize(QtCore.QSize(30, 30))
+        self.buttonSwitchTwo.setAutoRaise(True)
+        self.buttonSwitchTwo.setObjectName("buttonSwitchTwo")
+        self.buttonSwitchAdaptive = QtWidgets.QToolButton(self.widgetInfo)
+        self.buttonSwitchAdaptive.setGeometry(QtCore.QRect(238, 43, 25, 31))
+        icon2 = QtGui.QIcon()
+        icon2.addPixmap(QtGui.QPixmap("./icon/switch/switch-adaptive-disabled.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.buttonSwitchAdaptive.setIcon(icon2)
+        self.buttonSwitchAdaptive.setIconSize(QtCore.QSize(30, 30))
+        self.buttonSwitchAdaptive.setAutoRaise(True)
+        self.buttonSwitchAdaptive.setObjectName("buttonSwitchAdaptive")
         self.horizontalLayout.addWidget(self.widgetInfo)
-        spacerItem = QtWidgets.QSpacerItem(10, 20, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Minimum)
-        self.horizontalLayout.addItem(spacerItem)
         self.widgetControls = QtWidgets.QWidget(IdeasXDevice)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
         sizePolicy.setHorizontalStretch(0)
@@ -64,7 +105,7 @@ class Ui_IdeasXDevice(object):
         self.widgetControls.setMaximumSize(QtCore.QSize(120, 66))
         self.widgetControls.setObjectName("widgetControls")
         self.labelStatus = QtWidgets.QLabel(self.widgetControls)
-        self.labelStatus.setGeometry(QtCore.QRect(-5, 55, 116, 10))
+        self.labelStatus.setGeometry(QtCore.QRect(-70, 47, 181, 31))
         font = QtGui.QFont()
         font.setPointSize(6)
         font.setItalic(True)
@@ -79,7 +120,8 @@ class Ui_IdeasXDevice(object):
         self.buttonActivate = QtWidgets.QToolButton(self.widgetControls)
         self.buttonActivate.setGeometry(QtCore.QRect(5, 10, 91, 36))
         self.buttonActivate.setCheckable(True)
-        self.buttonActivate.setAutoRaise(False)
+        self.buttonActivate.setPopupMode(QtWidgets.QToolButton.DelayedPopup)
+        self.buttonActivate.setToolButtonStyle(QtCore.Qt.ToolButtonTextOnly)
         self.buttonActivate.setObjectName("buttonActivate")
         self.horizontalLayout.addWidget(self.widgetControls)
 
@@ -89,9 +131,10 @@ class Ui_IdeasXDevice(object):
     def retranslateUi(self, IdeasXDevice):
         _translate = QtCore.QCoreApplication.translate
         IdeasXDevice.setWindowTitle(_translate("IdeasXDevice", "Form"))
-        self.labelRSSI.setText(_translate("IdeasXDevice", "RSSI:  -54dBm"))
-        self.labelModuleID.setText(_translate("IdeasXDevice", "2f:32:56:4f:72:d8"))
-        self.labelBattery.setText(_translate("IdeasXDevice", "Battery:  98%"))
+        self.labelModuleID.setText(_translate("IdeasXDevice", "Sarah Stanton"))
+        self.buttonSwitchOne.setText(_translate("IdeasXDevice", "..."))
+        self.buttonSwitchTwo.setText(_translate("IdeasXDevice", "..."))
+        self.buttonSwitchAdaptive.setText(_translate("IdeasXDevice", "..."))
         self.labelStatus.setText(_translate("IdeasXDevice", "Last Update: 2:30AM"))
         self.buttonMenu.setText(_translate("IdeasXDevice", "Activate "))
         self.buttonActivate.setText(_translate("IdeasXDevice", "Activate"))

+ 0 - 74
ideasxdevice2.py

@@ -1,74 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file 'ideasxdevice.ui'
-#
-# Created by: PyQt5 UI code generator 5.7
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt5 import QtCore, QtGui, QtWidgets
-
-class Ui_IdeasXDevice(object):
-    def setupUi(self, IdeasXDevice):
-        IdeasXDevice.setObjectName("IdeasXDevice")
-        IdeasXDevice.resize(416, 70)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(IdeasXDevice.sizePolicy().hasHeightForWidth())
-        IdeasXDevice.setSizePolicy(sizePolicy)
-        IdeasXDevice.setMinimumSize(QtCore.QSize(416, 70))
-        IdeasXDevice.setAutoFillBackground(False)
-        self.buttonActivate = QtWidgets.QPushButton(IdeasXDevice)
-        self.buttonActivate.setGeometry(QtCore.QRect(289, 11, 121, 31))
-        self.buttonActivate.setAutoFillBackground(False)
-        self.buttonActivate.setCheckable(True)
-        self.buttonActivate.setChecked(False)
-        self.buttonActivate.setObjectName("buttonActivate")
-        self.labelModuleID = QtWidgets.QLabel(IdeasXDevice)
-        self.labelModuleID.setGeometry(QtCore.QRect(105, 5, 181, 31))
-        font = QtGui.QFont()
-        font.setFamily("Roboto Condensed")
-        font.setPointSize(20)
-        font.setItalic(False)
-        self.labelModuleID.setFont(font)
-        self.labelModuleID.setFrameShape(QtWidgets.QFrame.NoFrame)
-        self.labelModuleID.setObjectName("labelModuleID")
-        self.labelStatus = QtWidgets.QLabel(IdeasXDevice)
-        self.labelStatus.setGeometry(QtCore.QRect(226, 50, 181, 16))
-        font = QtGui.QFont()
-        font.setFamily("DejaVu Sans")
-        font.setPointSize(6)
-        font.setItalic(True)
-        self.labelStatus.setFont(font)
-        self.labelStatus.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
-        self.labelStatus.setObjectName("labelStatus")
-        self.labelBattery = QtWidgets.QLabel(IdeasXDevice)
-        self.labelBattery.setGeometry(QtCore.QRect(105, 35, 171, 16))
-        self.labelBattery.setObjectName("labelBattery")
-        self.labelRSSI = QtWidgets.QLabel(IdeasXDevice)
-        self.labelRSSI.setGeometry(QtCore.QRect(105, 50, 91, 16))
-        self.labelRSSI.setObjectName("labelRSSI")
-        self.label = QtWidgets.QLabel(IdeasXDevice)
-        self.label.setGeometry(QtCore.QRect(10, 0, 91, 71))
-        self.label.setText("")
-        self.label.setPixmap(QtGui.QPixmap("./icon/devicetype/modulev3.png"))
-        self.label.setObjectName("label")
-        self.line = QtWidgets.QFrame(IdeasXDevice)
-        self.line.setGeometry(QtCore.QRect(-13, 60, 431, 20))
-        self.line.setFrameShape(QtWidgets.QFrame.HLine)
-        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
-        self.line.setObjectName("line")
-
-        self.retranslateUi(IdeasXDevice)
-        QtCore.QMetaObject.connectSlotsByName(IdeasXDevice)
-
-    def retranslateUi(self, IdeasXDevice):
-        _translate = QtCore.QCoreApplication.translate
-        IdeasXDevice.setWindowTitle(_translate("IdeasXDevice", "Form"))
-        self.buttonActivate.setText(_translate("IdeasXDevice", "Activate"))
-        self.labelModuleID.setText(_translate("IdeasXDevice", "2f:32:56:4f:72"))
-        self.labelStatus.setText(_translate("IdeasXDevice", "Last Update: 7:46AM"))
-        self.labelBattery.setText(_translate("IdeasXDevice", "Battery:  98%"))
-        self.labelRSSI.setText(_translate("IdeasXDevice", "RSSI:  -54dBm"))
-

+ 0 - 39
listwidgetexample.py

@@ -1,39 +0,0 @@
-import sys
-from PyQt5 import QtGui, QtWidgets, QtCore
-from ideasxdevice import Ui_IdeasXDevice
-from mainwindow import Ui_MainWindow
-
-
-class IdeasXUI(Ui_MainWindow):
-    def __init__(self, MainWindow):
-        Ui_MainWindow.__init__(self)
-        self.setupUi(MainWindow)
-        MainWindow.setWindowIcon(QtGui.QIcon("./icon/IDEAS.png"))
-
-        self.statusbar.showMessage("Connected to IdeasX")
-        IdeasXDevice = QtWidgets.QWidget()
-        #ui = Ui_IdeasXDevice()
-        #ui.setupUi(IdeasXDevice)
-        IdeasXDevice = Ui_IdeasXDevice()
-        myCustomWidgetItem = QtWidgets.QListWidgetItem()
-        myCustomWidgetItem.setSizeHint(QtCore.QSize(100,40))
-        self.listEncoder.addItem(myCustomWidgetItem)
-        self.listEncoder.setItemWidget(myCustomWidgetItem, IdeasXDevice)
-
-if __name__ == '__main__': 
-    app = QtWidgets.QApplication(sys.argv)
-    main_window = QtWidgets.QMainWindow()
-    ui = IdeasXUI(main_window)
-    main_window.show()
-    
-    '''
-    def updateTable():
-        print("tick")
-        ui.encoderModel.select()
-        ui.tableEncoder.resizeColumnsToContents()
-    
-    displayTimer = QtCore.QTimer()
-    displayTimer.timeout.connect(updateTable)
-    displayTimer.start(1000)
-    '''    
-    sys.exit(app.exec_())

+ 14 - 14
mainwindow.py

@@ -51,32 +51,33 @@ class Ui_MainWindow(object):
         self.searchEncoder = QtWidgets.QLineEdit(self.tabEncoder)
         self.searchEncoder.setClearButtonEnabled(True)
         self.searchEncoder.setObjectName("searchEncoder")
-        self.gridLayout.addWidget(self.searchEncoder, 1, 1, 1, 1)
+        self.gridLayout.addWidget(self.searchEncoder, 1, 2, 1, 1)
         spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
-        self.gridLayout.addItem(spacerItem, 1, 0, 1, 1)
-        self.listEncoder = QtWidgets.QListWidget(self.tabEncoder)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.listEncoder.sizePolicy().hasHeightForWidth())
-        self.listEncoder.setSizePolicy(sizePolicy)
-        self.listEncoder.setAlternatingRowColors(True)
-        self.listEncoder.setObjectName("listEncoder")
-        self.gridLayout.addWidget(self.listEncoder, 0, 0, 1, 2)
+        self.gridLayout.addItem(spacerItem, 1, 1, 1, 1)
+        self.scrollEncoder = QtWidgets.QScrollArea(self.tabEncoder)
+        self.scrollEncoder.setAutoFillBackground(False)
+        self.scrollEncoder.setStyleSheet("")
+        self.scrollEncoder.setWidgetResizable(True)
+        self.scrollEncoder.setObjectName("scrollEncoder")
+        self.contentEncoder = QtWidgets.QWidget()
+        self.contentEncoder.setGeometry(QtCore.QRect(0, 0, 459, 556))
+        self.contentEncoder.setObjectName("contentEncoder")
+        self.scrollEncoder.setWidget(self.contentEncoder)
+        self.gridLayout.addWidget(self.scrollEncoder, 0, 0, 1, 3)
         self.tabWidget.addTab(self.tabEncoder, "")
         self.tabActuator = QtWidgets.QWidget()
         self.tabActuator.setObjectName("tabActuator")
         self.gridLayout_2 = QtWidgets.QGridLayout(self.tabActuator)
         self.gridLayout_2.setContentsMargins(9, 9, 9, 9)
         self.gridLayout_2.setObjectName("gridLayout_2")
+        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.gridLayout_2.addItem(spacerItem1, 1, 0, 1, 1)
         self.searchActuator = QtWidgets.QLineEdit(self.tabActuator)
         self.searchActuator.setAutoFillBackground(False)
         self.searchActuator.setFrame(True)
         self.searchActuator.setClearButtonEnabled(True)
         self.searchActuator.setObjectName("searchActuator")
         self.gridLayout_2.addWidget(self.searchActuator, 1, 1, 1, 1)
-        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
-        self.gridLayout_2.addItem(spacerItem1, 1, 0, 1, 1)
         self.tableActuator = QtWidgets.QTableView(self.tabActuator)
         self.tableActuator.setEnabled(True)
         self.tableActuator.setFrameShadow(QtWidgets.QFrame.Plain)
@@ -161,7 +162,6 @@ class Ui_MainWindow(object):
         _translate = QtCore.QCoreApplication.translate
         MainWindow.setWindowTitle(_translate("MainWindow", "IdeasX Workstation Client"))
         self.searchEncoder.setPlaceholderText(_translate("MainWindow", "Search for Encoders..."))
-        self.listEncoder.setSortingEnabled(False)
         self.tabWidget.setTabText(self.tabWidget.indexOf(self.tabEncoder), _translate("MainWindow", "Encoders"))
         self.searchActuator.setPlaceholderText(_translate("MainWindow", "Search for Actuator"))
         self.tabWidget.setTabText(self.tabWidget.indexOf(self.tabActuator), _translate("MainWindow", "Actuators"))

Some files were not shown because too many files changed in this diff