diff --git a/software/ros_packages/ground_station/src/Framework/SettingsSystems/UbiquitiRadioSettings.py b/software/ros_packages/ground_station/src/Framework/SettingsSystems/UbiquitiRadioSettings.py
new file mode 100644
index 0000000..2d62166
--- /dev/null
+++ b/software/ros_packages/ground_station/src/Framework/SettingsSystems/UbiquitiRadioSettings.py
@@ -0,0 +1,120 @@
+# coding=utf-8
+#####################################
+# Imports
+#####################################
+# Python native imports
+from PyQt5 import QtCore, QtWidgets
+import logging
+from time import time
+import paramiko
+
+#####################################
+# Global Variables
+#####################################
+THREAD_HERTZ = 5
+
+ACCESS_POINT_IP = "192.168.1.20" # The channel only has to be set on the access point. The staion will adjust.
+ACCESS_POINT_USER = "ubnt"
+ACCESS_POINT_PASSWORD = "rover4lyfe^" # We don't care about this password, don't freak out. Wifi is open anyways...
+
+GET_CURRENT_CHANNEL_COMMAND = "iwlist ath0 channel"
+SET_CHANNEL_COMMAND = "iwconfig ath0 channel"
+
+
+#####################################
+# UbiquitiRadioSettings Class Definition
+#####################################
+class UbiquitiRadioSettings(QtCore.QThread):
+
+ show_channel__signal = QtCore.pyqtSignal(int)
+ set_gui_elements_enabled__signal = QtCore.pyqtSignal(bool)
+
+ def __init__(self, shared_objects):
+ super(UbiquitiRadioSettings, self).__init__()
+
+ # ########## Reference to class init variables ##########
+ self.shared_objects = shared_objects
+ self.left_screen = self.shared_objects["screens"]["left_screen"]
+
+ self.ubiquiti_channel_spin_box = self.left_screen.ubiquiti_channel_spin_box # type: QtWidgets.QSpinBox
+ self.ubiquiti_channel_apply_button = self.left_screen.ubiquiti_channel_apply_button # type: QtWidgets.QPushButton
+
+ # ########## Get the settings instance ##########
+ self.settings = QtCore.QSettings()
+
+ # ########## Get the Pick And Plate instance of the logger ##########
+ self.logger = logging.getLogger("groundstation")
+
+ # ########## Thread Flags ##########
+ self.run_thread_flag = True
+
+ # ########## Class Variables ##########
+ self.wait_time = 1.0 / THREAD_HERTZ
+
+ self.channel_change_needed = False
+ self.new_channel = 0
+
+ self.ssh_client = None
+
+ def run(self):
+ self.set_gui_elements_enabled__signal.emit(False)
+ self.setup_and_connect_ssh_client()
+ self.get_and_show_current_channel()
+
+ while self.run_thread_flag:
+ start_time = time()
+
+ self.apply_channel_if_needed()
+
+ time_diff = time() - start_time
+
+ self.msleep(max(int(self.wait_time - time_diff), 0))
+
+ def setup_and_connect_ssh_client(self):
+ self.ssh_client = paramiko.SSHClient()
+ self.ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ self.ssh_client.connect(ACCESS_POINT_IP, username=ACCESS_POINT_USER, password=ACCESS_POINT_PASSWORD,
+ compress=True)
+
+ def apply_channel_if_needed(self):
+ if self.channel_change_needed:
+ self.show_channel__signal.emit(0)
+ self.set_gui_elements_enabled__signal.emit(False)
+ self.ssh_client.exec_command(SET_CHANNEL_COMMAND + " %02d" % self.new_channel)
+ self.get_and_show_current_channel()
+ self.channel_change_needed = False
+
+ def get_and_show_current_channel(self):
+ channel = 0
+
+ ssh_stdin, ssh_stdout, ssh_stderr = self.ssh_client.exec_command(GET_CURRENT_CHANNEL_COMMAND)
+ output = ssh_stdout.read()
+
+ for line in output.split("\n"):
+ if "Current Frequency:" in line:
+ channel = line.strip("()").split("Channel ")[1]
+ break
+
+ self.msleep(500) # From the gui, this helps show something is actually happening
+
+ self.show_channel__signal.emit(int(channel))
+ self.set_gui_elements_enabled__signal.emit(True)
+
+ def on_ubiquiti_channel_apply_pressed__slot(self):
+ self.new_channel = self.ubiquiti_channel_spin_box.value()
+ self.channel_change_needed = True
+
+ def connect_signals_and_slots(self):
+ self.ubiquiti_channel_apply_button.clicked.connect(self.on_ubiquiti_channel_apply_pressed__slot)
+ self.show_channel__signal.connect(self.ubiquiti_channel_spin_box.setValue)
+
+ self.set_gui_elements_enabled__signal.connect(self.ubiquiti_channel_spin_box.setEnabled)
+ self.set_gui_elements_enabled__signal.connect(self.ubiquiti_channel_apply_button.setEnabled)
+
+ def setup_signals(self, start_signal, signals_and_slots_signal, kill_signal):
+ start_signal.connect(self.start)
+ signals_and_slots_signal.connect(self.connect_signals_and_slots)
+ kill_signal.connect(self.on_kill_threads_requested__slot)
+
+ def on_kill_threads_requested__slot(self):
+ self.run_thread_flag = False
diff --git a/software/ros_packages/ground_station/src/Framework/SettingsSystems/__init__.py b/software/ros_packages/ground_station/src/Framework/SettingsSystems/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/software/ros_packages/ground_station/src/Framework/StatusSystems/StatusCore.py b/software/ros_packages/ground_station/src/Framework/StatusSystems/StatusCore.py
index 0b21218..c1ed608 100644
--- a/software/ros_packages/ground_station/src/Framework/StatusSystems/StatusCore.py
+++ b/software/ros_packages/ground_station/src/Framework/StatusSystems/StatusCore.py
@@ -159,16 +159,16 @@ class SensorCore(QtCore.QThread):
self.bogie_connection_3_stylesheet_change_ready__signal.emit("background-color: darkgreen;")
def __jetson_callback(self, data):
- self.jetson_cpu_update_ready__signal.emit("Jetson CPU\n" + str(data.jetson_CPU) + "%")
+ self.jetson_cpu_update_ready__signal.emit("TX2 CPU\n" + str(data.jetson_CPU) + "%")
- if data.jetson_CPU > 79:
+ if data.jetson_CPU > 85:
self.jetson_cpu_stylesheet_change_ready__signal.emit("background-color: orange;")
- elif data.jetson_CPU > 89:
+ elif data.jetson_CPU > 95:
self.jetson_cpu_stylesheet_change_ready__signal.emit("background-color: darkred;")
else:
self.jetson_cpu_stylesheet_change_ready__signal.emit("background-color: darkgreen;")
- self.jetson_ram_update_ready__signal.emit("Jetson RAM\n" + str(data.jetson_RAM) + "%")
+ self.jetson_ram_update_ready__signal.emit("TX2 RAM\n" + str(data.jetson_RAM) + "%")
if data.jetson_RAM > 79:
self.jetson_ram_stylesheet_change_ready__signal.emit("background-color: orange;")
@@ -177,7 +177,7 @@ class SensorCore(QtCore.QThread):
else:
self.jetson_ram_stylesheet_change_ready__signal.emit("background-color: darkgreen;")
- self.jetson_gpu_temp_update_ready__signal.emit("Jetson EMMC Used\n" + str(data.jetson_GPU_temp) + "%")
+ self.jetson_gpu_temp_update_ready__signal.emit("TX2 TEMP\n" + str(data.jetson_GPU_temp) + "°C")
if data.jetson_GPU_temp > 64:
self.jetson_gpu_temp_stylesheet_change_ready__signal.emit("background-color: orange;")
@@ -186,7 +186,7 @@ class SensorCore(QtCore.QThread):
else:
self.jetson_gpu_temp_stylesheet_change_ready__signal.emit("background-color: darkgreen;")
- self.jetson_emmc_update_ready__signal.emit("Jetson Max Temp\n" + str(data.jetson_EMMC) + "°C")
+ self.jetson_emmc_update_ready__signal.emit("TX2 EMMC\n" + str(data.jetson_EMMC) + "%")
if data.jetson_EMMC > 79:
self.jetson_emmc_stylesheet_change_ready__signal.emit("background-color: orange;")
diff --git a/software/ros_packages/ground_station/src/Resources/Ui/left_screen.ui b/software/ros_packages/ground_station/src/Resources/Ui/left_screen.ui
index fe4e4b1..9afbb78 100644
--- a/software/ros_packages/ground_station/src/Resources/Ui/left_screen.ui
+++ b/software/ros_packages/ground_station/src/Resources/Ui/left_screen.ui
@@ -79,34 +79,8 @@
0
- -
-
-
- background-color: darkred;
-
-
- <html><head/><body><p align="center"><span style=" font-weight:600;">EMMC</span></p></body></html>
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- background-color: darkred;
-
-
- <html><head/><body><p align="center"><span style=" font-size:9pt; font-weight:600;">GPU Temp C</span></p></body></html>
-
-
- Qt::AlignCenter
-
-
-
- -
-
+
-
+
0
@@ -132,14 +106,14 @@
true
-
- false
-
background-color:darkred;
+
+ QFrame::NoFrame
+
- Right Bogie
+ Main Nav Camera
Connected
@@ -147,10 +121,10 @@ Connected
- -
-
+
-
+
- -
+
-
@@ -192,8 +166,8 @@ Fix
- -
-
+
-
+
0
@@ -219,21 +193,22 @@ Fix
true
+
+ false
+
background-color:darkred;
-
- QFrame::NoFrame
-
- ZED Connected
+ Right Bogie
+Connected
Qt::AlignCenter
- -
+
-
@@ -276,7 +251,7 @@ Connected
-
-
+
0
@@ -309,7 +284,7 @@ Connected
QFrame::NoFrame
- Main Nav Camera
+ Left Bogie
Connected
@@ -317,8 +292,8 @@ Connected
- -
-
+
-
+
0
@@ -344,60 +319,27 @@ Connected
true
-
- false
-
background-color:darkred;
+
+ QFrame::NoFrame
+
- 3D Nav Mouse
-Connected
+ ZED Connected
Qt::AlignCenter
- -
-
-
-
- 0
- 0
-
-
-
-
- 0
- 0
-
-
-
-
- 9999999
- 9999999
-
-
-
-
- 0
- 0
-
-
-
-
- 10
- 75
- true
-
-
+
-
+
- background-color:darkred;
+ background-color: darkred;
- FrSky
-Connected
+ <html><head/><body><p align="center"><span style=" font-weight:600;">TX2 CPU</span></p></body></html>
Qt::AlignCenter
@@ -405,93 +347,45 @@ Connected
-
-
-
-
- 0
- 0
-
-
-
-
- 0
- 0
-
-
-
-
- 9999999
- 9999999
-
-
-
-
- 10
- 75
- true
-
-
+
- background-color:darkred;
-
-
- QFrame::NoFrame
+ background-color: darkred;
- Logitech Joystick
-Connected
+ <html><head/><body><p align="center"><span style=" font-size:9pt; font-weight:600;">TX2 TEMP</span></p></body></html>
Qt::AlignCenter
- -
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 0
- 0
-
-
-
-
- 9999999
- 9999999
-
-
-
-
- 10
- 75
- true
-
-
+
-
+
- background-color:darkred;
-
-
- QFrame::NoFrame
+ background-color: darkred;
- Rover
-Connected
+ <html><head/><body><p align="center"><span style=" font-weight:600;">TX2 RAM</span></p></body></html>
Qt::AlignCenter
- -
+
-
+
+
+ background-color: darkred;
+
+
+ <html><head/><body><p align="center"><span style=" font-weight:600;">TX2 EMMC</span></p></body></html>
+
+
+ Qt::AlignCenter
+
+
+
+ -
@@ -536,33 +430,7 @@ Connected
- -
-
-
- background-color: darkred;
-
-
- <html><head/><body><p align="center"><span style=" font-weight:600;">RAM</span></p></body></html>
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- background-color: darkred;
-
-
- <html><head/><body><p align="center"><span style=" font-weight:600;">CPU %</span></p></body></html>
-
-
- Qt::AlignCenter
-
-
-
- -
+
-
@@ -607,8 +475,11 @@ Connected
- -
-
+
-
+
+
+ -
+
0
@@ -641,7 +512,136 @@ Connected
QFrame::NoFrame
- Left Bogie
+ Rover
+Connected
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 9999999
+ 9999999
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ background-color:darkred;
+
+
+ FrSky
+Connected
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 9999999
+ 9999999
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ false
+
+
+ background-color:darkred;
+
+
+ 3D Nav Mouse
+Connected
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 9999999
+ 9999999
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ background-color:darkred;
+
+
+ QFrame::NoFrame
+
+
+ Logitech Joystick
Connected
@@ -955,17 +955,23 @@ Connected
-
-
-
+
+
+ false
+
- 1
+ 0
11
+
+ 0
+
-
-
+
Apply
diff --git a/software/ros_packages/ground_station/src/ground_station.py b/software/ros_packages/ground_station/src/ground_station.py
index 5656522..b14d8ee 100644
--- a/software/ros_packages/ground_station/src/ground_station.py
+++ b/software/ros_packages/ground_station/src/ground_station.py
@@ -19,6 +19,7 @@ import Framework.JoystickControlSystems.JoystickControlSender as JoystickControl
import Framework.NavigationSystems.SpeedAndHeadingIndication as SpeedAndHeading
import Framework.ArmSystems.ArmIndication as ArmIndication
import Framework.StatusSystems.StatusCore as StatusCore
+import Framework.SettingsSystems.UbiquitiRadioSettings as UbiquitiRadioSettings
#####################################
# Global Variables
@@ -105,6 +106,7 @@ class GroundStation(QtCore.QObject):
self.__add_thread("Speed and Heading", SpeedAndHeading.SpeedAndHeadingIndication(self.shared_objects))
self.__add_thread("Arm Indication", ArmIndication.ArmIndication(self.shared_objects))
self.__add_thread("Rover Status", StatusCore.SensorCore(self.shared_objects))
+ self.__add_thread("Ubiquiti Radio Settings", UbiquitiRadioSettings.UbiquitiRadioSettings(self.shared_objects))
self.connect_signals_and_slots_signal.emit()
self.__connect_signals_to_slots()