Browse Source

Updated settings dialog and constructed info screen for each module

curiousmuch 7 years ago
parent
commit
434b2601b8
10 changed files with 977 additions and 10 deletions
  1. 4 0
      .gitignore
  2. 2 0
      IdeasXWSCBackend.py
  3. 72 8
      IdeasXWSCView.py
  4. 253 0
      Qt/devicedialog.ui
  5. 1 1
      Qt/mainwindow.ui
  6. 480 0
      Qt/mainwindow.ui.autosave
  7. 155 0
      devicedialog.py
  8. 1 1
      mainwindow2.py
  9. 1 0
      start.sh
  10. 8 0
      wsc.desktop

+ 4 - 0
.gitignore

@@ -4,3 +4,7 @@ examples
 .project
 .pydevproject
 .settings
+.desktop 
+.sh
+.pyc
+

+ 2 - 0
IdeasXWSCBackend.py

@@ -119,8 +119,10 @@ class IdeasXWSCNetworkThread(QObject):
         if self.__debug: 
             if rc != 0: 
                 self.printError("Client disconnected and its a mystery why!")
+                self.networkStatus.emit("Uh No! WSC was disconnected!")
             else: 
                 self.printInfo("Client successfully disconnected.") 
+                self.networkStatus.emit("Uh No! WSC was disconnected!")
             self.printLine()   
             
     def mqtt_on_log(self, mqttc, backend_data, level, string):

+ 72 - 8
IdeasXWSCView.py

@@ -3,12 +3,12 @@ import sys
 import time
 import sip
 from PyQt5 import QtCore, QtGui, QtWidgets
-from mainwindow import Ui_MainWindow
+from mainwindow2 import Ui_MainWindow
 from ideasxdevice import Ui_IdeasXDevice
 from IdeasXWSCBackend import IdeasXWSCNetworkThread
 from ParsingTools import ParsingTools
 from encoderconfigurationdialog import Ui_SwitchConfigDialog
-
+from devicedialog import Ui_Dialog
 
 class IdeasXSwitchDialog(QtWidgets.QDialog):
     
@@ -28,6 +28,34 @@ class IdeasXSwitchDialog(QtWidgets.QDialog):
         self.key = self.__ui.lineSwitchKey.text() 
         self.enable = self.__ui.checkSwitchEnable.isChecked()
         self.accept()
+        
+class IdeasXDeviceInformationDialog(QtWidgets.QDialog):
+    newDeviceName = QtCore.pyqtSignal(['QString'], name='newDeviceName')
+    
+    def __init__(self):
+        super(IdeasXDeviceInformationDialog, self).__init__()
+        self.__ui = Ui_Dialog()
+        self.__ui.setupUi(self)
+        self.__ui.lineAlias.textEdited.connect(lambda: self.newDeviceName.emit(self.__ui.lineAlias.text()))
+        
+    def updateDisplay(self, encoder):
+        self.__ui.labelBatteryCapacity.setText(str(encoder['soc']))
+        self.__ui.labelBatteryVoltage.setText(str(encoder['vcell']))
+        self.__ui.labelLowBattery.setText(str(encoder['lb']))
+        self.__ui.labelChargeState.setText('N/A')
+        
+        self.__ui.labelActiveFlag.setText('N/A')
+        self.__ui.labelAliveFlag.setText(str(encoder['alive'])) 
+        self.__ui.labelFirmwareVersion.setText(str(encoder['firmware_version'])) 
+        self.__ui.labelHardwareVersion.setText(str(encoder['hardware_version'])) 
+        self.__ui.labelOTAFlag.setText(str(encoder['ota']))
+        self.__ui.labelROMSlot.setText(str(encoder['rom'])) 
+        
+        self.__ui.labelMAC.setText(str(encoder['module_id']))
+        self.__ui.labelRSSI.setText(str(encoder['rssi'])) 
+        self.__ui.labelSSID.setText(encoder['ssid']) 
+        
+    
 
 class IdeasXDeviceManager():
     def __init__(self, deviceClass, wsc): 
@@ -100,6 +128,7 @@ class IdeasXEncoder(QtWidgets.QWidget):
                                    'switch-adaptive-disabled.png']
                        }
         self.__deviceType = 'encoder'
