Simplify server configuration 10/29910/2
authorScott Murray <scott.murray@konsulko.com>
Wed, 22 May 2024 16:06:43 +0000 (12:06 -0400)
committerScott Murray <scott.murray@konsulko.com>
Mon, 27 May 2024 13:03:41 +0000 (13:03 +0000)
Remove the multiple server profiles to simplify the UI and the
configuration file, as they're not that useful in practice.
The unused buttons have also been removed from the settings page,
and the server configuration enlarged and centered to improve
the layout.

Bug-AGL: SPEC-5141

Change-Id: I90cb6fb891de120435b4c3cf8141e27d6dbf0166
Signed-off-by: Scott Murray <scott.murray@konsulko.com>
Widgets/settings.py
extras/config.ini
extras/config.py
ui/Settings_Window.ui

index b0512cc..08f6a00 100644 (file)
@@ -1,16 +1,7 @@
-#   Copyright 2023 Suchinton Chakravarty
+# Copyright (C) 2023 Suchinton Chakravarty
+# Copyright (C) 2024 Konsulko Group
 #
-#   Licensed under the Apache License, Version 2.0 (the "License");
-#   you may not use this file except in compliance with the License.
-#   You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
 
 from extras import config
 import extras.Kuksa_Instance as kuksa_instance
@@ -54,7 +45,6 @@ def create_animated_toggle():
 class settings(Base, Form):
     """
     A class representing the settings widget of the AGL Demo Control Panel.
-
     Attributes:
     - SSL_toggle: An AnimatedToggle object representing the SSL toggle button.
     - CAN_Kuksa_toggle: An AnimatedToggle object representing the CAN/Kuksa toggle button.
@@ -76,22 +66,10 @@ class settings(Base, Form):
 
         self.SSL_toggle = create_animated_toggle()
         self.Protocol_toggle = create_animated_toggle()
-        self.CAN_Kuksa_toggle = create_animated_toggle()
 
         self.connectionStatus = self.findChild(QLabel, "connectionStatus")
         self.connectionLogo = self.findChild(QLabel, "connectionLogo")
 
-        list_of_configs = config.get_list_configs()
-        default_config_name = config.get_default_config()
-
-        self.List_Configs_ComboBox = self.findChild(
-            QComboBox, "List_Configs_ComboBox")
-        self.List_Configs_ComboBox.setItemDelegate(QStyledItemDelegate())
-        self.List_Configs_ComboBox.addItems(list_of_configs)
-        self.List_Configs_ComboBox.setCurrentText(default_config_name)
-        self.List_Configs_ComboBox.currentTextChanged.connect(
-            lambda: self.set_settings(self.List_Configs_ComboBox.currentText()))
-
         self.IPAddrInput = self.findChild(QLineEdit, "IPAddrInput")
         self.PortInput = self.findChild(QLineEdit, "PortInput")
         self.TLS_Server_Name = self.findChild(QLineEdit, "TLS_Server_Name")
@@ -110,7 +88,6 @@ class settings(Base, Form):
         self.startClientBtn.clicked.connect(self.start_stop_client)
         self.reconnectBtn.clicked.connect(self.reconnectClient)
         self.SSL_toggle.clicked.connect(self.toggleSSL)
-        self.CAN_Kuksa_toggle.clicked.connect(self.toggle_CAN_Kuksa)
 
         Frame_GS = self.findChild(QWidget, "frame_general_settings")
         Frame_PS = self.findChild(QWidget, "frame_page_settings")
@@ -120,14 +97,11 @@ class settings(Base, Form):
         GS_layout.replaceWidget(self.place_holder_toggle_1, self.SSL_toggle)
         GS_layout.replaceWidget(
             self.place_holder_toggle_2, self.Protocol_toggle)
-        PS_layout.replaceWidget(
-            self.place_holder_toggle_3, self.CAN_Kuksa_toggle)
 
         self.place_holder_toggle_1.deleteLater()
         self.place_holder_toggle_2.deleteLater()
-        self.place_holder_toggle_3.deleteLater()
 
-        self.set_settings(default_config_name)
+        self.init_settings()
 
     def start_stop_client(self):
         if self.startClientBtn.isChecked():
@@ -282,19 +256,17 @@ class settings(Base, Form):
         validate_and_set_style(self, self.CA_File, "cacertificate")
         validate_and_set_style(self, self.Auth_Token)
 
-        config.save_session_config(
-            new_config, self.kuksa_token, self.CA_File.text())
+        config.save_config(new_config, self.kuksa_token, self.CA_File.text())
 
         return new_config
 
-    def set_settings(self, config_name):
+    def init_settings(self):
         """
         Reloads the parameters of settings widget.
         """
-        new_config = config.select_config(config_name)
-        self.kuksa_config_name = new_config[0]
-        self.kuksa_config = new_config[1]
-        self.kuksa_token = new_config[2]
+        new_config = config.load_config()
+        self.kuksa_config = new_config[0]
+        self.kuksa_token = new_config[1]
 
         self.IPAddrInput.setText(self.kuksa_config["ip"])
         self.PortInput.setText(self.kuksa_config["port"])
index 2fcbbed..6619900 100644 (file)
@@ -1,58 +1,12 @@
 [default]
-preferred-config=user-session
-fullscreen-mode=true
+fullscreen-mode = true
 
-[user-session]
-ip = 
-port = 
-protocol = 
-insecure = 
-tls_server_name = 
+[vss-server]
+ip = localhost
+port = 55555
+protocol = grpc
+insecure = True
 token = default
 cacert = default
+tls_server_name = Server
 
-# [cutom-config-template]
-# ip=<ip address>
-# port=<port number>
-# protocol=<ws|grpc>       # ws/grpc -> kuksa-val-server, grpc -> databroker
-# insecure=<True|False>    # Note: Use insecure mode only if server is also running in insecure mode
-# cacert=<default|/path/to/CA.pem>
-# token=<default|/path/to/token>      
-# tls_server_name=<name>
-
-[kuksa-val-server]
-ip=localhost
-port=8090
-protocol=ws
-insecure=False
-token=default
-tls_server_name=
-
-
-[databroker]
-ip=localhost
-port=55555
-protocol=grpc
-insecure=False
-token=default
-tls_server_name=Server
-
-
-[AGL-kuksa-val-server]
-ip=localhost
-port=8090
-protocol=ws
-insecure=False
-cacert=default
-token=default
-tls_server_name=
-
-
-[AGL-databroker]
-ip=10.42.0.95
-port=55555
-protocol=grpc
-insecure=False
-cacert=default
-token=default
-tls_server_name=Server
index 4959b40..d901a8e 100644 (file)
@@ -62,57 +62,46 @@ GRPC_TOKEN = next((path for path, exists in GRPC_TOKEN_PATHS.items() if exists),
 KUKSA_CONFIG = {}
 KUKSA_TOKEN = None
 
-def select_config(preferred_config):
+def load_config():
     """
