From f04aec4926d208034abfdc62b4954adc2a7b1b44 Mon Sep 17 00:00:00 2001 From: alessandro90 Date: Sat, 30 Mar 2019 23:40:34 +0100 Subject: [PATCH] First half of space weather screen. Still missing values updates on screen --- artemis.py | 27 ++++++++++++++++++----- constants.py | 6 +++++ forecast_data.py => space_weather_data.py | 16 +++++++------- threads.py | 26 +++++++++++++++++++++- utilities.py | 3 +++ 5 files changed, 64 insertions(+), 14 deletions(-) rename forecast_data.py => space_weather_data.py (68%) diff --git a/artemis.py b/artemis.py index cf9cb99..d2589e9 100644 --- a/artemis.py +++ b/artemis.py @@ -23,7 +23,7 @@ from PyQt5.QtCore import (QFileInfo, pyqtSlot,) from audio_player import AudioPlayer - +from space_weather_data import SpaceWeatherData from double_text_button import DoubleTextButton from download_window import DownloadWindow from switchable_label import SwitchableLabel, SwitchableLabelIterable @@ -345,13 +345,10 @@ class Artemis(QMainWindow, Ui_MainWindow): # ########################################################################################## - # self.load_db() - # Left list widget and search bar. self.search_bar.textChanged.connect(self.display_signals) self.result_list.currentItemChanged.connect(self.display_specs) self.result_list.itemDoubleClicked.connect(lambda: self.main_tab.setCurrentWidget(self.signal_properties_tab)) - # self.display_signals() self.audio_widget = AudioPlayer(self.play, self.pause, self.stop, @@ -375,12 +372,33 @@ class Artemis(QMainWindow, Ui_MainWindow): BandLabel(self.ehf_left, self.ehf, self.ehf_right), ] + # Space weather + self.info_now_btn.clicked.connect(lambda : webbrowser.open(Constants.FORECAST_INFO)) + self.update_now_btn.clicked.connect(self.start_update_space_weather) + self.space_weather_data = SpaceWeatherData() + self.space_weather_data.update_complete.connect(self.update_space_weather) + # Final operations. self.theme.initialize() self.load_db() self.display_signals() self.show() + @pyqtSlot() + def start_update_space_weather(self): + self.update_now_bar.setMaximum(self.update_now_bar.minimum()) + self.space_weather_data.update() + + @pyqtSlot(bool) + def update_space_weather(self, status_ok): + self.update_now_bar.setMaximum(self.update_now_bar.minimum() + 1) + if status_ok: + print('ok') # Insert labels values and colors here. + else: + pop_up(self, title = Messages.BAD_DOWNLOAD, + text = Messages.BAD_DOWNLOAD_MSG).show() + self.space_weather_data.remove_data() + @pyqtSlot() def go_to_gfd(self, by): query = "/?q=" @@ -394,7 +412,6 @@ class Artemis(QMainWindow, Ui_MainWindow): except: pass - @pyqtSlot(QListWidgetItem) def remove_if_unselected_modulation(self, item): if not item.isSelected(): diff --git a/constants.py b/constants.py index 16f8617..904d340 100644 --- a/constants.py +++ b/constants.py @@ -68,6 +68,12 @@ class Database(object): class Constants(object): ACF_DOCS = "https://aresvalley.com/documentation/" + FORECAST_XRAY = "https://services.swpc.noaa.gov/text/goes-xray-flux-primary.txt" + FORECAST_PROT = "https://services.swpc.noaa.gov/text/goes-particle-flux-primary.txt" + FORECAST_AK_IND = "https://services.swpc.noaa.gov/text/wwv.txt" + FORECAST_SGAS = "https://services.swpc.noaa.gov/text/sgas.txt" + FORECAST_G = "https://services.swpc.noaa.gov/text/3-day-forecast.txt" + FORECAST_INFO = "https://www.swpc.noaa.gov/sites/default/files/images/NOAAscales.pdf" SEARCH_LABEL_IMG = "search_icon.png" VOLUME_LABEL_IMG = "volume.png" DATA_FOLDER = "Data" diff --git a/forecast_data.py b/space_weather_data.py similarity index 68% rename from forecast_data.py rename to space_weather_data.py index 5be58b6..e33f1bd 100644 --- a/forecast_data.py +++ b/space_weather_data.py @@ -1,9 +1,9 @@ from PyQt5.QtCore import pyqtSlot, pyqtSignal, QObject -from threads import UpadteForecastThread, ThreadStatus +from threads import UpadteSpaceWeatherThread, ThreadStatus from utilities import double_split -class ForecastData(QObject): +class SpaceWeatherData(QObject): update_complete = pyqtSignal(bool) def __init__(self): @@ -13,7 +13,7 @@ class ForecastData(QObject): self.ak_index = '' self.sgas = '' self.geo_storm = '' - self.__update_thread = UpadteForecastThread(self) + self.__update_thread = UpadteSpaceWeatherThread(self) self.__update_thread.finished.connect(self.__parse_and_emit_signal) @pyqtSlot() @@ -21,11 +21,11 @@ class ForecastData(QObject): self.__update_thread.start() def __parse_data(self): - self.xray = double_split(str(self.xray)) - self.prot_el = double_split(str(self.prot_el)) - self.ak_index = double_split(str(self.ak_index)) - self.sgas = double_split(str(self.sgas)) - self.geo_storm = double_split(str(self.geo_storm)) + self.xray = double_split(self.xray) + self.prot_el = double_split(self.prot_el) + self.ak_index = double_split(self.ak_index) + self.sgas = double_split(self.sgas) + self.geo_storm = double_split(self.geo_storm) def remove_data(self): self.xray = '' diff --git a/threads.py b/threads.py index fa36d01..dcb6310 100644 --- a/threads.py +++ b/threads.py @@ -8,7 +8,6 @@ from zipfile import ZipFile from PyQt5.QtCore import QThread from constants import Constants, Database, ChecksumWhat from utilities import checksum_ok -import constants class ThreadStatus(Enum): OK = auto() @@ -56,3 +55,28 @@ class DownloadThread(QThread): zipped.extractall() except: self.__status = ThreadStatus.UNKNOWN_ERR + + +class UpadteSpaceWeatherThread(QThread): + def __init__(self, space_weather_data): + super().__init__() + self.__status = ThreadStatus.OK + self.__space_weather_data = space_weather_data + + @property + def status(self): + return self.__status + + def __del__(self): + self.terminate() + self.wait() + + def run(self): + try: + self.__space_weather_data.xray = str(urllib3.PoolManager().request('GET', Constants.FORECAST_XRAY).data) + self.__space_weather_data.prot_el = str(urllib3.PoolManager().request('GET', Constants.FORECAST_PROT).data) + self.__space_weather_data.ak_index = str(urllib3.PoolManager().request('GET', Constants.FORECAST_AK_IND).data) + self.__space_weather_data.sgas = str(urllib3.PoolManager().request('GET', Constants.FORECAST_SGAS).data) + self.__space_weather_data.geo_storm = str(urllib3.PoolManager().request('GET', Constants.FORECAST_G).data) + except: + self.__status = ThreadStatus.UNKNOWN_ERR diff --git a/utilities.py b/utilities.py index de0b8d9..e79ff95 100644 --- a/utilities.py +++ b/utilities.py @@ -107,3 +107,6 @@ def format_numbers(lower, upper): return f"{lower:,} {units[lower_factor]} - {upper:,} {units[upper_factor]}" else: return f"{lower:,} {units[lower_factor]}" + +def double_split(string): + return [i.split() for i in string.splitlines()]