+        self.__deviceName = None
         self.__wsc = wsc
         # Setup UI components
         super(IdeasXEncoder, self).__init__()
@@ -117,6 +146,13 @@ class IdeasXEncoder(QtWidgets.QWidget):
                                                                                  self.__wsc.keyEmulator.getAssignedKey(self.__strModuleID, self.__wsc.keyEmulator.switchOne)))
         self.__ui.buttonSwitchTwo.clicked.connect(lambda: self.openSwitchDialog(self.__wsc.keyEmulator.switchTwo,
                                                                                 self.__wsc.keyEmulator.getAssignedKey(self.__strModuleID, self.__wsc.keyEmulator.switchTwo)))
+        
+        
+    def openDeviceInformation(self):
+        dialog = IdeasXDeviceInformationDialog()
+        dialog.updateDisplay(self.__wsc.encoders[self.__strModuleID])
+        dialog.newDeviceName.connect(self.setDeviceAlisas)
+        dialog.exec()
     
     def openSwitchDialog(self, switch, assignedKey):
         dialog = IdeasXSwitchDialog(switch, assignedKey)
@@ -136,16 +172,20 @@ class IdeasXEncoder(QtWidgets.QWidget):
         shutdownAction = QtWidgets.QAction('Shutdown Encoder', self)
         shutdownAction.triggered.connect(lambda: self.__wsc.shutdownDevice(self.__strModuleID, None))
         testKeysAction = QtWidgets.QAction("Test Keys", self)
+        openInfoAction = QtWidgets.QAction("Device Information", self)
+
         testKeysAction.triggered.connect(self.testKeys)
+        openInfoAction.triggered.connect(self.openDeviceInformation)
         
-        
+                
         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.addSection("Encoder Commands")
         deviceMenu.addAction(shutdownAction)
+        deviceMenu.addAction(openInfoAction)
         #deviceMenu.addAction("Restart Encoder")
         #deviceMenu.addAction("Update Firmware")
         deviceMenu.addSection("Engineering Tools")
@@ -170,13 +210,21 @@ class IdeasXEncoder(QtWidgets.QWidget):
         self.__strModuleID = self._parserTools.macToString(encoder['module_id'])
         self.__updateTime = encoder['time']
         
-        self.setModuleID(self.__strModuleID)
+        if self.__deviceName == None:
+            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 setDeviceAlisas(self, label):
+        self.__deviceName = label
+        if label != None or label != "": 
+            self.__ui.labelModuleID.setText(label)
+        else: 
+            self.__ui.labelModuleID.setText(self.__strModuleID)
 
     def setSOCIcon(self, soc):
         if soc >= 75: 
@@ -269,9 +317,9 @@ class IdeasXMainWindow(QtWidgets.QMainWindow):
         
         self.restoreSettings()
         
-        self.__ui.buttonSettings.clicked.connect(self.updateBrokerSettings)
-        
-        
+        #self.__ui.buttonSettings.clicked.connect(self.updateBrokerSettings)
+        self.__ui.buttonBoxNetwork.button(QtWidgets.QDialogButtonBox.Apply).clicked.connect(self.updateBrokerSettings)
+        self.__ui.buttonBoxNetwork.button(QtWidgets.QDialogButtonBox.Cancel).clicked.connect(self.restoreBrokerSettings)
         
 
     def setEncoderLayout(self, layout):
@@ -343,6 +391,22 @@ class IdeasXMainWindow(QtWidgets.QMainWindow):
         self.__OTAServer = settings.value('OTAServer', 'ideasx.duckdns.org')
         settings.endGroup()
         
+    def restoreBrokerSettings(self):
+        settings = QtCore.QSettings(self.__org, self.__app)
+
+        settings.beginGroup("Broker")
+        self.__NetworkBroker = settings.value('NetworkBroker', 'ideasx.duckdns.org')
+        self.__NetworkPort = settings.value('NetworkPort', 1883)
+        self.__LocalBroker = settings.value('LocalBroker', '10.42.0.1')
+        self.__LocalPort = settings.value('LocalPort', 1883)
+        settings.endGroup()
+        
+        self.__ui.networkBroker.setText(self.__NetworkBroker)
+        self.__ui.networkPort.setText(str(self.__NetworkPort))
+        self.__ui.localBroker.setText(self.__LocalBroker)
+        self.__ui.localPort.setText(str(self.__LocalPort))
+        
+        
     def closeEvent(self, event):
         self.saveSettings()
         super(IdeasXMainWindow, self).closeEvent(event)