-    Selects a configuration from the config.ini file based on the preferred_config parameter.
+    Initializes configuration from the config.ini file.
 
     Args:
-        preferred_config (str): The name of the configuration section to select.
 
     Returns:
-        Tuple[str, Dict[str, Union[str, bool]], str]: A tuple containing the name of the selected configuration section,
-        a dictionary containing the configuration options for the selected section, and the token to use for the selected
-        protocol.
+        Tuple[str, Dict[Union[str, bool]], str]: A tuple containing a dictionary containing
+        the configuration option and the token to use for the selected protocol.
     """
     global KUKSA_CONFIG, KUKSA_TOKEN
     KUKSA_CONFIG.clear()
 
-    if config.has_section(preferred_config):
-        KUKSA_CONFIG['ip'] = config[preferred_config]['ip']
-        KUKSA_CONFIG['port'] = config[preferred_config]['port']
-        KUKSA_CONFIG['protocol'] = config[preferred_config]['protocol']
-        KUKSA_CONFIG['insecure'] = False if config[preferred_config]['insecure'] == 'False' else True
+    if config.has_section('vss-server'):
+        KUKSA_CONFIG['ip'] = config['vss-server']['ip']
+        KUKSA_CONFIG['port'] = config['vss-server']['port']
+        KUKSA_CONFIG['protocol'] = config['vss-server']['protocol']
+        KUKSA_CONFIG['insecure'] = False if config['vss-server']['insecure'] == 'False' else True
 
-        if config.has_option(preferred_config, 'cacert'):
-            KUKSA_CONFIG['cacertificate'] = config[preferred_config]['cacert'] if os.path.exists(
-                config[preferred_config]['cacert']) else CA_PATH
+        if config.has_option('vss-server', 'cacert'):
+            KUKSA_CONFIG['cacertificate'] = config['vss-server']['cacert'] if os.path.exists(
+                config['vss-server']['cacert']) else CA_PATH
         else:
             KUKSA_CONFIG['cacertificate'] = None
 
-        KUKSA_CONFIG['tls_server_name'] = config[preferred_config]['tls_server_name']
+        KUKSA_CONFIG['tls_server_name'] = config['vss-server']['tls_server_name']
 
-        if config.has_option(preferred_config, 'token'):
-            if config[preferred_config]['token'] == 'default':
+        if config.has_option('vss-server', 'token'):
+            if config['vss-server']['token'] == 'default':
                 KUKSA_TOKEN = get_default_token(KUKSA_CONFIG['protocol'])
-            elif os.path.exists(config[preferred_config]['token']):
-                KUKSA_TOKEN = config[preferred_config]['token']
+            elif os.path.exists(config['vss-server']['token']):
+                KUKSA_TOKEN = config['vss-server']['token']
         else:
             ValueError(
-                f"Token file {config[preferred_config]['token']} not found")
+                f"Token file {config['vss-server']['token']} not found")
     else:
         raise ValueError(
-            f"Config section {preferred_config} not found in config.ini")
+            f"Config section {'vss-server'} not found in config.ini")
 
-    return preferred_config, KUKSA_CONFIG, KUKSA_TOKEN
-
-
-def get_list_configs():
-    return config.sections()[1:]
-
-
-def get_default_config():
-    defaultConfigName = config.get('default', 'preferred-config')
-    return defaultConfigName
+    return KUKSA_CONFIG, KUKSA_TOKEN
 
 
 def get_default_token(protocol):
@@ -122,44 +111,50 @@ def get_default_token(protocol):
         return WS_TOKEN
 
 
-def save_session_config(session_config, auth_token, CA_File=None):
+def save_config(new_config, auth_token, CA_File=None):
     """
