diff --git a/rover_base_station_mockup/.directory b/rover_base_station_mockup/.directory
new file mode 100644
index 0000000..77a9e07
--- /dev/null
+++ b/rover_base_station_mockup/.directory
@@ -0,0 +1,4 @@
+[Dolphin]
+Timestamp=2017,11,29,12,54,0
+Version=3
+ViewMode=1
diff --git a/rover_base_station_mockup/.idea/RoverBaseStationMockup.iml b/rover_base_station_mockup/.idea/RoverBaseStationMockup.iml
new file mode 100644
index 0000000..fe33088
--- /dev/null
+++ b/rover_base_station_mockup/.idea/RoverBaseStationMockup.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/rover_base_station_mockup/.idea/inspectionProfiles/Project_Default.xml b/rover_base_station_mockup/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..bb0dcc6
--- /dev/null
+++ b/rover_base_station_mockup/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/rover_base_station_mockup/.idea/misc.xml b/rover_base_station_mockup/.idea/misc.xml
new file mode 100644
index 0000000..36e1a2b
--- /dev/null
+++ b/rover_base_station_mockup/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/rover_base_station_mockup/.idea/modules.xml b/rover_base_station_mockup/.idea/modules.xml
new file mode 100644
index 0000000..e1dd101
--- /dev/null
+++ b/rover_base_station_mockup/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/rover_base_station_mockup/.idea/workspace.xml b/rover_base_station_mockup/.idea/workspace.xml
new file mode 100644
index 0000000..fe0339f
--- /dev/null
+++ b/rover_base_station_mockup/.idea/workspace.xml
@@ -0,0 +1,720 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ camera
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ DEFINITION_ORDER
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1505485834792
+
+
+ 1505485834792
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Python
+ RoverBaseStation.ApplicationWindow
+
+ RoverBaseStation.ApplicationWindow
+ PyQt5.QtWidgets.QWidget.QWidget
+ PyQt5.QtWidgets.QMainWindow.QMainWindow
+
+
+
+
+
+
+ All
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/rover_base_station_mockup/Framework/FlasherTestCore.py b/rover_base_station_mockup/Framework/FlasherTestCore.py
new file mode 100644
index 0000000..e1b28f4
--- /dev/null
+++ b/rover_base_station_mockup/Framework/FlasherTestCore.py
@@ -0,0 +1,131 @@
+from PyQt5 import QtWidgets, QtCore, QtGui
+import time
+
+
+class Flasher(QtCore.QThread):
+ THREAD_DELAY = 100
+ FLASH_PERIOD = 1 # Per Second
+
+ update_label_status__signal = QtCore.pyqtSignal()
+
+ def __init__(self, label_gui_element, subject_text, good_text, warning_text, bad_text):
+ super(Flasher, self).__init__()
+
+ self.subject_text = subject_text
+
+ self.label = label_gui_element # type: QtWidgets.QLabel
+
+ self.not_abort = True
+
+ self.statuses = {
+ "GOOD": {
+ "style": "background-color: green;",
+ "text": good_text
+ },
+ "WARNING": {
+ "style": "background-color: yellow;",
+ "text": warning_text
+ },
+ "BAD": {
+ "style": "background-color: red;",
+ "text": bad_text
+ },
+ "NEUTRAL": {
+ "style": ""
+ },
+ "UNKNOWN": {
+ "style": "background-color: black;",
+ "text": "STATUS UNKNOWN"
+ }
+ }
+
+ self.label_status = "BAD"
+
+ self.current_label_status = self.label_status
+ self.last_label_status = self.current_label_status
+
+ self.connect_signals_to_slots()
+
+ self.last_time = time.time()
+
+ def run(self):
+ while self.not_abort:
+ if (time.time() - self.last_time) >= self.FLASH_PERIOD:
+ if self.current_label_status in ["BAD", "WARNING", "UNKNOWN"]:
+ self.current_label_status = "NEUTRAL"
+ elif self.current_label_status == "NEUTRAL":
+ self.current_label_status = self.label_status
+
+ self.update_label_status__signal.emit()
+ self.last_time = time.time()
+
+ self.msleep(self.THREAD_DELAY)
+
+ def connect_signals_to_slots(self):
+ self.update_label_status__signal.connect(self.set_style__slot)
+
+ def set_label_status__slot(self, status):
+ text = self.subject_text
+
+ if status in self.statuses:
+ self.label_status = status
+ text += "\n" + self.statuses[self.label_status]["text"]
+ else:
+ self.label_status = "UNKNOWN"
+
+ self.label.setText(text)
+
+ def set_style__slot(self):
+ self.label.setStyleSheet(self.statuses[self.current_label_status]["style"])
+
+
+class FlasherTest(QtCore.QThread):
+ set_style_sheets_signal = QtCore.pyqtSignal()
+ start_flashers__signal = QtCore.pyqtSignal()
+
+ def __init__(self, main_window):
+ super(FlasherTest, self).__init__()
+
+ self.main_window = main_window
+
+ self.not_abort = True
+
+ self.label = self.main_window.label # type: QtWidgets.QLabel
+ self.label_2 = self.main_window.label_3 # type: QtWidgets.QLabel
+ self.label_3 = self.main_window.label_4 # type: QtWidgets.QLabel
+
+ self.rover_connected_flasher = Flasher(self.label, "ROVER", "CONNECTED", "INTERMITTENT", "DISCONNECTED")
+ self.controller_connected_flasher = Flasher(self.label_2, "CONTROLLER", "CONNECTED", "INTERMITTENT", "DISCONNECTED")
+ self.frsky_controller_connected_flasher = Flasher(self.label_3, "FRSKY", "CONNECTED", "INTERMITTENT", "DISCONNECTED")
+
+ self.rover_connected_flasher.set_label_status__slot("GOOD")
+ self.controller_connected_flasher.set_label_status__slot("WARNING")
+ self.frsky_controller_connected_flasher.set_label_status__slot("BAD")
+
+ self.start_flashers__signal.connect(self.rover_connected_flasher.start)
+ self.start_flashers__signal.connect(self.controller_connected_flasher.start)
+ self.start_flashers__signal.connect(self.frsky_controller_connected_flasher.start)
+
+ self.start_flashers__signal.emit()
+
+ self.main_window.kill_threads_signal.connect(self.on_kill_threads__slot)
+
+ def run(self):
+ start_time = time.time()
+ while self.not_abort:
+ if time.time() - start_time > 1:
+ self.set_style_sheets_signal.emit()
+ start_time = time.time()
+ self.msleep(100)
+
+ def set_style_sheets(self):
+ if not self.label_last_color:
+ self.label_2.setStyleSheet("background-color: yellow;")
+ self.label_last_color = "asdf"
+ else:
+ self.label_2.setStyleSheet("")
+ self.label_last_color = ""
+
+ def on_kill_threads__slot(self):
+ self.rover_connected_flasher.terminate()
+ self.not_abort = False
diff --git a/rover_base_station_mockup/Framework/VideoCore.py b/rover_base_station_mockup/Framework/VideoCore.py
new file mode 100644
index 0000000..0f7015d
--- /dev/null
+++ b/rover_base_station_mockup/Framework/VideoCore.py
@@ -0,0 +1,164 @@
+from PyQt5 import QtWidgets, QtCore, QtGui, QtMultimediaWidgets
+import time
+import cv2
+import qimage2ndarray
+import PIL.Image
+from PIL.ImageQt import ImageQt
+
+CV_CAP_PROP_FRAME_WIDTH = 3
+CV_CAP_PROP_FRAME_HEIGHT = 4
+CV_CAP_PROP_FPS = 5
+
+
+class Compass(QtCore.QThread):
+ compass_ready__signal = QtCore.pyqtSignal()
+
+ def __init__(self, main_window):
+ super(Compass, self).__init__()
+
+ self.main_window = main_window
+
+ self.not_abort = True
+
+ self.image = PIL.Image.open("Resources/Images/compass.png").resize((300, 300)) # PIL.Image
+ self.compass_dir = 1
+
+ self.compass_label = self.main_window.compass_label # type: QtWidgets.QLabel
+ self.compass_frame = None
+ self.compass_current_degrees_rotation = 0
+
+ self.main_window.kill_threads_signal.connect(self.on_kill_threads__slot)
+ self.compass_ready__signal.connect(self.on_compass_ready__slot)
+
+ self.start()
+
+ def run(self):
+ while self.not_abort:
+ new = self.image.rotate(int(self.compass_current_degrees_rotation))
+
+ if self.compass_current_degrees_rotation == 90:
+ self.compass_dir = 0
+ elif self.compass_current_degrees_rotation == -90:
+ self.compass_dir = 1
+
+ if self.compass_dir:
+ self.compass_current_degrees_rotation += 1
+ else:
+ self.compass_current_degrees_rotation -= 1
+
+ self.compass_frame = QtGui.QPixmap.fromImage(ImageQt(new))
+ self.compass_ready__signal.emit()
+
+ self.msleep(50)
+
+ def on_compass_ready__slot(self):
+ self.compass_label.setPixmap(self.compass_frame)
+
+ def on_kill_threads__slot(self):
+ self.not_abort = False
+
+
+class VideoReader(QtCore.QThread):
+ video_frame_ready__signal = QtCore.pyqtSignal()
+
+ def __init__(self, main_window):
+ super(VideoReader, self).__init__()
+
+ self.main_window = main_window
+
+ self.not_abort = True
+
+ self.primary_display_label = self.main_window.primary_display_label # type: QtWidgets.QLabel
+
+ self.main_window.kill_threads_signal.connect(self.on_kill_threads__slot)
+ self.video_frame_ready__signal.connect(self.on_compass_ready__slot)
+
+ # self.video = cv2.imread("Resources/Videos/ROSS1.MOV")
+
+ self.video_frame = None
+
+ self.start()
+
+ def run(self):
+ while self.not_abort:
+ frame = self.video_camera.read()[1]
+
+ # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
+ # frame = cv2.resize(frame, (1280, 720))
+ # self.video_frame = QtGui.QPixmap.fromImage(qimage2ndarray.array2qimage(frame))
+
+ self.video_frame_ready__signal.emit()
+
+ self.msleep(50)
+
+ def on_compass_ready__slot(self):
+ self.primary_display_label.setPixmap(self.video_frame)
+
+ def on_kill_threads__slot(self):
+ self.not_abort = False
+
+
+class Video(QtCore.QThread):
+ image_ready_signal = QtCore.pyqtSignal()
+
+ def __init__(self, main_window):
+ super(Video, self).__init__()
+
+ self.main_window = main_window
+
+ self.not_abort = True
+
+ self.primary_display_label = self.main_window.primary_display_label # type: QtWidgets.QLabel
+ self.secondary_display_label = self.main_window.secondary_display_label # type: QtWidgets.QLabel
+ self.tertiary_display_label = self.main_window.tertiary_display_label # type: QtWidgets.QLabel
+
+ self.video_camera = cv2.VideoCapture(0)
+
+ self.video_camera.set(CV_CAP_PROP_FRAME_WIDTH, 1280)
+ self.video_camera.set(CV_CAP_PROP_FRAME_HEIGHT, 720)
+ self.video_camera.set(CV_CAP_PROP_FPS, 15)
+
+ self.main_window.kill_threads_signal.connect(self.on_kill_threads__slot)
+ self.image_ready_signal.connect(self.on_image_ready__slot)
+
+ self.raw_frame = None
+ self.large_frame = None
+ self.small_frame = None
+
+ self.compass = Compass(self.main_window)
+ # self.video_reader = VideoReader(self.main_window)
+
+ self.start()
+
+ def run(self):
+ frame_count = 0
+ start_time = time.time()
+
+ while self.not_abort:
+ frame = self.video_camera.read()[1]
+
+ self.raw_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
+ self.large_frame = self.raw_frame
+ self.small_frame = cv2.resize(self.raw_frame, (640, 360))
+ self.large_frame = QtGui.QPixmap.fromImage(qimage2ndarray.array2qimage(self.large_frame))
+ self.small_frame = QtGui.QPixmap.fromImage(qimage2ndarray.array2qimage(self.small_frame))
+
+ self.image_ready_signal.emit()
+
+ frame_count += 1
+ fps = frame_count / (time.time() - start_time)
+ # print("FPS:", fps)
+
+ self.msleep(1)
+
+ self.compass.wait()
+ #self.video_reader.wait()
+
+ def on_image_ready__slot(self):
+ pass
+ self.primary_display_label.setPixmap(self.large_frame)
+ self.secondary_display_label.setPixmap(self.small_frame)
+ self.tertiary_display_label.setPixmap(self.small_frame)
+
+ def on_kill_threads__slot(self):
+ self.not_abort = False
diff --git a/rover_base_station_mockup/Mockup.svg b/rover_base_station_mockup/Mockup.svg
new file mode 100644
index 0000000..27596a3
--- /dev/null
+++ b/rover_base_station_mockup/Mockup.svg
@@ -0,0 +1,220 @@
+
+
+
+
diff --git a/rover_base_station_mockup/README.md b/rover_base_station_mockup/README.md
new file mode 100644
index 0000000..626d591
--- /dev/null
+++ b/rover_base_station_mockup/README.md
@@ -0,0 +1,2 @@
+This was an example project using python, opencv, and pyqt to show a potential design for the rover gui.
+There's lots of useful example code here, hence me keeping it.
\ No newline at end of file
diff --git a/rover_base_station_mockup/Resources/Images/compass.png b/rover_base_station_mockup/Resources/Images/compass.png
new file mode 100644
index 0000000..d9fcdb4
Binary files /dev/null and b/rover_base_station_mockup/Resources/Images/compass.png differ
diff --git a/rover_base_station_mockup/Resources/Images/mountain_closeup.JPG b/rover_base_station_mockup/Resources/Images/mountain_closeup.JPG
new file mode 100644
index 0000000..a8c0611
Binary files /dev/null and b/rover_base_station_mockup/Resources/Images/mountain_closeup.JPG differ
diff --git a/rover_base_station_mockup/Resources/Images/mountains_from_marys_peak.JPG b/rover_base_station_mockup/Resources/Images/mountains_from_marys_peak.JPG
new file mode 100644
index 0000000..b67dc9d
Binary files /dev/null and b/rover_base_station_mockup/Resources/Images/mountains_from_marys_peak.JPG differ
diff --git a/rover_base_station_mockup/Resources/Images/path4140.png b/rover_base_station_mockup/Resources/Images/path4140.png
new file mode 100644
index 0000000..7580594
Binary files /dev/null and b/rover_base_station_mockup/Resources/Images/path4140.png differ
diff --git a/rover_base_station_mockup/Resources/Images/steller_at_terminus.png b/rover_base_station_mockup/Resources/Images/steller_at_terminus.png
new file mode 100644
index 0000000..ba4f9d6
Binary files /dev/null and b/rover_base_station_mockup/Resources/Images/steller_at_terminus.png differ
diff --git a/rover_base_station_mockup/Resources/UI/RoverGui.ui b/rover_base_station_mockup/Resources/UI/RoverGui.ui
new file mode 100644
index 0000000..48741d6
--- /dev/null
+++ b/rover_base_station_mockup/Resources/UI/RoverGui.ui
@@ -0,0 +1,910 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 1920
+ 1080
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 1920
+ 1080
+
+
+
+
+ 1920
+ 1080
+
+
+
+ MainWindow
+
+
+ 1.000000000000000
+
+
+ background-color: #201F1D;
+color: #DCDCDC;
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+ 0
+
+
-
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 213
+ 240
+
+
+
+
+ 213
+ 240
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ QLabel{
+ color: #868685;
+}
+
+
+ QFrame::NoFrame
+
+
+ Rover Connected
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 213
+ 240
+
+
+
+
+ 213
+ 240
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ false
+
+
+ QLabel{
+ color: #868685;
+}
+
+
+ Controller Connected
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 213
+ 240
+
+
+
+
+ 213
+ 240
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ QLabel{
+ color: #868685;
+}
+
+
+ FrSky Connected
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 640
+ 480
+
+
+
+
+ 640
+ 480
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ QTabWidget::pane{
+ border: 2px solid rgb(55,55,55);
+}
+
+QTabBar::tab{
+ border: 2px solid rgb(55,55,55);
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ min-width: 8ex;
+ padding: 2px;
+}
+
+QTabBar::tab:selected{
+ border-bottom-color:rgb(55,55,55);
+}
+
+QTabBar::tab:!selected{
+ margin-top: 4px;
+}
+
+QSpinBox{
+ background-color:rgb(55,55,55);
+}
+
+QPushButton{
+ background-color:rgb(55,55,55);
+}
+
+
+ 0
+
+
+
+ Video
+
+
+
-
+
+
-
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Primary Display
+
+
+
+ -
+
+
+ Main
+
+
+ true
+
+
+ false
+
+
+
+ -
+
+
+ Undercarriage
+
+
+ false
+
+
+
+ -
+
+
+ Elbow
+
+
+ false
+
+
+
+ -
+
+
+ Gripper / Nikon
+
+
+ false
+
+
+
+ -
+
+
+ Mapping
+
+
+ false
+
+
+
+
+
+ -
+
+
-
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Secondary Display
+
+
+
+ -
+
+
+ Main
+
+
+ false
+
+
+
+ -
+
+
+ Undercarriage
+
+
+ false
+
+
+
+ -
+
+
+ Elbow
+
+
+ false
+
+
+
+ -
+
+
+ Gripper / Nikon
+
+
+ false
+
+
+
+ -
+
+
+ Mapping
+
+
+ true
+
+
+ false
+
+
+
+
+
+ -
+
+
-
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Tertiary Display
+
+
+
+ -
+
+
+ Main
+
+
+ false
+
+
+
+ -
+
+
+ Undercarriage
+
+
+ true
+
+
+ false
+
+
+
+ -
+
+
+ Elbow
+
+
+ false
+
+
+
+ -
+
+
+ Gripper / Nikon
+
+
+ false
+
+
+
+
+
+
+
+
+
+ Autonomy
+
+
+
+
+ Sensors
+
+
+
+
+ Settings
+
+
+
+
+ Logs
+
+
+
+
+ -
+
+
+ 0
+
+
-
+
+
+ 0
+
+
-
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Waypoints
+
+
+
+ -
+
+
+ QTableView{
+ selection-background-color: #DE8D47;
+}
+
+QTableView QHeaderView{
+ background-color: #201F1D;
+}
+
+QTableView QHeaderView::section{
+ background-color: #201F1D;
+}
+
+QTableView QTableCornerButton::section{
+ background-color: #201F1D;
+}
+
+
+ Qt::ScrollBarAlwaysOff
+
+
+ false
+
+
+ QAbstractItemView::ExtendedSelection
+
+
+ QAbstractItemView::SelectRows
+
+
+ false
+
+
+ true
+
+
+ false
+
+
+ 59
+
+
+ 53
+
+
+ true
+
+
+ false
+
+
+ 30
+
+
+
+ 1
+
+
+
+
+ 2
+
+
+
+
+ LAT
+
+
+
+
+ LON
+
+
+
+
+ DIST
+
+
+ -
+
+ 32.1665
+
+
+ -
+
+ -112.1115
+
+
+ -
+
+ 2.4 KM
+
+
+ -
+
+ 33.1124
+
+
+ -
+
+ -111.4334
+
+
+ -
+
+ 5.7 KM
+
+
+
+
+ -
+
+
+ 2
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 65
+ 35
+
+
+
+ QPushButton{
+ color: #201F1D;
+ background-color: #868685;
+}
+
+
+ Set
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 65
+ 35
+
+
+
+ QPushButton{
+ color: #201F1D;
+ background-color: #868685;
+}
+
+
+ Add
+Manual
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 65
+ 35
+
+
+
+ QPushButton{
+ color: #201F1D;
+ background-color: #868685;
+}
+
+
+ Add
+GPS
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 65
+ 35
+
+
+
+ QPushButton{
+ color: #201F1D;
+ background-color: #868685;
+}
+
+
+ Delete
+
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 360
+ 360
+
+
+
+
+ 360
+ 360
+
+
+
+
+ PreferAntialias
+
+
+
+ Qt::DefaultContextMenu
+
+
+ background-color: black;
+
+
+
+
+
+ Qt::AlignCenter
+
+
+
+
+
+
+
+ -
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 1280
+ 720
+
+
+
+
+ 1280
+ 720
+
+
+
+ false
+
+
+ background-color: grey;
+
+
+
+
+
+ false
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 640
+ 360
+
+
+
+
+ 640
+ 360
+
+
+
+ background-color: darkgrey;
+
+
+
+
+
+ false
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 640
+ 360
+
+
+
+
+ 640
+ 360
+
+
+
+ background-color: lightgrey;
+
+
+
+
+
+ false
+
+
+ Qt::AlignCenter
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/rover_base_station_mockup/RoverBaseStation.py b/rover_base_station_mockup/RoverBaseStation.py
new file mode 100644
index 0000000..3af3578
--- /dev/null
+++ b/rover_base_station_mockup/RoverBaseStation.py
@@ -0,0 +1,128 @@
+#!/usr/bin/env python
+
+"""
+ Main file used to launch the Rover Base Station
+ No other files should be used for launching this application.
+"""
+
+__author__ = "Corwin Perren"
+__credits__ = [""]
+__license__ = "GPL (GNU General Public License) 3.0"
+__version__ = "0.1"
+__maintainer__ = "Corwin Perren"
+__email__ = "caperren@caperren.com"
+__status__ = "Development"
+
+#####################################
+# Imports
+#####################################
+# Python native imports
+import sys
+from PyQt5 import QtWidgets, QtCore, QtGui, uic
+import signal
+import ctypes
+import logging
+import time
+
+# Custom Imports
+from Framework.FlasherTestCore import FlasherTest
+from Framework.VideoCore import Video
+# from Framework.SettingsCore import Settings
+# from Framework.LoggingCore import Logger
+# from Interface.InterfaceCore import Interface
+# from Framework.GameControllerCore import GameController
+# from Framework.RoverControllerCore import RoverController
+
+#####################################
+# Global Variables
+#####################################
+UI_FILE_PATH = "Resources/UI/RoverGui.ui"
+
+
+#####################################
+# Application Class Definition
+#####################################
+class ApplicationWindow(QtWidgets.QMainWindow):
+ kill_threads_signal = QtCore.pyqtSignal()
+
+ def __init__(self, parent=None):
+ # noinspection PyArgumentList
+ super(ApplicationWindow, self).__init__(parent)
+ uic.loadUi(UI_FILE_PATH, self)
+
+ # ########## Class Variables ##########
+ self.num_threads_running = 0
+ self.threads = []
+
+ self.primary_display_label = self.primary_display_label # type: QtWidgets.QLabel
+ self.secondary_display_label = self.secondary_display_label # type: QtWidgets.QLabel
+ self.tertiary_display_label = self.tertiary_display_label # type: QtWidgets.QLabel
+
+ # self.primary_display_label.setPixmap(QtGui.QPixmap("Resources/Images/steller_at_terminus.png").scaledToHeight(1080))
+ # self.secondary_display_label.setPixmap(QtGui.QPixmap("Resources/Images/mountain_closeup.jpg"))
+ # self.tertiary_display_label.setPixmap(QtGui.QPixmap("Resources/Images/mountains_from_marys_peak.jpg"))
+
+ self.flasher = FlasherTest(self)
+ self.video = Video(self)
+
+ self.threads.append(self.flasher)
+ self.threads.append(self.video)
+ # self.gps_lock_button = self.gps_lock_button # type: QtWidgets.QPushButton
+ # self.gps_lock_button.setCheckable(True)
+
+ # ########## Instantiation of program classes ##########
+ # Settings class and version number set
+ # self.settings_class = Settings(self)
+ # self.settings = QtCore.QSettings()
+ # self.settings.setValue("miscellaneous/version", __version__)
+
+ # Uncomment these lines to completely reset settings and quit, then re-comment and rerun program
+ # self.settings.clear()
+ # self.close()
+
+ # Set up the global logger instance
+ # self.logger_class = Logger(console_output=True)
+ # self.logger = logging.getLogger("RoverBaseStation")
+ #
+ # # All interface elements
+ # self.controller_class = GameController(self)
+ # self.interface_class = Interface(self)
+ # self.rover_controller_class = RoverController(self)
+ #
+ # # ########## Add threads to list for easy access on program close ##########
+ # self.threads.append(self.interface_class.live_logs_class)
+ # self.threads.append(self.controller_class)
+ # self.threads.append(self.rover_controller_class)
+
+ # ########## Set up QT Application Window ##########
+ self.show()
+
+ def closeEvent(self, event):
+ # Tell all threads to die
+ self.kill_threads_signal.emit()
+
+ # Wait for all the threads to end properly
+ for thread in self.threads:
+ thread.wait()
+
+ # Print final log noting shutdown and shutdown the logger to flush to disk
+ # self.logger.debug("########## Application Stopping ##########")
+ logging.shutdown()
+
+ # Accept the close event to properly close the program
+ event.accept()
+
+
+#####################################
+# Main Definition
+#####################################
+if __name__ == "__main__":
+ signal.signal(signal.SIGINT, signal.SIG_DFL) # This allows the keyboard interrupt kill to work properly
+ application = QtWidgets.QApplication(sys.argv) # Create the base qt gui application
+ app_window = ApplicationWindow() # Make a window in this application
+ app_window.setWindowTitle("Rover Base Station") # Sets the window title
+
+ # app_window.setFixedSize(1920, 1080)
+ app_window.showFullScreen()
+ app_window.show() # Show the window in the application
+ application.exec_() # Execute launching of the application
diff --git a/rover_base_station_mockup/compass.svg b/rover_base_station_mockup/compass.svg
new file mode 100644
index 0000000..4a11aea
--- /dev/null
+++ b/rover_base_station_mockup/compass.svg
@@ -0,0 +1,150 @@
+
+
+
+