+ 253 - 0
Qt/devicedialog.ui

@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>357</width>
+    <height>428</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item alignment="Qt::AlignTop">
+    <widget class="QGroupBox" name="IdInfo">
+     <property name="title">
+      <string>Identifcation Information</string>
+     </property>
+     <layout class="QFormLayout" name="formLayout">
+      <item row="0" column="0">
+       <widget class="QLabel" name="label">
+        <property name="text">
+         <string>Device Alias:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QLineEdit" name="lineAlias"/>
+      </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="label_2">
+        <property name="text">
+         <string>Device MAC Address:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QLabel" name="labelMAC">
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0">
+       <widget class="QLabel" name="label_24">
+        <property name="text">
+         <string>AP SSID: </string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <widget class="QLabel" name="labelSSID">
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0">
+       <widget class="QLabel" name="label_26">
+        <property name="text">
+         <string>RSSI (dBm):</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="1">
+       <widget class="QLabel" name="labelRSSI">
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item alignment="Qt::AlignTop">
+    <widget class="QGroupBox" name="HWSpecsAndStatus">
+     <property name="title">
+      <string>Hardware Specifications and Status</string>
+     </property>
+     <layout class="QFormLayout" name="formLayout_3">
+      <item row="0" column="0">
+       <widget class="QLabel" name="label_8">
+        <property name="text">
+         <string>Firmware Version:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="label_9">
+        <property name="text">
+         <string>Hardware Version:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0">
+       <widget class="QLabel" name="label_12">
+        <property name="text">
+         <string>ROM Slot:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QLabel" name="labelFirmwareVersion">
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QLabel" name="labelHardwareVersion">
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <widget class="QLabel" name="labelROMSlot">
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0">
+       <widget class="QLabel" name="label_18">
+        <property name="text">
+         <string>Alive Flag:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="1">
+       <widget class="QLabel" name="labelAliveFlag">
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+      </item>
+      <item row="4" column="0">
+       <widget class="QLabel" name="label_20">
+        <property name="text">
+         <string>Active Flag:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="4" column="1">
+       <widget class="QLabel" name="labelActiveFlag">
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+      </item>
+      <item row="5" column="0">
+       <widget class="QLabel" name="label_22">
+        <property name="text">
+         <string>OTA Flag:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="5" column="1">
+       <widget class="QLabel" name="labelOTAFlag">
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item alignment="Qt::AlignTop">
+    <widget class="QGroupBox" name="BatteryInfo">
+     <property name="title">
+      <string>Battery Information</string>
+     </property>
+     <layout class="QFormLayout" name="formLayout_2">
+      <item row="0" column="0">
+       <widget class="QLabel" name="label_4">
+        <property name="text">
+         <string>Voltage (V):</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QLabel" name="labelBatteryVoltage">
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="label_6">
+        <property name="text">
+         <string>Remaining Capacity:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QLabel" name="labelBatteryCapacity">
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0">
+       <widget class="QLabel" name="label_10">
+        <property name="text">
+         <string>Charging State:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <widget class="QLabel" name="labelChargeState">
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0">
+       <widget class="QLabel" name="label_16">
+        <property name="text">
+         <string>Low Battery Indicator:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="1">
+       <widget class="QLabel" name="labelLowBattery">
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <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>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 1 - 1
Qt/mainwindow.ui

@@ -321,7 +321,7 @@
         <item>
          <widget class="QDialogButtonBox" name="buttonBoxNetwork">
           <property name="standardButtons">
-           <set>QDialogButtonBox::Apply|QDialogButtonBox::Discard</set>
+           <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel</set>
           </property>
          </widget>
         </item>

+ 480 - 0
Qt/mainwindow.ui.autosave

