From 5f5fb8c1b5553fa50832461ecb3da33fce11b5dd Mon Sep 17 00:00:00 2001 From: Corwin Perren Date: Thu, 15 Mar 2018 23:46:05 -0700 Subject: [PATCH] Updated strings for status updates. Added settingssystems package and ubiquiti settings file. Allows for setting of the ubiquiti 2.4GHz channel from the GUI. Connected and working. --- .../SettingsSystems/UbiquitiRadioSettings.py | 120 ++++++ .../src/Framework/SettingsSystems/__init__.py | 0 .../src/Framework/StatusSystems/StatusCore.py | 12 +- .../src/Resources/Ui/left_screen.ui | 384 +++++++++--------- .../ground_station/src/ground_station.py | 2 + 5 files changed, 323 insertions(+), 195 deletions(-) create mode 100644 software/ros_packages/ground_station/src/Framework/SettingsSystems/UbiquitiRadioSettings.py create mode 100644 software/ros_packages/ground_station/src/Framework/SettingsSystems/__init__.py 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()