diff --git a/software/firmware/freq_testing/freq_testing.ino b/software/firmware/freq_testing/freq_testing.ino
new file mode 100644
index 0000000..ecef981
--- /dev/null
+++ b/software/firmware/freq_testing/freq_testing.ino
@@ -0,0 +1,15 @@
+float freq = 1.5;
+int pin = 13;
+// convert freq to mills
+float mills = (1/freq)*1000;
+
+void setup(){
+ pinMode(pin, OUTPUT);
+}
+
+void loop(){
+ digitalWrite(pin,LOW);
+ delay(mills);
+ digitalWrite(pin, HIGH);
+ delay(mills);
+}
diff --git a/software/firmware/mining/mining.ino b/software/firmware/mining/mining.ino
index 291e4a9..a0c03f0 100644
--- a/software/firmware/mining/mining.ino
+++ b/software/firmware/mining/mining.ino
@@ -22,6 +22,9 @@ enum HARDWARE {
MOTOR_TILT_EN = 33,
MOTOR_TILT_FB = A11,
+ CAMERA_CONTROL = 0,
+ CAMERA_VIDEO_EN = 1,
+
LED_13 = 13,
LED_RED = 20,
@@ -119,6 +122,10 @@ void setup_hardware() {
pinMode(HARDWARE::MOTOR_TILT_CS, INPUT);
pinMode(HARDWARE::MOTOR_TILT_FB, INPUT);
+
+ pinMode(HARDWARE::CAMERA_CONTROL, OUTPUT);
+ pinMode(HARDWARE::CAMERA_VIDEO_EN, OUTPUT);
+
pinMode(HARDWARE::LED_13, OUTPUT);
pinMode(HARDWARE::LED_RED, OUTPUT);
pinMode(HARDWARE::LED_BLUE, OUTPUT);
@@ -132,6 +139,8 @@ void setup_hardware() {
digitalWrite(HARDWARE::MOTOR_LIFT_EN, HIGH);
digitalWrite(HARDWARE::MOTOR_TILT_EN, HIGH);
+ digitalWrite(HARDWARE::CAMERA_VIDEO_EN, HIGH);
+
// Change motor PWM frequency so it's not in the audible range
analogWriteFrequency(HARDWARE::MOTOR_LIFT_PWM, 25000);
analogWriteFrequency(HARDWARE::MOTOR_TILT_PWM, 25000);
diff --git a/software/ros_packages/ground_station/src/Framework/MiscSystems/BashConsoleCore.py b/software/ros_packages/ground_station/src/Framework/MiscSystems/BashConsoleCore.py
index c63eea8..c4207ca 100644
--- a/software/ros_packages/ground_station/src/Framework/MiscSystems/BashConsoleCore.py
+++ b/software/ros_packages/ground_station/src/Framework/MiscSystems/BashConsoleCore.py
@@ -14,9 +14,9 @@ import paramiko
#####################################
THREAD_HERTZ = 5
-IP = "192.168.1.127"
-USER = "caperren"
-PASS = "ult1m2t3!"
+IP = "192.168.1.10"
+USER = "nvidia"
+PASS = "nvidia"
#####################################
@@ -81,6 +81,8 @@ class BashConsole(QtCore.QThread):
self.ssh_client.connect(IP, username=USER, password=PASS, compress=True)
except:
print "No connection"
+ if not self.run_thread_flag:
+ return
self.ssh_client = None
self.msleep(1000)
diff --git a/software/ros_packages/ground_station/src/Framework/MiscSystems/RDFCore.py b/software/ros_packages/ground_station/src/Framework/MiscSystems/RDFCore.py
index 9fbd0a4..2cf19bf 100644
--- a/software/ros_packages/ground_station/src/Framework/MiscSystems/RDFCore.py
+++ b/software/ros_packages/ground_station/src/Framework/MiscSystems/RDFCore.py
@@ -20,6 +20,13 @@ RDF_DATA_TOPIC = "/rover_science/rdf/data"
THREAD_HERTZ = 5
+COLOR_GREEN = "background-color:darkgreen;"
+COLOR_RED = "background-color:darkred;"
+
+
+ALLOWED_RDF_VARIANCE = 0.15
+
+
#####################################
# UbiquitiRadioSettings Class Definition
#####################################
@@ -28,6 +35,9 @@ class RDF(QtCore.QThread):
rssi_lcd_number_update_ready__signal = QtCore.pyqtSignal(int)
beacon_lcd_number_update_ready__signal = QtCore.pyqtSignal(float)
+ beacon_valid_text_change_ready__signal = QtCore.pyqtSignal(str)
+ beacon_valid_stylesheet_change_ready__signal = QtCore.pyqtSignal(str)
+
def __init__(self, shared_objects):
super(RDF, self).__init__()
@@ -37,6 +47,7 @@ class RDF(QtCore.QThread):
self.rssi_lcdnumber = self.left_screen.rssi_lcdnumber # type:QtWidgets.QLCDNumber
self.beacon_frequency_lcd_number = self.left_screen.beacon_frequency_lcd_number # type:QtWidgets.QLCDNumber
+ self.beacon_frequency_valid_label = self.left_screen.beacon_frequency_valid_label # type:QtWidgets.QLCDNumber
# ########## Get the settings instance ##########
self.settings = QtCore.QSettings()
@@ -58,6 +69,9 @@ class RDF(QtCore.QThread):
self.raw_data_timestamps = numpy.array([])
self.data_window_size = 200
+ self.previous_frequencies = []
+ self.num_previous_frequencies = 3
+
def run(self):
self.logger.debug("Starting RDF Thread")
@@ -92,9 +106,30 @@ class RDF(QtCore.QThread):
max_index = numpy.argmax(numpy.abs(yf))
freq = xf[max_index]
+
+ if len(self.previous_frequencies) == self.num_previous_frequencies:
+ del self.previous_frequencies[0]
+
+ self.previous_frequencies.append(freq)
+
+ if len(self.previous_frequencies) == self.num_previous_frequencies:
+ variance_too_large = False
+
+ if abs(self.previous_frequencies[0] - self.previous_frequencies[1]) > ALLOWED_RDF_VARIANCE:
+ variance_too_large = True
+
+ if abs(self.previous_frequencies[0] - self.previous_frequencies[2]) > ALLOWED_RDF_VARIANCE:
+ variance_too_large = True
+
+ if abs(self.previous_frequencies[1] - self.previous_frequencies[2]) > ALLOWED_RDF_VARIANCE:
+ variance_too_large = True
+
+ self.beacon_valid_stylesheet_change_ready__signal.emit(COLOR_GREEN if not variance_too_large else COLOR_RED)
+ self.beacon_valid_text_change_ready__signal.emit("Yes" if not variance_too_large else "No")
+
self.beacon_lcd_number_update_ready__signal.emit(freq)
- except:
- pass
+ except Exception, e:
+ print e
self.raw_data = numpy.array([])
self.raw_data_timestamps = numpy.array([])
@@ -119,6 +154,9 @@ class RDF(QtCore.QThread):
self.rssi_lcd_number_update_ready__signal.connect(self.rssi_lcdnumber.display)
self.beacon_lcd_number_update_ready__signal.connect(self.beacon_frequency_lcd_number.display)
+ self.beacon_valid_text_change_ready__signal.connect(self.beacon_frequency_valid_label.setText)
+ self.beacon_valid_stylesheet_change_ready__signal.connect(self.beacon_frequency_valid_label.setStyleSheet)
+
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)
diff --git a/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoCoordinator.py b/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoCoordinator.py
index 6099b98..fe347dd 100644
--- a/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoCoordinator.py
+++ b/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoCoordinator.py
@@ -22,11 +22,16 @@ PRIMARY_LABEL_MAX = (640, 360)
SECONDARY_LABEL_MAX = (640, 360)
TERTIARY_LABEL_MAX = (640, 360)
+LOW_RES = (256, 144)
+
GUI_SELECTION_CHANGE_TIMEOUT = 3 # Seconds
STYLESHEET_SELECTED = "border: 2px solid orange; background-color:black;"
STYLESHEET_UNSELECTED = "background-color:black;"
+COLOR_GREEN = "background-color: darkgreen;"
+COLOR_RED = "background-color: darkred;"
+
#####################################
# RoverVideoCoordinator Class Definition
@@ -38,6 +43,9 @@ class RoverVideoCoordinator(QtCore.QThread):
pan_tilt_selection_changed__signal = QtCore.pyqtSignal(str)
+ low_res_button_text_update_ready__signal = QtCore.pyqtSignal(str)
+ low_res_button_stylesheet_update_ready__signal = QtCore.pyqtSignal(str)
+
def __init__(self, shared_objects):
super(RoverVideoCoordinator, self).__init__()
@@ -48,6 +56,8 @@ class RoverVideoCoordinator(QtCore.QThread):
self.secondary_video_display_label = self.right_screen.secondary_video_label # type:QtWidgets.QLabel
self.tertiary_video_display_label = self.right_screen.tertiary_video_label # type:QtWidgets.QLabel
+ self.low_res_mode_button = self.right_screen.low_res_mode_button # type: QtWidgets.QLabel
+
self.index_to_label_element = {
0: self.primary_video_display_label,
1: self.secondary_video_display_label,
@@ -107,6 +117,8 @@ class RoverVideoCoordinator(QtCore.QThread):
self.first_image_received = False
+ self.in_low_res_mode = False
+
def run(self):
self.logger.debug("Starting Video Coordinator Thread")
@@ -140,13 +152,17 @@ class RoverVideoCoordinator(QtCore.QThread):
def __set_max_resolutions(self):
if self.set_max_resolutions_flag:
- self.camera_threads[self.valid_cameras[self.primary_label_current_setting]].set_hard_max_resolution(PRIMARY_LABEL_MAX)
+ if self.in_low_res_mode:
+ for camera in self.camera_threads:
+ self.camera_threads[camera].set_hard_max_resolution(LOW_RES)
+ else:
+ self.camera_threads[self.valid_cameras[self.primary_label_current_setting]].set_hard_max_resolution(PRIMARY_LABEL_MAX)
- if self.secondary_label_current_setting != self.primary_label_current_setting:
- self.camera_threads[self.valid_cameras[self.secondary_label_current_setting]].set_hard_max_resolution(SECONDARY_LABEL_MAX)
+ if self.secondary_label_current_setting != self.primary_label_current_setting:
+ self.camera_threads[self.valid_cameras[self.secondary_label_current_setting]].set_hard_max_resolution(SECONDARY_LABEL_MAX)
- if self.tertiary_label_current_setting != self.primary_label_current_setting and self.tertiary_label_current_setting != self.secondary_label_current_setting:
- self.camera_threads[self.valid_cameras[self.tertiary_label_current_setting]].set_hard_max_resolution(SECONDARY_LABEL_MAX)
+ if self.tertiary_label_current_setting != self.primary_label_current_setting and self.tertiary_label_current_setting != self.secondary_label_current_setting:
+ self.camera_threads[self.valid_cameras[self.tertiary_label_current_setting]].set_hard_max_resolution(SECONDARY_LABEL_MAX)
self.set_max_resolutions_flag = False
@@ -242,6 +258,10 @@ class RoverVideoCoordinator(QtCore.QThread):
self.shared_objects["threaded_classes"]["Joystick Sender"].toggle_selected_gui_camera__signal.connect(
self.on_gui_selected_camera_toggled)
+ self.low_res_mode_button.clicked.connect(self.on_low_res_button_clicked__slot)
+ self.low_res_button_text_update_ready__signal.connect(self.low_res_mode_button.setText)
+ self.low_res_button_stylesheet_update_ready__signal.connect(self.low_res_mode_button.setStyleSheet)
+
self.update_element_stylesheet__signal.connect(self.__on_gui_element_stylesheet_update__slot)
def setup_signals(self, start_signal, signals_and_slots_signal, kill_signal):
@@ -353,5 +373,19 @@ class RoverVideoCoordinator(QtCore.QThread):
self.update_element_stylesheet__signal.emit()
+ def on_low_res_button_clicked__slot(self):
+ if self.low_res_mode_button.text() == "ENABLED":
+ self.in_low_res_mode = False
+ self.set_max_resolutions_flag = True
+
+ self.low_res_button_text_update_ready__signal.emit("DISABLED")
+ self.low_res_button_stylesheet_update_ready__signal.emit(COLOR_GREEN)
+ else:
+ self.in_low_res_mode = False
+ self.set_max_resolutions_flag = True
+
+ self.low_res_button_text_update_ready__signal.emit("ENABLED")
+ self.low_res_button_stylesheet_update_ready__signal.emit(COLOR_RED)
+
def on_kill_threads_requested__slot(self):
self.run_thread_flag = False
diff --git a/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoReceiver.py b/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoReceiver.py
index 9545f19..3d43bdd 100644
--- a/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoReceiver.py
+++ b/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoReceiver.py
@@ -146,6 +146,8 @@ class RoverVideoReceiver(QtCore.QThread):
self.current_resolution_index = min(self.current_resolution_index + 1, self.max_resolution_index)
elif current_fps <= MIN_FRAMERATE_BEFORE_ADJUST:
self.current_resolution_index = max(self.current_resolution_index - 1, 0)
+ else:
+ self.current_resolution_index = min(self.current_resolution_index, self.max_resolution_index)
if self.last_resolution_index != self.current_resolution_index:
self.camera_control_publisher.publish(
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 9bd74e6..c99d702 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
@@ -1390,14 +1390,14 @@ N/A
- 0
+ 1
RDF
- -
+
-
Qt::Vertical
@@ -1441,7 +1441,27 @@ N/A
-
-
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
-
+
-
@@ -1468,21 +1488,57 @@ N/A
+ -
+
+
+ Qt::Vertical
+
+
+
+ -
+
+
-
+
+
+
+ 16
+ 75
+ true
+
+
+
+ Frequency Valid
+
+
+
+ -
+
+
+
+ 0
+ 150
+
+
+
+
+ 24
+
+
+
+ background-color:darkred;
+
+
+ No
+
+
+ Qt::AlignCenter
+
+
+
+
+
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
@@ -1527,6 +1583,9 @@ N/A
-
+
+ background-color: darkred;
+
Upright Zeroed
@@ -1534,6 +1593,9 @@ N/A
-
+
+ background-color: darkred;
+
Stow Arm
@@ -1541,6 +1603,9 @@ N/A
-
+
+ background-color: darkred;
+
Unstow Arm
diff --git a/software/ros_packages/ground_station/src/Resources/Ui/right_screen.ui b/software/ros_packages/ground_station/src/Resources/Ui/right_screen.ui
index f074dd3..8c4ece1 100644
--- a/software/ros_packages/ground_station/src/Resources/Ui/right_screen.ui
+++ b/software/ros_packages/ground_station/src/Resources/Ui/right_screen.ui
@@ -975,6 +975,9 @@ Position
false
+
+ color:red;
+
@@ -1083,6 +1086,9 @@ Position
false
+
+ color:red;
+
@@ -1191,6 +1197,9 @@ Position
false
+
+ color:red;
+
@@ -2158,11 +2167,84 @@ Position
-
+
-
+
+
+
+ 14
+ 75
+ true
+
+
+
+ Low Res Mode
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ 6
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+ background-color:darkgreen
+
+
+ DISABLED
+
+
+ false
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
-
0
+
+ 6
+
-
diff --git a/software/ros_packages/rover_main/launch/rover/control.launch b/software/ros_packages/rover_main/launch/rover/control.launch
index b425982..cf79418 100644
--- a/software/ros_packages/rover_main/launch/rover/control.launch
+++ b/software/ros_packages/rover_main/launch/rover/control.launch
@@ -35,6 +35,8 @@
-
+
+
+