@@ -0,0 +1,480 @@
+<?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>2</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="2">
+         <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="1">
+         <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="3">
+         <widget class="QScrollArea" name="scrollEncoder">
+          <property name="autoFillBackground">
+           <bool>false</bool>
+          </property>
+          <property name="styleSheet">
+           <string notr="true"/>
+          </property>
+          <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>
+      </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="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">
+           <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="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="QVBoxLayout" name="verticalLayout_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>
+         <widget class="QGroupBox" name="groupNetwork">
+          <property name="title">
+           <string>Network Settings</string>
+          </property>
+          <layout class="QFormLayout" name="formLayout">
+           <item row="0" column="0">
+            <widget class="QLabel" name="labelNetworkBroker">
+             <property name="text">
+              <string>Network Broker:</string>
+             </property>
+            </widget>
+           </item>
+           <item row="0" column="1">
+            <widget class="QLineEdit" name="networkBroker">
+             <property name="inputMethodHints">
+              <set>Qt::ImhUrlCharactersOnly</set>
+             </property>
+             <property name="placeholderText">
+              <string>URL or IP</string>
+             </property>
+            </widget>
+           </item>
+           <item row="2" column="1">
+            <widget class="QLineEdit" name="networkPort">
+             <property name="inputMethodHints">
+              <set>Qt::ImhPreferNumbers</set>
+             </property>
+             <property name="text">
+              <string/>
+             </property>
+             <property name="placeholderText">
+              <string>Port</string>
+             </property>
+            </widget>
+           </item>
+           <item row="3" column="0">
+            <widget class="QLabel" name="labelLocalBroker">
+             <property name="text">
+              <string>Local Broker:</string>
+             </property>
+            </widget>
+           </item>
+           <item row="3" column="1">
+            <widget class="QLineEdit" name="localBroker">
+             <property name="inputMethodHints">
+              <set>Qt::ImhUrlCharactersOnly</set>
+             </property>
+             <property name="placeholderText">
+              <string>URL or IP</string>
+             </property>
+            </widget>
+           </item>
+           <item row="5" column="1">
+            <widget class="QLineEdit" name="localPort">
+             <property name="inputMethodHints">
+              <set>Qt::ImhPreferNumbers</set>
+             </property>
+             <property name="placeholderText">
+              <string>Port</string>
+             </property>
+            </widget>
+           </item>
+           <item row="6" column="1">
+            <widget class="QLineEdit" name="otaServer">
+             <property name="text">
+              <string/>
+             </property>
+             <property name="placeholderText">
+              <string>URL or IP</string>
+             </property>
+            </widget>
+           </item>
+           <item row="6" column="0">
+            <widget class="QLabel" name="labelOTA">
+             <property name="text">
+              <string>OTA Server:</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </widget>
+        </item>
+        <item>
+         <widget class="QDialogButtonBox" name="buttonBoxNetwork">
+          <property name="standardButtons">
+           <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel</set>
+          </property>
+         </widget>
+        </item>
+        <item alignment="Qt::AlignTop">
+         <widget class="QGroupBox" name="groupDeviceSettings">
+          <property name="title">
+           <string>Device Settings</string>
+          </property>
+          <layout class="QFormLayout" name="formLayout_2">
+           <item row="1" column="0">
+            <widget class="QLabel" name="labelAPSelector">
+             <property name="text">
+              <string>Wi-Fi Access Point:</string>
+             </property>
+            </widget>
+           </item>
+           <item row="1" column="1">
+            <widget class="QSpinBox" name="selectAP">
+             <property name="suffix">
+              <string/>
+             </property>
+             <property name="prefix">
+              <string>Access Point </string>
+             </property>
+             <property name="minimum">
+              <number>1</number>
+             </property>
+             <property name="maximum">
+              <number>5</number>
+             </property>
+            </widget>
+           </item>
+           <item row="2" column="0">
+            <widget class="QLabel" name="labelSSID">
+             <property name="text">
+              <string>SSID:</string>
+             </property>
+            </widget>
+           </item>
+           <item row="2" column="1">
+            <widget class="QLineEdit" name="wifiSSID"/>
+           </item>
+           <item row="3" column="0">
+            <widget class="QLabel" name="labelPassword">
+             <property name="text">
+              <string>Password:</string>
+             </property>
+            </widget>
+           </item>
+           <item row="3" column="1">
+            <widget class="QLineEdit" name="wifiPassword"/>
+           </item>
+          </layout>
+         </widget>
+        </item>
+        <item>
+         <widget class="QDialogButtonBox" name="buttonBoxDevice">
+          <property name="standardButtons">
+           <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QGroupBox" name="groupUpdat">
+          <property name="title">
+           <string>WSC Update Settings</string>
+          </property>
+          <layout class="QFormLayout" name="formLayout_3">
+           <item row="0" column="1">
+            <widget class="QLineEdit" name="lineEdit">
+             <property name="placeholderText">
+              <string>URL to GitHub Repository</string>
+             </property>
+            </widget>
+           </item>
+           <item row="1" column="0">
+            <widget class="QPushButton" name="pushButton">
+             <property name="text">
+              <string>Check for Update</string>
+             </property>
+            </widget>
+           </item>
+           <item row="0" column="0">
+            <widget class="QLabel" name="label">
+             <property name="text">
+              <string>WSC Software Repository:</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </widget>
+        </item>
+        <item>
+         <widget class="QGroupBox" name="groupBox_2">
+          <property name="title">
+           <string>Global Commands</string>
+          </property>
+          <layout class="QFormLayout" name="formLayout_4">
+           <item row="0" column="0">
+            <widget class="QLabel" name="label_2">
+             <property name="text">
+              <string>Global Command: </string>
+             </property>
+            </widget>
+           </item>
+           <item row="0" column="1">
+            <widget class="QComboBox" name="comboBox">
+             <property name="currentText">
+              <string/>
+             </property>
+            </widget>
+           </item>
+           <item row="1" column="0">
+            <widget class="QPushButton" name="pushButton_2">
+             <property name="text">
+              <string>Send Command</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </widget>
+        </item>
+        <item>
+         <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>
+       </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>