-    save values to config.ini under [user-session]
+    save values to config.ini under [vss-server]
     """
 
-    config.set('user-session', 'ip', str(session_config['ip']))
-    config.set('user-session', 'port', str(session_config['port']))
-    config.set('user-session', 'protocol', str(session_config['protocol']))
-    config.set('user-session', 'insecure', str(session_config['insecure']))
-    config.set('user-session', 'tls_server_name',
-               str(session_config['tls_server_name']))
+    config.set('vss-server', 'ip', str(new_config['ip']))
+    config.set('vss-server', 'port', str(new_config['port']))
+    config.set('vss-server', 'protocol', str(new_config['protocol']))
+    config.set('vss-server', 'insecure', str(new_config['insecure']))
+    config.set('vss-server', 'tls_server_name',
+               str(new_config['tls_server_name']))
     if auth_token in WS_TOKEN_PATHS or auth_token in GRPC_TOKEN_PATHS or auth_token == 'default':
-        config.set('user-session', 'token', 'default')
+        config.set('vss-server', 'token', 'default')
     else:
-        config.set('user-session', 'token', str(auth_token))
+        config.set('vss-server', 'token', str(auth_token))
 
     if CA_File in CA_PATHS or CA_File == 'default':
-        config.set('user-session', 'cacert', 'default')
+        config.set('vss-server', 'cacert', 'default')
     else:
-        config.set('user-session', 'cacert', str(CA_File))
+        config.set('vss-server', 'cacert', str(CA_File))
 
     with open(config_path, 'w') as configfile:
         config.write(configfile)
 
 
 def fullscreen_mode():
-    return config.getboolean('default', 'fullscreen-mode')
+    return config.getboolean('default', 'fullscreen-mode', fallback=False)
+
+def hvac_enabled():
+    return config.getboolean('default', 'hvac-enabled', fallback=True)
+
+def steering_wheel_enabled():
+    return config.getboolean('default', 'steering-wheel-enabled', fallback=True)
 
 
-if not config.has_section('user-session'):
-    config.add_section('user-session')
+if not config.has_section('vss-server'):
+    config.add_section('vss-server')
     temp = {
-        'ip': "",
-        'port': "",
-        'protocol': "",
+        'ip': "localhost",
+        'port': "55555",
+        'protocol': "grpc",
         'insecure': "",
         'cacert': "",
         'token': "",
         'tls_server_name': "",
     }
-    save_session_config(temp, 'default', 'default')
+    save_config(temp, 'default', 'default')
index e4d5c52..d59cae6 100644 (file)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>1105</width>
-    <height>631</height>
+    <width>1379</width>
+    <height>754</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -122,25 +122,13 @@ QCheckBox:indicator:disabled {
 }</string>
   </property>
   <widget class="QWidget" name="centralwidget">
+   <property name="minimumSize">
+    <size>
+     <width>800</width>
+     <height>631</height>
+    </size>
+   </property>
    <layout class="QGridLayout" name="gridLayout">
-    <item row="2" column="3">
-     <widget class="QLabel" name="label_2">
-      <property name="font">
-       <font>
-        <pointsize>16</pointsize>
-        <weight>75</weight>
-        <italic>true</italic>
-        <bold>true</bold>
-       </font>
-      </property>
-      <property name="text">
-       <string>Page Settings</string>
-      </property>
-      <property name="margin">
-       <number>6</number>
-      </property>
-     </widget>
-    </item>
     <item row="3" column="1">
      <widget class="QFrame" name="divider_1">
       <property name="frameShape">
@@ -151,228 +139,28 @@ QCheckBox:indicator:disabled {
       </property>
      </widget>
     </item>
-    <item row="2" column="1">
-     <widget class="QLabel" name="label_19">
-      <property name="font">
-       <font>
-        <pointsize>16</pointsize>
-        <weight>75</weight>
-        <italic>true</italic>
-        <bold>true</bold>
-       </font>
-      </property>
-      <property name="text">
-       <string>Client Settings</string>
-      </property>
-     </widget>
-    </item>
-    <item row="1" column="5" rowspan="6">
-     <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="6">
-     <spacer name="verticalSpacer_3">
-      <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="6" column="1" colspan="4">
-     <spacer name="verticalSpacer">
-      <property name="orientation">
-       <enum>Qt::Vertical</enum>
-      </property>
-      <property name="sizeType">
-       <enum>QSizePolicy::Expanding</enum>
-      </property>
-      <property name="sizeHint" stdset="0">
+    <item row="4" column="2" rowspan="2" colspan="2" alignment="Qt::AlignTop">
+     <widget class="QFrame" name="frame_page_settings">
+      <property name="minimumSize">
        <size>
-        <width>20</width>
-        <height>40</height>
+        <width>0</width>
+        <height>0</height>
        </size>
       </property>
-     </spacer>
-    </item>
-    <item row="1" column="1" colspan="4">
-     <widget class="QFrame" name="frame_2">
-      <property name="sizePolicy">
-       <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-        <horstretch>0</horstretch>
-        <verstretch>0</verstretch>
-       </sizepolicy>
-      </property>
       <property name="frameShape">
        <enum>QFrame::StyledPanel</enum>
       </property>
       <property name="frameShadow">
        <enum>QFrame::Raised</enum>
       </property>
-      <layout class="QGridLayout" name="gridLayout_4">
-       <item row="0" column="0">
-        <widget class="QPushButton" name="startClientBtn">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-         <property name="font">
-          <font>
-           <pointsize>16</pointsize>
-           <weight>75</weight>
-           <italic>true</italic>
-           <bold>true</bold>
-          </font>
-         </property>
-         <property name="text">
-          <string>Start client</string>
-         </property>
-         <property name="icon">
-          <iconset resource="../assets/res.qrc">
-           <normaloff>:/Carbon_Icons/carbon_icons/play.svg</normaloff>:/Carbon_Icons/carbon_icons/play.svg</iconset>
-         </property>
-         <property name="iconSize">
-          <size>
-           <width>30</width>
-           <height>30</height>
-          </size>
-         </property>
-        </widget>
-       </item>
-       <item row="0" column="1" colspan="2" alignment="Qt::AlignRight">
-        <widget class="QPushButton" name="reconnectBtn">
-         <property name="font">
-          <font>
-           <pointsize>16</pointsize>
-           <weight>75</weight>
-           <italic>true</italic>
-           <bold>true</bold>
-          </font>
-         </property>
-         <property name="text">
-          <string>Reconnect</string>
-         </property>
-         <property name="icon">
-          <iconset resource="../assets/res.qrc">
-           <normaloff>:/Carbon_Icons/carbon_icons/renew.svg</normaloff>:/Carbon_Icons/carbon_icons/renew.svg</iconset>
-         </property>
-         <property name="iconSize">
-          <size>
-           <width>30</width>
-           <height>30</height>
-          </size>
-         </property>
-        </widget>
-       </item>
-       <item row="3" column="1" alignment="Qt::AlignRight">
-        <widget class="QLabel" name="connectionLogo">
-         <property name="text">
-          <string/>
-         </property>
-         <property name="pixmap">
-          <pixmap resource="../assets/res.qrc">:/Carbon_Icons/carbon_icons/connection-signal--off.svg</pixmap>
-         </property>
-        </widget>
-       </item>
-       <item row="3" column="2" alignment="Qt::AlignLeft">
-        <widget class="QLabel" name="connectionStatus">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-         <property name="font">
-          <font>
-           <pointsize>14</pointsize>
-           <weight>75</weight>
-           <bold>true</bold>
-          </font>
-         </property>
-         <property name="text">
-          <string>Disconnected</string>
-         </property>
-        </widget>
-       </item>
-       <item row="3" column="0">
-        <widget class="QLabel" name="status">
-         <property name="font">
-          <font>
-           <pointsize>14</pointsize>
-           <weight>75</weight>
-           <bold>true</bold>
-          </font>
-         </property>
-         <property name="text">
-          <string>Status</string>
-         </property>
-        </widget>
-       </item>
-       <item row="4" column="0" colspan="3">
-        <spacer name="verticalSpacer_2">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeType">
-          <enum>QSizePolicy::Maximum</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>40</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-      </layout>
+      <layout class="QGridLayout" name="gridLayout_3"/>
      </widget>
     </item>
-    <item row="1" column="0" rowspan="6">
-     <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="2" column="2" rowspan="4">
-     <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="4" column="3" rowspan="2" colspan="2" alignment="Qt::AlignTop">
-     <widget class="QFrame" name="frame_page_settings">
+    <item row="5" column="1">
+     <widget class="QFrame" name="frame_general_settings">
       <property name="minimumSize">
        <size>
-        <width>0</width>
+        <width>800</width>
         <height>0</height>
        </size>
       </property>
@@ -382,257 +170,96 @@ QCheckBox:indicator:disabled {
       <property name="frameShadow">
        <enum>QFrame::Raised</enum>
       </property>
-      <layout class="QGridLayout" name="gridLayout_3">
-       <item row="3" column="1" colspan="3">
-        <widget class="QLabel" name="label_4">
+      <layout class="QGridLayout" name="gridLayout_2">
+       <item row="3" column="3" alignment="Qt::AlignHCenter">
+        <widget class="QLabel" name="label_12">
          <property name="font">
           <font>
            <pointsize>14</pointsize>
+           <weight>75</weight>
+           <italic>true</italic>
+           <bold>true</bold>
           </font>
          </property>
          <property name="text">
-          <string>HVAC</string>
-         </property>
-        </widget>
-       </item>
-       <item row="5" column="3" alignment="Qt::AlignHCenter">
-        <widget class="QCheckBox" name="place_holder_toggle_3">
-         <property name="text">
-          <string/>
-         </property>
-        </widget>
-       </item>
-       <item row="4" column="4">
-        <widget class="QPushButton" name="pushButton_3">
-         <property name="text">
-          <string/>
-         </property>
-         <property name="icon">
-          <iconset resource="../assets/res.qrc">
-           <normaloff>:/Carbon_Icons/carbon_icons/view.svg</normaloff>:/Carbon_Icons/carbon_icons/view.svg</iconset>
-         </property>
-         <property name="iconSize">
-          <size>
-           <width>30</width>
-           <height>30</height>
-          </size>
+          <string>WS</string>
          </property>
         </widget>
        </item>
-       <item row="2" column="1" colspan="3">
-        <widget class="QLabel" name="label_3">
+       <item row="2" column="0" colspan="3">
+        <widget class="QLabel" name="label">
          <property name="font">
           <font>
            <pointsize>14</pointsize>
           </font>
          </property>
+         <property name="toolTip">
+          <string>Default: Secure</string>
+         </property>
          <property name="text">
-          <string>Instrument Cluster</string>
+          <string>Secure Mode</string>
          </property>
         </widget>
        </item>
-       <item row="4" column="1" colspan="3">
-        <widget class="QLabel" name="label_5">
+       <item row="4" column="0">
+        <widget class="QLabel" name="label_20">
          <property name="font">
           <font>
            <pointsize>14</pointsize>
           </font>
          </property>
          <property name="text">
-          <string>Steering Controls</string>
-         </property>
-        </widget>
-       </item>
-       <item row="5" column="1" alignment="Qt::AlignHCenter|Qt::AlignVCenter">
-        <widget class="QLabel" name="label_15">
-         <property name="text">
-          <string/>
-         </property>
-         <property name="pixmap">
-          <pixmap resource="../assets/res.qrc">:/Carbon_Icons/carbon_icons/x-axis.svg</pixmap>
+          <string>TLS Server Name</string>
          </property>
         </widget>
        </item>
-       <item row="5" column="2" alignment="Qt::AlignRight|Qt::AlignVCenter">
-        <widget class="QLabel" name="label_14">
+       <item row="3" column="0" colspan="2">
+        <widget class="QLabel" name="label_11">
          <property name="font">
           <font>
            <pointsize>14</pointsize>
-           <weight>75</weight>
-           <italic>true</italic>
-           <bold>true</bold>
           </font>
          </property>
-         <property name="text">
-          <string>Kuksa</string>
+         <property name="toolTip">
+          <string>Default: WS</string>
          </property>
-        </widget>
-       </item>
-       <item row="2" column="4">
-        <widget class="QPushButton" name="pushButton">
          <property name="text">
-          <string/>
-         </property>
-         <property name="icon">
-          <iconset resource="../assets/res.qrc">
-           <normaloff>:/Carbon_Icons/carbon_icons/view.svg</normaloff>:/Carbon_Icons/carbon_icons/view.svg</iconset>
-         </property>
-         <property name="iconSize">
-          <size>
-           <width>30</width>
-           <height>30</height>
-          </size>
+          <string>Protocol</string>
          </property>
         </widget>
        </item>
-       <item row="3" column="0">
-        <widget class="QLabel" name="label_7">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-         <property name="maximumSize">
-          <size>
-           <width>25</width>
-           <height>25</height>
-          </size>
+       <item row="2" column="5" colspan="4" alignment="Qt::AlignLeft">
+        <widget class="QCheckBox" name="place_holder_toggle_1">
+         <property name="toolTip">
+          <string>Default: Secure</string>
          </property>
          <property name="text">
           <string/>
          </property>
-         <property name="pixmap">
-          <pixmap resource="../assets/res.qrc">:/Carbon_Icons/carbon_icons/windy--strong.svg</pixmap>
-         </property>
-         <property name="scaledContents">
-          <bool>true</bool>
+         <property name="checked">
+          <bool>false</bool>
          </property>
         </widget>
        </item>
-       <item row="5" column="4" alignment="Qt::AlignLeft">
-        <widget class="QLabel" name="label_10">
+       <item row="6" column="3" colspan="6">
+        <widget class="QLineEdit" name="CA_File">
          <property name="font">
           <font>
            <pointsize>14</pointsize>
-           <weight>75</weight>
-           <italic>true</italic>
-           <bold>true</bold>
           </font>
          </property>
-         <property name="text">
-          <string>CAN</string>
-         </property>
-        </widget>
-       </item>
-       <item row="3" column="4">
-        <widget class="QPushButton" name="pushButton_2">
-         <property name="text">
-          <string/>
-         </property>
-         <property name="icon">
-          <iconset resource="../assets/res.qrc">
-           <normaloff>:/Carbon_Icons/carbon_icons/view.svg</normaloff>:/Carbon_Icons/carbon_icons/view.svg</iconset>
-         </property>
-         <property name="iconSize">
-          <size>
-           <width>30</width>
-           <height>30</height>
-          </size>
-         </property>
         </widget>
        </item>
-       <item row="4" column="0">
-        <widget class="QLabel" name="label_8">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-         <property name="maximumSize">
-          <size>
-           <width>25</width>
-           <height>25</height>
-          </size>
-         </property>
-         <property name="text">
-          <string/>
-         </property>
-         <property name="pixmap">
-          <pixmap resource="../assets/res.qrc">:/Images/Images/steering-wheel.svg</pixmap>
-         </property>
-         <property name="scaledContents">
-          <bool>true</bool>
-         </property>
-        </widget>
-       </item>
-       <item row="2" column="0">
-        <widget class="QLabel" name="label_6">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Fixed" vsizetype="Ignored">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-         <property name="maximumSize">
-          <size>
-           <width>25</width>
-           <height>25</height>
-          </size>
-         </property>
-         <property name="text">
-          <string/>
-         </property>
-         <property name="pixmap">
-          <pixmap resource="../assets/res.qrc">:/Carbon_Icons/carbon_icons/meter.svg</pixmap>
-         </property>
-         <property name="scaledContents">
-          <bool>true</bool>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-    </item>
-    <item row="3" column="3" colspan="2">
-     <widget class="QFrame" name="divider_2">
-      <property name="acceptDrops">
-       <bool>false</bool>
-      </property>
-      <property name="autoFillBackground">
-       <bool>false</bool>
-      </property>
-      <property name="frameShape">
-       <enum>QFrame::HLine</enum>
-      </property>
-      <property name="frameShadow">
-       <enum>QFrame::Sunken</enum>
-      </property>
-     </widget>
-    </item>
-    <item row="5" column="1">
-     <widget class="QFrame" name="frame_general_settings">
-      <property name="frameShape">
-       <enum>QFrame::StyledPanel</enum>
-      </property>
-      <property name="frameShadow">
-       <enum>QFrame::Raised</enum>
-      </property>
-      <layout class="QGridLayout" name="gridLayout_2">
-       <item row="1" column="3" colspan="6">
-        <widget class="QLineEdit" name="IPAddrInput">
+       <item row="5" column="3" colspan="6">
+        <widget class="QLineEdit" name="Auth_Token">
          <property name="font">
           <font>
            <pointsize>14</pointsize>
-          </font>
-         </property>
-         <property name="placeholderText">
-          <string/>
+          </font>
          </property>
         </widget>
        </item>
-       <item row="2" column="0">
+       <item row="1" column="0">
         <widget class="QLabel" name="label_16">
          <property name="font">
           <font>
@@ -644,65 +271,66 @@ QCheckBox:indicator:disabled {
          </property>
         </widget>
        </item>
-       <item row="4" column="4" colspan="3" alignment="Qt::AlignHCenter">
-        <widget class="QCheckBox" name="place_holder_toggle_2">
-         <property name="toolTip">
-          <string>Default: WS</string>
-         </property>
-         <property name="text">
-          <string/>
-         </property>
-        </widget>
-       </item>
-       <item row="5" column="3" colspan="6">
-        <widget class="QLineEdit" name="TLS_Server_Name">
+       <item row="3" column="7" colspan="2" alignment="Qt::AlignHCenter">
+        <widget class="QLabel" name="label_13">
          <property name="font">
           <font>
            <pointsize>14</pointsize>
+           <weight>75</weight>
+           <italic>true</italic>
+           <bold>true</bold>
           </font>
          </property>
+         <property name="text">
+          <string>gRPC</string>
+         </property>
         </widget>
        </item>
-       <item row="0" column="0">
-        <widget class="QLabel" name="label_18">
+       <item row="5" column="0">
+        <widget class="QLabel" name="label_21">
          <property name="font">
           <font>
            <pointsize>14</pointsize>
           </font>
          </property>
          <property name="text">
-          <string>Default Config</string>
+          <string>Auth Token</string>
          </property>
         </widget>
        </item>
-       <item row="1" column="0" colspan="3">
-        <widget class="QLabel" name="IPAddr">
+       <item row="0" column="3" colspan="6">
+        <widget class="QLineEdit" name="IPAddrInput">
          <property name="font">
           <font>
            <pointsize>14</pointsize>
           </font>
          </property>
-         <property name="text">
-          <string>IP Address</string>
+         <property name="placeholderText">
+          <string/>
          </property>
         </widget>
        </item>
-       <item row="3" column="0" colspan="3">
-        <widget class="QLabel" name="label">
-         <property name="font">
-          <font>
-           <pointsize>14</pointsize>
-          </font>
+       <item row="2" column="3" alignment="Qt::AlignHCenter">
+        <widget class="QLabel" name="label_9">
+         <property name="text">
+          <string/>
+         </property>
+         <property name="pixmap">
+          <pixmap resource="../assets/res.qrc">:/Carbon_Icons/carbon_icons/security-services.svg</pixmap>
          </property>
+        </widget>
+       </item>
+       <item row="3" column="4" colspan="3" alignment="Qt::AlignHCenter">
+        <widget class="QCheckBox" name="place_holder_toggle_2">
          <property name="toolTip">
-          <string>Default: Secure</string>
+          <string>Default: WS</string>
          </property>
          <property name="text">
-          <string>Secure Mode</string>
+          <string/>
          </property>
         </widget>
        </item>
-       <item row="2" column="3" colspan="6">
+       <item row="1" column="3" colspan="6">
         <widget class="QLineEdit" name="PortInput">
          <property name="font">
           <font>
@@ -712,19 +340,19 @@ QCheckBox:indicator:disabled {
         </widget>
        </item>
        <item row="6" column="0">
-        <widget class="QLabel" name="label_21">
+        <widget class="QLabel" name="label_17">
          <property name="font">
           <font>
            <pointsize>14</pointsize>
           </font>
          </property>
          <property name="text">
-          <string>Auth Token</string>
+          <string>CA.pem File</string>
          </property>
         </widget>
        </item>
-       <item row="6" column="3" colspan="6">
-        <widget class="QLineEdit" name="Auth_Token">
+       <item row="4" column="3" colspan="6">
+        <widget class="QLineEdit" name="TLS_Server_Name">
          <property name="font">
           <font>
            <pointsize>14</pointsize>
@@ -732,119 +360,228 @@ QCheckBox:indicator:disabled {
          </property>
         </widget>
        </item>
-       <item row="4" column="3" alignment="Qt::AlignHCenter">
-        <widget class="QLabel" name="label_12">
+       <item row="0" column="0" colspan="3">
+        <widget class="QLabel" name="IPAddr">
          <property name="font">
           <font>
            <pointsize>14</pointsize>
-           <weight>75</weight>
-           <italic>true</italic>
-           <bold>true</bold>
           </font>
          </property>
          <property name="text">
-          <string>WS</string>
+          <string>IP Address</string>
          </property>
         </widget>
        </item>
-       <item row="5" column="0">
-        <widget class="QLabel" name="label_20">
+      </layout>
+     </widget>
+    </item>
+    <item row="1" column="4" rowspan="6">
+     <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="5">
+     <spacer name="verticalSpacer_3">
+      <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="1" column="1" colspan="3">
+     <widget class="QFrame" name="frame_2">
+      <property name="sizePolicy">
+       <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+        <horstretch>0</horstretch>
+        <verstretch>0</verstretch>
+       </sizepolicy>
+      </property>
+      <property name="frameShape">
+       <enum>QFrame::StyledPanel</enum>
+      </property>
+      <property name="frameShadow">
+       <enum>QFrame::Raised</enum>
+      </property>
+      <layout class="QGridLayout" name="gridLayout_4">
+       <item row="0" column="0">
+        <widget class="QPushButton" name="startClientBtn">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
          <property name="font">
           <font>
-           <pointsize>14</pointsize>
+           <pointsize>16</pointsize>
+           <weight>75</weight>
+           <italic>true</italic>
+           <bold>true</bold>
           </font>
          </property>
          <property name="text">
-          <string>TLS Server Name</string>
-         </property>
-        </widget>
-       </item>
-       <item row="3" column="5" colspan="4" alignment="Qt::AlignLeft">
-        <widget class="QCheckBox" name="place_holder_toggle_1">
-         <property name="toolTip">
-          <string>Default: Secure</string>
+          <string>Start client</string>
          </property>
-         <property name="text">
-          <string/>
+         <property name="icon">
+          <iconset resource="../assets/res.qrc">
+           <normaloff>:/Carbon_Icons/carbon_icons/play.svg</normaloff>:/Carbon_Icons/carbon_icons/play.svg</iconset>
          </property>
-         <property name="checked">
-          <bool>false</bool>
+         <property name="iconSize">
+          <size>
+           <width>30</width>
+           <height>30</height>
+          </size>
          </property>
         </widget>
        </item>
-       <item row="4" column="0" colspan="2">
-        <widget class="QLabel" name="label_11">
+       <item row="0" column="1" colspan="2" alignment="Qt::AlignRight">
+        <widget class="QPushButton" name="reconnectBtn">
          <property name="font">
           <font>
-           <pointsize>14</pointsize>
+           <pointsize>16</pointsize>
+           <weight>75</weight>
+           <italic>true</italic>
+           <bold>true</bold>
           </font>
          </property>
-         <property name="toolTip">
-          <string>Default: WS</string>
-         </property>
          <property name="text">
-          <string>Protocol</string>
+          <string>Reconnect</string>
          </property>
-        </widget>
-       </item>
-       <item row="0" column="3" colspan="6">
-        <widget class="QComboBox" name="List_Configs_ComboBox">
-         <property name="font">
-          <font>
-           <pointsize>14</pointsize>
-          </font>
+         <property name="icon">
+          <iconset resource="../assets/res.qrc">
+           <normaloff>:/Carbon_Icons/carbon_icons/renew.svg</normaloff>:/Carbon_Icons/carbon_icons/renew.svg</iconset>
+         </property>
+         <property name="iconSize">
+          <size>
+           <width>30</width>
+           <height>30</height>
+          </size>
          </property>
         </widget>
        </item>
-       <item row="3" column="3" alignment="Qt::AlignHCenter">
-        <widget class="QLabel" name="label_9">
+       <item row="3" column="1" alignment="Qt::AlignRight">
+        <widget class="QLabel" name="connectionLogo">
          <property name="text">
           <string/>
          </property>
          <property name="pixmap">
-          <pixmap resource="../assets/res.qrc">:/Carbon_Icons/carbon_icons/security-services.svg</pixmap>
+          <pixmap resource="../assets/res.qrc">:/Carbon_Icons/carbon_icons/connection-signal--off.svg</pixmap>
          </property>
         </widget>
        </item>
-       <item row="4" column="7" colspan="2" alignment="Qt::AlignHCenter">
-        <widget class="QLabel" name="label_13">
+       <item row="3" column="2" alignment="Qt::AlignLeft">
+        <widget class="QLabel" name="connectionStatus">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
          <property name="font">
           <font>
            <pointsize>14</pointsize>
            <weight>75</weight>
-           <italic>true</italic>
            <bold>true</bold>
           </font>
          </property>
          <property name="text">
-          <string>gRPC</string>
+          <string>Disconnected</string>
          </property>
         </widget>
        </item>
-       <item row="7" column="0">
-        <widget class="QLabel" name="label_17">
+       <item row="3" column="0">
+        <widget class="QLabel" name="status">
          <property name="font">
           <font>
            <pointsize>14</pointsize>
+           <weight>75</weight>
+           <bold>true</bold>
           </font>
          </property>
          <property name="text">
-          <string>CA.pem File</string>
+          <string>Status:</string>
+         </property>
+         <property name="alignment">
+          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
          </property>
         </widget>
        </item>
-       <item row="7" column="3" colspan="6">
-        <widget class="QLineEdit" name="CA_File">
-         <property name="font">
-          <font>
-           <pointsize>14</pointsize>
-          </font>
+       <item row="4" column="0" colspan="3">
+        <spacer name="verticalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
          </property>
-        </widget>
+         <property name="sizeType">
+          <enum>QSizePolicy::Maximum</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
        </item>
       </layout>
      </widget>
     </item>
+    <item row="6" column="1" colspan="3">
+     <spacer name="verticalSpacer">
+      <property name="orientation">
+       <enum>Qt::Vertical</enum>
+      </property>
+      <property name="sizeType">
+       <enum>QSizePolicy::Expanding</enum>
+      </property>
+      <property name="sizeHint" stdset="0">
+       <size>
+        <width>20</width>
+        <height>40</height>
+       </size>
+      </property>
+     </spacer>
+    </item>
+    <item row="2" column="1">
+     <widget class="QLabel" name="label_19">
+      <property name="font">
+       <font>
+        <pointsize>16</pointsize>
+        <weight>75</weight>
+        <italic>true</italic>
+        <bold>true</bold>
+       </font>
+      </property>
+      <property name="text">
+       <string>Client Settings</string>
+      </property>
+     </widget>
+    </item>
+    <item row="1" column="0" rowspan="6">
+     <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>
    </layout>
   </widget>
  </widget>