+ 155 - 0
devicedialog.py

@@ -0,0 +1,155 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'devicedialog.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_Dialog(object):
+    def setupUi(self, Dialog):
+        Dialog.setObjectName("Dialog")
+        Dialog.resize(357, 428)
+        self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.IdInfo = QtWidgets.QGroupBox(Dialog)
+        self.IdInfo.setObjectName("IdInfo")
+        self.formLayout = QtWidgets.QFormLayout(self.IdInfo)
+        self.formLayout.setObjectName("formLayout")
+        self.label = QtWidgets.QLabel(self.IdInfo)
+        self.label.setObjectName("label")
+        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
+        self.lineAlias = QtWidgets.QLineEdit(self.IdInfo)
+        self.lineAlias.setObjectName("lineAlias")
+        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineAlias)
+        self.label_2 = QtWidgets.QLabel(self.IdInfo)
+        self.label_2.setObjectName("label_2")
+        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2)
+        self.labelMAC = QtWidgets.QLabel(self.IdInfo)
+        self.labelMAC.setObjectName("labelMAC")
+        self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.labelMAC)
+        self.label_24 = QtWidgets.QLabel(self.IdInfo)
+        self.label_24.setObjectName("label_24")
+        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_24)
+        self.labelSSID = QtWidgets.QLabel(self.IdInfo)
+        self.labelSSID.setObjectName("labelSSID")
+        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.labelSSID)
+        self.label_26 = QtWidgets.QLabel(self.IdInfo)
+        self.label_26.setObjectName("label_26")
+        self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_26)
+        self.labelRSSI = QtWidgets.QLabel(self.IdInfo)
+        self.labelRSSI.setObjectName("labelRSSI")
+        self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.labelRSSI)
+        self.verticalLayout.addWidget(self.IdInfo, 0, QtCore.Qt.AlignTop)
+        self.HWSpecsAndStatus = QtWidgets.QGroupBox(Dialog)
+        self.HWSpecsAndStatus.setObjectName("HWSpecsAndStatus")
+        self.formLayout_3 = QtWidgets.QFormLayout(self.HWSpecsAndStatus)
+        self.formLayout_3.setObjectName("formLayout_3")
+        self.label_8 = QtWidgets.QLabel(self.HWSpecsAndStatus)
+        self.label_8.setObjectName("label_8")
+        self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_8)
+        self.label_9 = QtWidgets.QLabel(self.HWSpecsAndStatus)
+        self.label_9.setObjectName("label_9")
+        self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_9)
+        self.label_12 = QtWidgets.QLabel(self.HWSpecsAndStatus)
+        self.label_12.setObjectName("label_12")
+        self.formLayout_3.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_12)
+        self.labelFirmwareVersion = QtWidgets.QLabel(self.HWSpecsAndStatus)
+        self.labelFirmwareVersion.setObjectName("labelFirmwareVersion")
+        self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.labelFirmwareVersion)
+        self.labelHardwareVersion = QtWidgets.QLabel(self.HWSpecsAndStatus)
+        self.labelHardwareVersion.setObjectName("labelHardwareVersion")
+        self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.labelHardwareVersion)
+        self.labelROMSlot = QtWidgets.QLabel(self.HWSpecsAndStatus)
+        self.labelROMSlot.setObjectName("labelROMSlot")
+        self.formLayout_3.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.labelROMSlot)
+        self.label_18 = QtWidgets.QLabel(self.HWSpecsAndStatus)
+        self.label_18.setObjectName("label_18")
+        self.formLayout_3.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_18)
+        self.labelAliveFlag = QtWidgets.QLabel(self.HWSpecsAndStatus)
+        self.labelAliveFlag.setObjectName("labelAliveFlag")
+        self.formLayout_3.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.labelAliveFlag)
+        self.label_20 = QtWidgets.QLabel(self.HWSpecsAndStatus)
+        self.label_20.setObjectName("label_20")
+        self.formLayout_3.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_20)
+        self.labelActiveFlag = QtWidgets.QLabel(self.HWSpecsAndStatus)
+        self.labelActiveFlag.setObjectName("labelActiveFlag")
+        self.formLayout_3.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.labelActiveFlag)
+        self.label_22 = QtWidgets.QLabel(self.HWSpecsAndStatus)
+        self.label_22.setObjectName("label_22")
+        self.formLayout_3.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.label_22)
+        self.labelOTAFlag = QtWidgets.QLabel(self.HWSpecsAndStatus)
+        self.labelOTAFlag.setObjectName("labelOTAFlag")
+        self.formLayout_3.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.labelOTAFlag)
+        self.verticalLayout.addWidget(self.HWSpecsAndStatus, 0, QtCore.Qt.AlignTop)
+        self.BatteryInfo = QtWidgets.QGroupBox(Dialog)
+        self.BatteryInfo.setObjectName("BatteryInfo")
+        self.formLayout_2 = QtWidgets.QFormLayout(self.BatteryInfo)
+        self.formLayout_2.setObjectName("formLayout_2")
+        self.label_4 = QtWidgets.QLabel(self.BatteryInfo)
+        self.label_4.setObjectName("label_4")
+        self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_4)
+        self.labelBatteryVoltage = QtWidgets.QLabel(self.BatteryInfo)
+        self.labelBatteryVoltage.setObjectName("labelBatteryVoltage")
+        self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.labelBatteryVoltage)
+        self.label_6 = QtWidgets.QLabel(self.BatteryInfo)
+        self.label_6.setObjectName("label_6")
+        self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_6)
+        self.labelBatteryCapacity = QtWidgets.QLabel(self.BatteryInfo)
+        self.labelBatteryCapacity.setObjectName("labelBatteryCapacity")
+        self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.labelBatteryCapacity)
+        self.label_10 = QtWidgets.QLabel(self.BatteryInfo)
+        self.label_10.setObjectName("label_10")
+        self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_10)
+        self.labelChargeState = QtWidgets.QLabel(self.BatteryInfo)
+        self.labelChargeState.setObjectName("labelChargeState")
+        self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.labelChargeState)
+        self.label_16 = QtWidgets.QLabel(self.BatteryInfo)
+        self.label_16.setObjectName("label_16")
+        self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_16)
+        self.labelLowBattery = QtWidgets.QLabel(self.BatteryInfo)
+        self.labelLowBattery.setObjectName("labelLowBattery")
+        self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.labelLowBattery)
+        self.verticalLayout.addWidget(self.BatteryInfo, 0, QtCore.Qt.AlignTop)
+        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout.addItem(spacerItem)
+
+        self.retranslateUi(Dialog)
+        QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+    def retranslateUi(self, Dialog):
+        _translate = QtCore.QCoreApplication.translate
+        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
+        self.IdInfo.setTitle(_translate("Dialog", "Identifcation Information"))
+        self.label.setText(_translate("Dialog", "Device Alias:"))
+        self.label_2.setText(_translate("Dialog", "Device MAC Address:"))
+        self.labelMAC.setText(_translate("Dialog", "TextLabel"))
+        self.label_24.setText(_translate("Dialog", "AP SSID: "))
+        self.labelSSID.setText(_translate("Dialog", "TextLabel"))
+        self.label_26.setText(_translate("Dialog", "RSSI (dBm):"))
+        self.labelRSSI.setText(_translate("Dialog", "TextLabel"))
+        self.HWSpecsAndStatus.setTitle(_translate("Dialog", "Hardware Specifications and Status"))
+        self.label_8.setText(_translate("Dialog", "Firmware Version:"))
+        self.label_9.setText(_translate("Dialog", "Hardware Version:"))
+        self.label_12.setText(_translate("Dialog", "ROM Slot:"))
+        self.labelFirmwareVersion.setText(_translate("Dialog", "TextLabel"))
+        self.labelHardwareVersion.setText(_translate("Dialog", "TextLabel"))
+        self.labelROMSlot.setText(_translate("Dialog", "TextLabel"))
+        self.label_18.setText(_translate("Dialog", "Alive Flag:"))
+        self.labelAliveFlag.setText(_translate("Dialog", "TextLabel"))
+        self.label_20.setText(_translate("Dialog", "Active Flag:"))
+        self.labelActiveFlag.setText(_translate("Dialog", "TextLabel"))
+        self.label_22.setText(_translate("Dialog", "OTA Flag:"))
+        self.labelOTAFlag.setText(_translate("Dialog", "TextLabel"))
+        self.BatteryInfo.setTitle(_translate("Dialog", "Battery Information"))
+        self.label_4.setText(_translate("Dialog", "Voltage (V):"))
+        self.labelBatteryVoltage.setText(_translate("Dialog", "TextLabel"))
+        self.label_6.setText(_translate("Dialog", "Remaining Capacity:"))
+        self.labelBatteryCapacity.setText(_translate("Dialog", "TextLabel"))
+        self.label_10.setText(_translate("Dialog", "Charging State:"))
+        self.labelChargeState.setText(_translate("Dialog", "TextLabel"))
+        self.label_16.setText(_translate("Dialog", "Low Battery Indicator:"))
+        self.labelLowBattery.setText(_translate("Dialog", "TextLabel"))
+

+ 1 - 1
mainwindow2.py

@@ -130,7 +130,7 @@ class Ui_MainWindow(object):
         self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.labelOTA)
         self.verticalLayout_2.addWidget(self.groupNetwork)
         self.buttonBoxNetwork = QtWidgets.QDialogButtonBox(self.tabSetting)
-        self.buttonBoxNetwork.setStandardButtons(QtWidgets.QDialogButtonBox.Apply|QtWidgets.QDialogButtonBox.Discard)
+        self.buttonBoxNetwork.setStandardButtons(QtWidgets.QDialogButtonBox.Apply|QtWidgets.QDialogButtonBox.Cancel)
         self.buttonBoxNetwork.setObjectName("buttonBoxNetwork")
         self.verticalLayout_2.addWidget(self.buttonBoxNetwork)
         self.groupDeviceSettings = QtWidgets.QGroupBox(self.tabSetting)

+ 1 - 0
start.sh

@@ -0,0 +1 @@
+python3 /home/tyler/ideasX-repositories/ideasX-workstation-client-v2/IdeasXWSCView.py

+ 8 - 0
wsc.desktop

@@ -0,0 +1,8 @@
+[Desktop Entry]
+Name=IdeasX Workstation Client
+Comment=
+Path=/home/tyler/ideasX-repositories/ideasX-workstation-client-v2/
+Exec=/home/tyler/ideasX-repositories/ideasX-workstation-client-v2/start.sh
+Icon=/home/tyler/ideasX-repositories/ideasX-workstation-client-v2/icon/logo/ideasx.png
+Terminal=false
+Type=Application