Minor constants.py refactoring

This commit is contained in:
alessandro90
2019-03-29 22:04:04 +01:00
parent 106635cc19
commit 2c7c9b9447
6 changed files with 232 additions and 225 deletions

View File

@@ -27,7 +27,13 @@ from audio_player import AudioPlayer
from double_text_button import DoubleTextButton from double_text_button import DoubleTextButton
from download_window import DownloadWindow from download_window import DownloadWindow
import constants from constants import (Constants,
Ftype,
GfdType,
Database,
ChecksumWhat,
Messages,
Signal,)
from themes import Theme from themes import Theme
from utilities import (checksum_ok, from utilities import (checksum_ok,
@@ -127,7 +133,7 @@ class Artemis(QMainWindow, Ui_MainWindow):
self.upper_freq_confidence) self.upper_freq_confidence)
) )
self.apply_remove_freq_filter_btn.set_texts(constants.APPLY, constants.REMOVE) self.apply_remove_freq_filter_btn.set_texts(Constants.APPLY, Constants.REMOVE)
self.apply_remove_freq_filter_btn.set_slave_filters( self.apply_remove_freq_filter_btn.set_slave_filters(
[ [
*self.frequency_filters_btns, *self.frequency_filters_btns,
@@ -149,7 +155,7 @@ class Artemis(QMainWindow, Ui_MainWindow):
], ],
) )
self.apply_remove_freq_filter_btn.clicked.connect(self.display_signals) self.apply_remove_freq_filter_btn.clicked.connect(self.display_signals)
self.reset_frequency_filters_btn.clicked.connect(partial(self.reset_fb_filters, constants.Ftype.FREQ)) self.reset_frequency_filters_btn.clicked.connect(partial(self.reset_fb_filters, Ftype.FREQ))
# Manage bandwidth filters. # Manage bandwidth filters.
@@ -203,7 +209,7 @@ class Artemis(QMainWindow, Ui_MainWindow):
self.upper_band_confidence) self.upper_band_confidence)
) )
self.apply_remove_band_filter_btn.set_texts(constants.APPLY, constants.REMOVE) self.apply_remove_band_filter_btn.set_texts(Constants.APPLY, Constants.REMOVE)
self.apply_remove_band_filter_btn.set_slave_filters( self.apply_remove_band_filter_btn.set_slave_filters(
[ [
self.include_undef_bands, self.include_undef_bands,
@@ -224,7 +230,7 @@ class Artemis(QMainWindow, Ui_MainWindow):
], ],
) )
self.apply_remove_band_filter_btn.clicked.connect(self.display_signals) self.apply_remove_band_filter_btn.clicked.connect(self.display_signals)
self.reset_band_filters_btn.clicked.connect(partial(self.reset_fb_filters, constants.Ftype.BAND)) self.reset_band_filters_btn.clicked.connect(partial(self.reset_fb_filters, Ftype.BAND))
# Manage category filters # Manage category filters
@@ -247,7 +253,7 @@ class Artemis(QMainWindow, Ui_MainWindow):
self.number_stations_btn, self.number_stations_btn,
self.time_signal_btn,] self.time_signal_btn,]
self.apply_remove_cat_filter_btn.set_texts(constants.APPLY, constants.REMOVE) self.apply_remove_cat_filter_btn.set_texts(Constants.APPLY, Constants.REMOVE)
self.apply_remove_cat_filter_btn.set_slave_filters([*self.cat_filter_btns, self.apply_remove_cat_filter_btn.set_slave_filters([*self.cat_filter_btns,
self.cat_at_least_one, self.cat_at_least_one,
self.cat_all]) self.cat_all])
@@ -293,16 +299,16 @@ class Artemis(QMainWindow, Ui_MainWindow):
self.set_mode_tree_widget() self.set_mode_tree_widget()
self.mode_tree_widget.itemSelectionChanged.connect(self.manage_mode_selections) self.mode_tree_widget.itemSelectionChanged.connect(self.manage_mode_selections)
self.reset_mode_filters_btn.clicked.connect(self.reset_mode_filters) self.reset_mode_filters_btn.clicked.connect(self.reset_mode_filters)
self.apply_remove_mode_filter_btn.set_texts(constants.APPLY, constants.REMOVE) self.apply_remove_mode_filter_btn.set_texts(Constants.APPLY, Constants.REMOVE)
self.apply_remove_mode_filter_btn.set_slave_filters([self.mode_tree_widget, self.apply_remove_mode_filter_btn.set_slave_filters([self.mode_tree_widget,
self.include_unknown_modes_btn]) self.include_unknown_modes_btn])
self.apply_remove_mode_filter_btn.clicked.connect(self.display_signals) self.apply_remove_mode_filter_btn.clicked.connect(self.display_signals)
# Set modulation filter screen. # Set modulation filter screen.
self.modulation_list.addItems(constants.MODULATIONS) self.modulation_list.addItems(Constants.MODULATIONS)
self.search_bar_modulation.textEdited.connect(self.show_matching_modulations) self.search_bar_modulation.textEdited.connect(self.show_matching_modulations)
self.apply_remove_modulation_filter_btn.set_texts(constants.APPLY, constants.REMOVE) self.apply_remove_modulation_filter_btn.set_texts(Constants.APPLY, Constants.REMOVE)
self.apply_remove_modulation_filter_btn.set_slave_filters([self.search_bar_modulation, self.apply_remove_modulation_filter_btn.set_slave_filters([self.search_bar_modulation,
self.modulation_list]) self.modulation_list])
self.apply_remove_modulation_filter_btn.clicked.connect(self.display_signals) self.apply_remove_modulation_filter_btn.clicked.connect(self.display_signals)
@@ -311,9 +317,9 @@ class Artemis(QMainWindow, Ui_MainWindow):
# Set location filter screen. # Set location filter screen.
self.locations_list.addItems(constants.LOCATIONS) self.locations_list.addItems(Constants.LOCATIONS)
self.search_bar_location.textEdited.connect(self.show_matching_locations) self.search_bar_location.textEdited.connect(self.show_matching_locations)
self.apply_remove_location_filter_btn.set_texts(constants.APPLY, constants.REMOVE) self.apply_remove_location_filter_btn.set_texts(Constants.APPLY, Constants.REMOVE)
self.apply_remove_location_filter_btn.set_slave_filters([self.search_bar_location, self.apply_remove_location_filter_btn.set_slave_filters([self.search_bar_location,
self.locations_list]) self.locations_list])
self.apply_remove_location_filter_btn.clicked.connect(self.display_signals) self.apply_remove_location_filter_btn.clicked.connect(self.display_signals)
@@ -321,11 +327,11 @@ class Artemis(QMainWindow, Ui_MainWindow):
self.locations_list.itemClicked.connect(self.remove_if_unselected_location) self.locations_list.itemClicked.connect(self.remove_if_unselected_location)
# Set ACF filter screen. # Set ACF filter screen.
self.apply_remove_acf_filter_btn.set_texts(constants.APPLY, constants.REMOVE) self.apply_remove_acf_filter_btn.set_texts(Constants.APPLY, Constants.REMOVE)
self.apply_remove_acf_filter_btn.set_slave_filters([self.include_undef_acf, self.acf_spinbox, self.acf_confidence]) self.apply_remove_acf_filter_btn.set_slave_filters([self.include_undef_acf, self.acf_spinbox, self.acf_confidence])
self.apply_remove_acf_filter_btn.clicked.connect(self.display_signals) self.apply_remove_acf_filter_btn.clicked.connect(self.display_signals)
self.reset_acf_filters_btn.clicked.connect(self.reset_acf_filters) self.reset_acf_filters_btn.clicked.connect(self.reset_acf_filters)
self.acf_info_btn.clicked.connect(lambda : webbrowser.open(constants.ACF_DOCS)) self.acf_info_btn.clicked.connect(lambda : webbrowser.open(Constants.ACF_DOCS))
connect_to( connect_to(
events_to_connect = [self.acf_spinbox.valueChanged, self.acf_confidence.valueChanged], events_to_connect = [self.acf_spinbox.valueChanged, self.acf_confidence.valueChanged],
@@ -334,9 +340,9 @@ class Artemis(QMainWindow, Ui_MainWindow):
) )
# GFD # GFD
self.freq_search_gfd_btn.clicked.connect(partial(self.go_to_gfd, constants.GfdType.FREQ)) self.freq_search_gfd_btn.clicked.connect(partial(self.go_to_gfd, GfdType.FREQ))
self.location_search_gfd_btn.clicked.connect(partial(self.go_to_gfd, constants.GfdType.LOC)) self.location_search_gfd_btn.clicked.connect(partial(self.go_to_gfd, GfdType.LOC))
self.gfd_line_edit.returnPressed.connect(partial(self.go_to_gfd, constants.GfdType.LOC)) self.gfd_line_edit.returnPressed.connect(partial(self.go_to_gfd, GfdType.LOC))
# ########################################################################################## # ##########################################################################################
@@ -379,13 +385,13 @@ class Artemis(QMainWindow, Ui_MainWindow):
@pyqtSlot() @pyqtSlot()
def go_to_gfd(self, by): def go_to_gfd(self, by):
query = "/?q=" query = "/?q="
if by == constants.GfdType.FREQ: if by == GfdType.FREQ:
value_in_mhz = self.freq_gfd.value() * constants.CONVERSION_FACTORS[self.unit_freq_gfd.currentText()] / constants.CONVERSION_FACTORS["MHz"] value_in_mhz = self.freq_gfd.value() * Constants.CONVERSION_FACTORS[self.unit_freq_gfd.currentText()] / Constants.CONVERSION_FACTORS["MHz"]
query += str(value_in_mhz) query += str(value_in_mhz)
elif by == constants.GfdType.LOC: elif by == GfdType.LOC:
query += self.gfd_line_edit.text() query += self.gfd_line_edit.text()
try: try:
webbrowser.open(constants.GFD_SITE + query.lower()) webbrowser.open(Constants.GFD_SITE + query.lower())
except: except:
pass pass
@@ -417,7 +423,7 @@ class Artemis(QMainWindow, Ui_MainWindow):
item.setHidden(True) item.setHidden(True)
def set_mode_tree_widget(self): def set_mode_tree_widget(self):
for parent, children in constants.MODES.items(): for parent, children in Constants.MODES.items():
iparent = QTreeWidgetItem([parent]) iparent = QTreeWidgetItem([parent])
self.mode_tree_widget.addTopLevelItem(iparent) self.mode_tree_widget.addTopLevelItem(iparent)
for child in children: for child in children:
@@ -427,11 +433,11 @@ class Artemis(QMainWindow, Ui_MainWindow):
def manage_mode_selections(self): def manage_mode_selections(self):
selected_items = self.mode_tree_widget.selectedItems() selected_items = self.mode_tree_widget.selectedItems()
parents = constants.MODES.keys() parents = Constants.MODES.keys()
for parent in parents: for parent in parents:
for item in selected_items: for item in selected_items:
if parent == item.text(0): if parent == item.text(0):
for i in range(len(constants.MODES[parent])): for i in range(len(Constants.MODES[parent])):
item.child(i).setSelected(True) item.child(i).setSelected(True)
def set_initial_size(self): def set_initial_size(self):
@@ -493,7 +499,7 @@ class Artemis(QMainWindow, Ui_MainWindow):
@pyqtSlot() @pyqtSlot()
def ask_if_download(self): def ask_if_download(self):
if not self.download_window.isVisible(): if not self.download_window.isVisible():
db_path = os.path.join(constants.DATA_FOLDER, constants.Database.NAME) db_path = os.path.join(Constants.DATA_FOLDER, Database.NAME)
try: try:
with open(db_path, "rb") as file_db: with open(db_path, "rb") as file_db:
db = file_db.read() db = file_db.read()
@@ -501,17 +507,17 @@ class Artemis(QMainWindow, Ui_MainWindow):
self.download_db() self.download_db()
else: else:
try: try:
is_checksum_ok = checksum_ok(db, constants.ChecksumWhat.DB) is_checksum_ok = checksum_ok(db, ChecksumWhat.DB)
except: except:
pop_up(self, title = constants.Messages.NO_CONNECTION, pop_up(self, title = Messages.NO_CONNECTION,
text = constants.Messages.NO_CONNECTION_MSG).show() text = Messages.NO_CONNECTION_MSG).show()
else: else:
if not is_checksum_ok: if not is_checksum_ok:
self.download_db() self.download_db()
else: else:
answer = pop_up(self, title = constants.Messages.DB_UP_TO_DATE, answer = pop_up(self, title = Messages.DB_UP_TO_DATE,
text = constants.Messages.DB_UP_TO_DATE_MSG, text = Messages.DB_UP_TO_DATE_MSG,
informative_text = constants.Messages.DOWNLOAD_ANYWAY_QUESTION, informative_text = Messages.DOWNLOAD_ANYWAY_QUESTION,
is_question = True, is_question = True,
default_btn = QMessageBox.No).exec() default_btn = QMessageBox.No).exec()
if answer == QMessageBox.Yes: if answer == QMessageBox.Yes:
@@ -520,31 +526,31 @@ class Artemis(QMainWindow, Ui_MainWindow):
@pyqtSlot() @pyqtSlot()
def check_db_ver(self): def check_db_ver(self):
if not self.download_window.isVisible(): if not self.download_window.isVisible():
db_path = os.path.join(constants.DATA_FOLDER, constants.Database.NAME) db_path = os.path.join(Constants.DATA_FOLDER, Database.NAME)
answer = None answer = None
try: try:
with open(db_path, "rb") as file_db: with open(db_path, "rb") as file_db:
db = file_db.read() db = file_db.read()
except: except:
answer = pop_up(self, title = constants.Messages.NO_DB, answer = pop_up(self, title = Messages.NO_DB,
text = constants.Messages.NO_DB_AVAIL, text = Messages.NO_DB_AVAIL,
informative_text = constants.Messages.DOWNLOAD_NOW_QUESTION, informative_text = Messages.DOWNLOAD_NOW_QUESTION,
is_question = True).exec() is_question = True).exec()
else: else:
try: try:
is_checksum_ok = checksum_ok(db, constants.ChecksumWhat.DB) is_checksum_ok = checksum_ok(db, ChecksumWhat.DB)
except: except:
pop_up(self, title = constants.Messages.NO_CONNECTION, pop_up(self, title = Messages.NO_CONNECTION,
text = constants.Messages.NO_CONNECTION_MSG).show() text = Messages.NO_CONNECTION_MSG).show()
else: else:
if is_checksum_ok: if is_checksum_ok:
pop_up(self, title = constants.Messages.DB_UP_TO_DATE, pop_up(self, title = Messages.DB_UP_TO_DATE,
text = constants.Messages.DB_UP_TO_DATE_MSG).show() text = Messages.DB_UP_TO_DATE_MSG).show()
else: else:
answer = pop_up(self, title = constants.Messages.DB_NEW_VER, answer = pop_up(self, title = Messages.DB_NEW_VER,
text = constants.Messages.DB_NEW_VER_MSG, text = Messages.DB_NEW_VER_MSG,
informative_text = constants.Messages.DOWNLOAD_NOW_QUESTION, informative_text = Messages.DOWNLOAD_NOW_QUESTION,
is_question = True).exec() is_question = True).exec()
if answer == QMessageBox.Yes: if answer == QMessageBox.Yes:
self.download_db() self.download_db()
@@ -557,27 +563,27 @@ class Artemis(QMainWindow, Ui_MainWindow):
self.display_signals() self.display_signals()
def load_db(self): def load_db(self):
names = constants.Database.NAMES names = Database.NAMES
try: try:
self.db = read_csv(os.path.join(constants.DATA_FOLDER, constants.Database.NAME), self.db = read_csv(os.path.join(Constants.DATA_FOLDER, Database.NAME),
sep = constants.Database.DELIMITER, sep = Database.DELIMITER,
header = None, header = None,
index_col = 0, index_col = 0,
dtype = {name : str for name in constants.Database.STRINGS}, dtype = {name : str for name in Database.STRINGS},
names = names,) names = names,)
except FileNotFoundError: except FileNotFoundError:
self.search_bar.setDisabled(True) self.search_bar.setDisabled(True)
answer = pop_up(self, title = constants.Messages.NO_DB, answer = pop_up(self, title = Messages.NO_DB,
text = constants.Messages.NO_DB_AVAIL, text = Messages.NO_DB_AVAIL,
informative_text = constants.Messages.DOWNLOAD_NOW_QUESTION, informative_text = Messages.DOWNLOAD_NOW_QUESTION,
is_question = True).exec() is_question = True).exec()
if answer == QMessageBox.Yes: if answer == QMessageBox.Yes:
self.download_db() self.download_db()
else: else:
self.signal_names = self.db.index self.signal_names = self.db.index
self.total_signals = len(self.signal_names) self.total_signals = len(self.signal_names)
self.db.fillna(constants.UNKNOWN, inplace = True) self.db.fillna(Constants.UNKNOWN, inplace = True)
self.db[constants.Signal.WIKI_CLICKED] = False self.db[Signal.WIKI_CLICKED] = False
self.update_status_tip(self.total_signals) self.update_status_tip(self.total_signals)
self.result_list.addItems(self.signal_names) self.result_list.addItems(self.signal_names)
@@ -594,8 +600,8 @@ class Artemis(QMainWindow, Ui_MainWindow):
upper_units = upper_combo_box.currentText() upper_units = upper_combo_box.currentText()
lower_value = lower_spin_box.value() lower_value = lower_spin_box.value()
upper_value = upper_spin_box.value() upper_value = upper_spin_box.value()
inf_limit = (lower_value * constants.CONVERSION_FACTORS[lower_units]) \ inf_limit = (lower_value * Constants.CONVERSION_FACTORS[lower_units]) \
// constants.CONVERSION_FACTORS[upper_units] // Constants.CONVERSION_FACTORS[upper_units]
counter = 0 counter = 0
while inf_limit > upper_spin_box.maximum(): while inf_limit > upper_spin_box.maximum():
counter += 1 counter += 1
@@ -636,17 +642,17 @@ class Artemis(QMainWindow, Ui_MainWindow):
min_value = lower_spinbox.value() min_value = lower_spinbox.value()
if lower_confidence.value() != 0: if lower_confidence.value() != 0:
min_value -= lower_spinbox.value() * lower_confidence.value() / 100 min_value -= lower_spinbox.value() * lower_confidence.value() / 100
to_display += str(round(min_value, constants.MAX_DIGITS)) + ' ' + lower_unit.currentText() to_display += str(round(min_value, Constants.MAX_DIGITS)) + ' ' + lower_unit.currentText()
else: else:
to_display += 'DC' to_display += 'DC'
to_display += constants.RANGE_SEPARATOR to_display += Constants.RANGE_SEPARATOR
if activate_up_btn.isChecked(): if activate_up_btn.isChecked():
max_value = upper_spinbox.value() max_value = upper_spinbox.value()
activate_high = True activate_high = True
color = self.active_color color = self.active_color
if upper_confidence.value() != 0: if upper_confidence.value() != 0:
max_value += upper_spinbox.value() * upper_confidence.value() / 100 max_value += upper_spinbox.value() * upper_confidence.value() / 100
to_display += str(round(max_value, constants.MAX_DIGITS)) + ' ' + upper_unit.currentText() to_display += str(round(max_value, Constants.MAX_DIGITS)) + ' ' + upper_unit.currentText()
else: else:
to_display += 'INF' to_display += 'INF'
if activate_low and activate_high: if activate_low and activate_high:
@@ -666,8 +672,8 @@ class Artemis(QMainWindow, Ui_MainWindow):
def set_acf_interval_label(self): def set_acf_interval_label(self):
tolerance = self.acf_spinbox.value() * self.acf_confidence.value() / 100 tolerance = self.acf_spinbox.value() * self.acf_confidence.value() / 100
if tolerance > 0: if tolerance > 0:
to_display = f"Selected range:\n\n{round(self.acf_spinbox.value() - tolerance, constants.MAX_DIGITS)}" +\ to_display = f"Selected range:\n\n{round(self.acf_spinbox.value() - tolerance, Constants.MAX_DIGITS)}" +\
constants.RANGE_SEPARATOR + f"{round(self.acf_spinbox.value() + tolerance, constants.MAX_DIGITS)} ms" Constants.RANGE_SEPARATOR + f"{round(self.acf_spinbox.value() + tolerance, Constants.MAX_DIGITS)} ms"
else: else:
to_display = f"Selected value:\n\n{self.acf_spinbox.value()} ms" to_display = f"Selected value:\n\n{self.acf_spinbox.value()} ms"
self.acf_range_lbl.setText(to_display) self.acf_range_lbl.setText(to_display)
@@ -709,7 +715,7 @@ class Artemis(QMainWindow, Ui_MainWindow):
@pyqtSlot() @pyqtSlot()
def reset_fb_filters(self, ftype): def reset_fb_filters(self, ftype):
if ftype != constants.Ftype.FREQ and ftype != constants.Ftype.BAND: if ftype != Ftype.FREQ and ftype != Ftype.BAND:
raise ValueError("Wrong ftype in function 'reset_fb_filters'") raise ValueError("Wrong ftype in function 'reset_fb_filters'")
apply_remove_btn = getattr(self, 'apply_remove_' + ftype + '_filter_btn') apply_remove_btn = getattr(self, 'apply_remove_' + ftype + '_filter_btn')
include_undef_btn = getattr(self, 'include_undef_' + ftype + 's') include_undef_btn = getattr(self, 'include_undef_' + ftype + 's')
@@ -721,8 +727,8 @@ class Artemis(QMainWindow, Ui_MainWindow):
upper_spinbox = getattr(self, 'upper_' + ftype + '_spinbox') upper_spinbox = getattr(self, 'upper_' + ftype + '_spinbox')
lower_confidence = getattr(self, 'lower_' + ftype + '_confidence') lower_confidence = getattr(self, 'lower_' + ftype + '_confidence')
upper_confidence = getattr(self, 'lower_' + ftype + '_confidence') upper_confidence = getattr(self, 'lower_' + ftype + '_confidence')
default_val = 1 if ftype == constants.Ftype.FREQ else 5000 default_val = 1 if ftype == Ftype.FREQ else 5000
if ftype == constants.Ftype.FREQ: if ftype == Ftype.FREQ:
for f in self.frequency_filters_btns: for f in self.frequency_filters_btns:
if f.isChecked(): if f.isChecked():
f.setChecked(False) f.setChecked(False)
@@ -789,12 +795,12 @@ class Artemis(QMainWindow, Ui_MainWindow):
else: else:
return False return False
signal_freqs = (int(self.db.at[signal_name, constants.Signal.INF_FREQ]), signal_freqs = (int(self.db.at[signal_name, Signal.INF_FREQ]),
int(self.db.at[signal_name, constants.Signal.SUP_FREQ])) int(self.db.at[signal_name, Signal.SUP_FREQ]))
band_filter_ok = False band_filter_ok = False
any_checked = False any_checked = False
for btn, band_limits in zip(self.frequency_filters_btns, constants.BANDS): for btn, band_limits in zip(self.frequency_filters_btns, Constants.BANDS):
if btn.isChecked(): if btn.isChecked():
any_checked = True any_checked = True
if signal_freqs[0] < band_limits.upper and signal_freqs[1] >= band_limits.lower: if signal_freqs[0] < band_limits.upper and signal_freqs[1] >= band_limits.lower:
@@ -826,8 +832,8 @@ class Artemis(QMainWindow, Ui_MainWindow):
else: else:
return False return False
signal_bands = (int(self.db.at[signal_name, constants.Signal.INF_BAND]), signal_bands = (int(self.db.at[signal_name, Signal.INF_BAND]),
int(self.db.at[signal_name, constants.Signal.SUP_BAND])) int(self.db.at[signal_name, Signal.SUP_BAND]))
lower_limit_ok = True lower_limit_ok = True
upper_limit_ok = True upper_limit_ok = True
@@ -846,7 +852,7 @@ class Artemis(QMainWindow, Ui_MainWindow):
def category_filters_ok(self, signal_name): def category_filters_ok(self, signal_name):
if not self.apply_remove_cat_filter_btn.isChecked(): if not self.apply_remove_cat_filter_btn.isChecked():
return True return True
cat_code = self.db.at[signal_name, constants.Signal.CATEGORY_CODE] cat_code = self.db.at[signal_name, Signal.CATEGORY_CODE]
cat_checked = 0 cat_checked = 0
positive_cases = 0 positive_cases = 0
for index, cat in enumerate(self.cat_filter_btns): for index, cat in enumerate(self.cat_filter_btns):
@@ -862,15 +868,15 @@ class Artemis(QMainWindow, Ui_MainWindow):
def mode_filters_ok(self, signal_name): def mode_filters_ok(self, signal_name):
if not self.apply_remove_mode_filter_btn.isChecked(): if not self.apply_remove_mode_filter_btn.isChecked():
return True return True
signal_mode = self.db.at[signal_name, constants.Signal.MODE] signal_mode = self.db.at[signal_name, Signal.MODE]
if signal_mode == constants.UNKNOWN: if signal_mode == Constants.UNKNOWN:
if self.include_unknown_modes_btn.isChecked(): if self.include_unknown_modes_btn.isChecked():
return True return True
else: else:
return False return False
selected_items = [item for item in self.mode_tree_widget.selectedItems()] selected_items = [item for item in self.mode_tree_widget.selectedItems()]
selected_items_text = [i.text(0) for i in selected_items] selected_items_text = [i.text(0) for i in selected_items]
parents = [item for item in selected_items_text if item in constants.MODES.keys()] parents = [item for item in selected_items_text if item in Constants.MODES.keys()]
children = [item for item in selected_items_text if item not in parents] children = [item for item in selected_items_text if item not in parents]
ok = [] ok = []
for item in selected_items: for item in selected_items:
@@ -883,7 +889,7 @@ class Artemis(QMainWindow, Ui_MainWindow):
def modulation_filters_ok(self, signal_name): def modulation_filters_ok(self, signal_name):
if not self.apply_remove_modulation_filter_btn.isChecked(): if not self.apply_remove_modulation_filter_btn.isChecked():
return True return True
signal_modulation = self.db.at[signal_name, constants.Signal.MODULATION] signal_modulation = self.db.at[signal_name, Signal.MODULATION]
for item in self.modulation_list.selectedItems(): for item in self.modulation_list.selectedItems():
if item.text() == signal_modulation: if item.text() == signal_modulation:
return True return True
@@ -892,7 +898,7 @@ class Artemis(QMainWindow, Ui_MainWindow):
def location_filters_ok(self, signal_name): def location_filters_ok(self, signal_name):
if not self.apply_remove_location_filter_btn.isChecked(): if not self.apply_remove_location_filter_btn.isChecked():
return True return True
signal_location = self.db.at[signal_name, constants.Signal.LOCATION] signal_location = self.db.at[signal_name, Signal.LOCATION]
for item in self.locations_list.selectedItems(): for item in self.locations_list.selectedItems():
if item.text() == signal_location: if item.text() == signal_location:
return True return True
@@ -901,8 +907,8 @@ class Artemis(QMainWindow, Ui_MainWindow):
def acf_filters_ok(self, signal_name): def acf_filters_ok(self, signal_name):
if not self.apply_remove_acf_filter_btn.isChecked(): if not self.apply_remove_acf_filter_btn.isChecked():
return True return True
signal_acf = self.db.at[signal_name, constants.Signal.ACF] signal_acf = self.db.at[signal_name, Signal.ACF]
if signal_acf == constants.UNKNOWN: if signal_acf == Constants.UNKNOWN:
if self.include_undef_acf.isChecked(): if self.include_undef_acf.isChecked():
return True return True
else: else:
@@ -926,31 +932,31 @@ class Artemis(QMainWindow, Ui_MainWindow):
self.name_lab.setAlignment(Qt.AlignHCenter) self.name_lab.setAlignment(Qt.AlignHCenter)
current_signal = self.db.loc[self.current_signal_name] current_signal = self.db.loc[self.current_signal_name]
self.url_button.setEnabled(True) self.url_button.setEnabled(True)
if not current_signal.at[constants.Signal.WIKI_CLICKED]: if not current_signal.at[Signal.WIKI_CLICKED]:
self.url_button.setStyleSheet(f"color: {self.url_button.colors.active};") self.url_button.setStyleSheet(f"color: {self.url_button.colors.active};")
else: else:
self.url_button.setStyleSheet(f"color: {self.url_button.colors.clicked};") self.url_button.setStyleSheet(f"color: {self.url_button.colors.clicked};")
category_code = current_signal.at[constants.Signal.CATEGORY_CODE] category_code = current_signal.at[Signal.CATEGORY_CODE]
undef_freq = is_undef_freq(current_signal) undef_freq = is_undef_freq(current_signal)
undef_band = is_undef_band(current_signal) undef_band = is_undef_band(current_signal)
if not undef_freq: if not undef_freq:
self.freq_lab.setText(format_numbers(current_signal.at[constants.Signal.INF_FREQ], self.freq_lab.setText(format_numbers(current_signal.at[Signal.INF_FREQ],
current_signal.at[constants.Signal.SUP_FREQ]) current_signal.at[Signal.SUP_FREQ])
) )
else: else:
self.freq_lab.setText("Undefined") self.freq_lab.setText("Undefined")
if not undef_band: if not undef_band:
self.band_lab.setText(format_numbers(current_signal.at[constants.Signal.INF_BAND], self.band_lab.setText(format_numbers(current_signal.at[Signal.INF_BAND],
current_signal.at[constants.Signal.SUP_BAND]) current_signal.at[Signal.SUP_BAND])
) )
else: else:
self.band_lab.setText("Undefined") self.band_lab.setText("Undefined")
self.mode_lab.setText(current_signal.at[constants.Signal.MODE]) self.mode_lab.setText(current_signal.at[Signal.MODE])
self.modul_lab.setText(current_signal.at[constants.Signal.MODULATION]) self.modul_lab.setText(current_signal.at[Signal.MODULATION])
self.loc_lab.setText(current_signal.at[constants.Signal.LOCATION]) self.loc_lab.setText(current_signal.at[Signal.LOCATION])
self.acf_lab.setText(current_signal.at[constants.Signal.ACF]) self.acf_lab.setText(current_signal.at[Signal.ACF])
self.description_text.setText(current_signal.at[constants.Signal.DESCRIPTION]) self.description_text.setText(current_signal.at[Signal.DESCRIPTION])
for cat, cat_lab in zip(category_code, self.category_labels): for cat, cat_lab in zip(category_code, self.category_labels):
if cat == '0': if cat == '0':
cat_lab.setStyleSheet(f"color: {self.inactive_color};") cat_lab.setStyleSheet(f"color: {self.inactive_color};")
@@ -965,22 +971,22 @@ class Artemis(QMainWindow, Ui_MainWindow):
self.name_lab.setText("No Signal") self.name_lab.setText("No Signal")
self.name_lab.setAlignment(Qt.AlignHCenter) self.name_lab.setAlignment(Qt.AlignHCenter)
for lab in self.property_labels: for lab in self.property_labels:
lab.setText(constants.UNKNOWN) lab.setText(Constants.UNKNOWN)
for lab in self.category_labels: for lab in self.category_labels:
lab.setStyleSheet(f"color: {self.inactive_color};") lab.setStyleSheet(f"color: {self.inactive_color};")
self.set_band_range() self.set_band_range()
self.audio_widget.set_audio_player() self.audio_widget.set_audio_player()
def display_spectrogram(self): def display_spectrogram(self):
default_pic = os.path.join(self.default_images_folder, constants.NOT_SELECTED) default_pic = os.path.join(self.default_images_folder, Constants.NOT_SELECTED)
item = self.result_list.currentItem() item = self.result_list.currentItem()
if item: if item:
spectrogram_name = item.text() spectrogram_name = item.text()
path_spectr = os.path.join(constants.DATA_FOLDER, path_spectr = os.path.join(Constants.DATA_FOLDER,
constants.SPECTRA_FOLDER, Constants.SPECTRA_FOLDER,
spectrogram_name + constants.SPECTRA_EXT) spectrogram_name + Constants.SPECTRA_EXT)
if not QFileInfo(path_spectr).exists(): if not QFileInfo(path_spectr).exists():
path_spectr = os.path.join(self.default_images_folder, constants.NOT_AVAILABLE) path_spectr = os.path.join(self.default_images_folder, Constants.NOT_AVAILABLE)
else: else:
path_spectr = default_pic path_spectr = default_pic
self.spectrogram.setPixmap(QPixmap(path_spectr)) self.spectrogram.setPixmap(QPixmap(path_spectr))
@@ -992,9 +998,9 @@ class Artemis(QMainWindow, Ui_MainWindow):
def set_band_range(self, current_signal = None): def set_band_range(self, current_signal = None):
if current_signal is not None and not is_undef_freq(current_signal): if current_signal is not None and not is_undef_freq(current_signal):
lower_freq = int(current_signal.at[constants.Signal.INF_FREQ]) lower_freq = int(current_signal.at[Signal.INF_FREQ])
upper_freq = int(current_signal.at[constants.Signal.SUP_FREQ]) upper_freq = int(current_signal.at[Signal.SUP_FREQ])
zipped = list(zip(constants.BANDS, self.band_labels)) zipped = list(zip(Constants.BANDS, self.band_labels))
for i, w in enumerate(zipped): for i, w in enumerate(zipped):
band, band_label = w band, band_label = w
if lower_freq >= band.lower and lower_freq < band.upper: if lower_freq >= band.lower and lower_freq < band.upper:
@@ -1025,8 +1031,8 @@ class Artemis(QMainWindow, Ui_MainWindow):
def go_to_web_page_signal(self): def go_to_web_page_signal(self):
if self.current_signal_name: if self.current_signal_name:
self.url_button.setStyleSheet(f"color: {self.url_button.colors.clicked}") self.url_button.setStyleSheet(f"color: {self.url_button.colors.clicked}")
webbrowser.open(self.db.at[self.current_signal_name, constants.Signal.URL]) webbrowser.open(self.db.at[self.current_signal_name, Signal.URL])
self.db.at[self.current_signal_name, constants.Signal.WIKI_CLICKED] = True self.db.at[self.current_signal_name, Signal.WIKI_CLICKED] = True
def closeEvent(self, event): def closeEvent(self, event):
if self.download_window.isVisible(): if self.download_window.isVisible():

View File

@@ -4,7 +4,7 @@ from pydub import AudioSegment
from pygame import mixer from pygame import mixer
from PyQt5.QtCore import QTimer, pyqtSlot, QObject from PyQt5.QtCore import QTimer, pyqtSlot, QObject
import constants from constants import Constants
import qtawesome as qta import qtawesome as qta
@@ -82,7 +82,7 @@ class AudioPlayer(QObject): # Maybe useless inheriting from QObject
def set_audio_player(self, fname = ""): def set_audio_player(self, fname = ""):
self.__first_call = True self.__first_call = True
self.__reset_audio_widget() self.__reset_audio_widget()
full_name = os.path.join(constants.DATA_FOLDER, constants.AUDIO_FOLDER, fname + '.ogg') full_name = os.path.join(Constants.DATA_FOLDER, Constants.AUDIO_FOLDER, fname + '.ogg')
if os.path.exists(full_name): if os.path.exists(full_name):
self.__play.setEnabled(True) self.__play.setEnabled(True)
self.__audio_file = full_name self.__audio_file = full_name

View File

@@ -66,6 +66,7 @@ class Database(object):
Signal.SUP_BAND, Signal.SUP_BAND,
Signal.CATEGORY_CODE,) Signal.CATEGORY_CODE,)
class Constants(object):
ACF_DOCS = "https://aresvalley.com/documentation/" ACF_DOCS = "https://aresvalley.com/documentation/"
SEARCH_LABEL_IMG = "search_icon.png" SEARCH_LABEL_IMG = "search_icon.png"
VOLUME_LABEL_IMG = "volume.png" VOLUME_LABEL_IMG = "volume.png"

View File

@@ -3,7 +3,7 @@ import os
from PyQt5.QtWidgets import QAction from PyQt5.QtWidgets import QAction
from PyQt5.QtCore import pyqtSlot from PyQt5.QtCore import pyqtSlot
from PyQt5.QtGui import QPixmap from PyQt5.QtGui import QPixmap
import constants from constants import Constants
from utilities import pop_up, is_valid_html_color from utilities import pop_up, is_valid_html_color
class ThemeConstants(object): class ThemeConstants(object):
@@ -93,14 +93,14 @@ class Theme(object):
ThemeConstants.DEFAULT, ThemeConstants.DEFAULT,
ThemeConstants.ICONS_FOLDER) ThemeConstants.ICONS_FOLDER)
if os.path.exists(os.path.join(icons_path, constants.NOT_SELECTED)) and \ if os.path.exists(os.path.join(icons_path, Constants.NOT_SELECTED)) and \
os.path.exists(os.path.join(icons_path, constants.NOT_AVAILABLE)): os.path.exists(os.path.join(icons_path, Constants.NOT_AVAILABLE)):
self.__parent.default_images_folder = icons_path self.__parent.default_images_folder = icons_path
else: else:
self.__parent.default_images_folder = default_icons_path self.__parent.default_images_folder = default_icons_path
path_to_search_label = os.path.join(icons_path, constants.SEARCH_LABEL_IMG) path_to_search_label = os.path.join(icons_path, Constants.SEARCH_LABEL_IMG)
default_search_label = os.path.join(default_icons_path, constants.SEARCH_LABEL_IMG) default_search_label = os.path.join(default_icons_path, Constants.SEARCH_LABEL_IMG)
if os.path.exists(path_to_search_label): if os.path.exists(path_to_search_label):
self.__parent.search_label.setPixmap(QPixmap(path_to_search_label)) self.__parent.search_label.setPixmap(QPixmap(path_to_search_label))
@@ -115,8 +115,8 @@ class Theme(object):
self.__parent.modulation_search_label.setScaledContents(True) self.__parent.modulation_search_label.setScaledContents(True)
self.__parent.location_search_label.setScaledContents(True) self.__parent.location_search_label.setScaledContents(True)
path_to_volume_label = os.path.join(icons_path, constants.VOLUME_LABEL_IMG) path_to_volume_label = os.path.join(icons_path, Constants.VOLUME_LABEL_IMG)
default_volume_label = os.path.join(default_icons_path, constants.VOLUME_LABEL_IMG) default_volume_label = os.path.join(default_icons_path, Constants.VOLUME_LABEL_IMG)
if os.path.exists(path_to_volume_label): if os.path.exists(path_to_volume_label):
self.__parent.volume_label.setPixmap(QPixmap(path_to_volume_label)) self.__parent.volume_label.setPixmap(QPixmap(path_to_volume_label))
@@ -138,10 +138,10 @@ class Theme(object):
valid_format = True valid_format = True
quality, color = line.split(ThemeConstants.COLOR_SEPARATOR) quality, color = line.split(ThemeConstants.COLOR_SEPARATOR)
color = color.rstrip() color = color.rstrip()
if quality.lower() == constants.ACTIVE and is_valid_html_color(color): if quality.lower() == Constants.ACTIVE and is_valid_html_color(color):
self.__parent.active_color = color self.__parent.active_color = color
active_color_ok = True active_color_ok = True
if quality.lower() == constants.INACTIVE and is_valid_html_color(color): if quality.lower() == Constants.INACTIVE and is_valid_html_color(color):
self.__parent.inactive_color = color self.__parent.inactive_color = color
inactive_color_ok = True inactive_color_ok = True

View File

@@ -6,7 +6,7 @@ from shutil import rmtree
import urllib3 import urllib3
from zipfile import ZipFile from zipfile import ZipFile
from PyQt5.QtCore import QThread from PyQt5.QtCore import QThread
import constants from constants import Constants, Database, ChecksumWhat
from utilities import checksum_ok from utilities import checksum_ok
import constants import constants
@@ -32,7 +32,7 @@ class DownloadThread(QThread):
def run(self): def run(self):
try: try:
db = urllib3.PoolManager().request('GET', constants.Database.LINK_LOC) db = urllib3.PoolManager().request('GET', Database.LINK_LOC)
# db = urllib.request.urlopen(constants.Database.LINK_LOC) # db = urllib.request.urlopen(constants.Database.LINK_LOC)
# raise urllib.error.URLError('Test') # raise urllib.error.URLError('Test')
except urllib3.exceptions.MaxRetryError: # No internet connection. except urllib3.exceptions.MaxRetryError: # No internet connection.
@@ -43,7 +43,7 @@ class DownloadThread(QThread):
self.__status = ThreadStatus.BAD_DOWNLOAD_ERR self.__status = ThreadStatus.BAD_DOWNLOAD_ERR
return return
try: try:
is_checksum_ok = checksum_ok(db.data, constants.ChecksumWhat.FOLDER) is_checksum_ok = checksum_ok(db.data, ChecksumWhat.FOLDER)
except: except:
self.__status = ThreadStatus.NO_CONNECTION_ERR self.__status = ThreadStatus.NO_CONNECTION_ERR
return return
@@ -51,8 +51,8 @@ class DownloadThread(QThread):
if not is_checksum_ok: if not is_checksum_ok:
self.__status = ThreadStatus.BAD_DOWNLOAD_ERR self.__status = ThreadStatus.BAD_DOWNLOAD_ERR
return return
if os.path.exists(constants.DATA_FOLDER): if os.path.exists(Constants.DATA_FOLDER):
rmtree(constants.DATA_FOLDER) rmtree(Constants.DATA_FOLDER)
try: try:
# data_folder = db.read() # data_folder = db.read()
with ZipFile(BytesIO(db.data)) as zipped: with ZipFile(BytesIO(db.data)) as zipped:

View File

@@ -7,7 +7,7 @@ from pandas import read_csv
from PyQt5.QtWidgets import QMessageBox from PyQt5.QtWidgets import QMessageBox
import constants from constants import Constants, Signal, Database, ChecksumWhat
def resource_path(relative_path): def resource_path(relative_path):
try: try:
@@ -42,15 +42,15 @@ def pop_up(cls, title, text,
def checksum_ok(data, what): def checksum_ok(data, what):
code = hashlib.sha256() code = hashlib.sha256()
code.update(data) code.update(data)
if what == constants.ChecksumWhat.FOLDER: if what == ChecksumWhat.FOLDER:
n = 0 n = 0
elif what == constants.ChecksumWhat.DB: elif what == ChecksumWhat.DB:
n = 1 n = 1
else: else:
raise ValueError("Wrong entry name.") raise ValueError("Wrong entry name.")
try: try:
reference = read_csv(constants.Database.LINK_REF, reference = read_csv(Database.LINK_REF,
delimiter = constants.Database.DELIMITER).iat[-1, n] delimiter = Database.DELIMITER).iat[-1, n]
except: except:
raise raise
return code.hexdigest() == reference return code.hexdigest() == reference
@@ -67,18 +67,18 @@ def connect_to(events_to_connect, fun_to_connect, fun_args):
event.connect(fun_to_connect) event.connect(fun_to_connect)
def filters_ok(spinbox, filter_unit, confidence, sign = 1): def filters_ok(spinbox, filter_unit, confidence, sign = 1):
band_filter = spinbox.value() * constants.CONVERSION_FACTORS[filter_unit.currentText()] band_filter = spinbox.value() * Constants.CONVERSION_FACTORS[filter_unit.currentText()]
return band_filter + sign * (confidence.value() * band_filter) // 100 return band_filter + sign * (confidence.value() * band_filter) // 100
def is_undef_freq(current_signal): def is_undef_freq(current_signal):
lower_freq = current_signal.at[constants.Signal.INF_FREQ] lower_freq = current_signal.at[Signal.INF_FREQ]
upper_freq = current_signal.at[constants.Signal.SUP_FREQ] upper_freq = current_signal.at[Signal.SUP_FREQ]
return lower_freq == constants.UNKNOWN or upper_freq == constants.UNKNOWN return lower_freq == Constants.UNKNOWN or upper_freq == Constants.UNKNOWN
def is_undef_band(current_signal): def is_undef_band(current_signal):
lower_band = current_signal.at[constants.Signal.INF_BAND] lower_band = current_signal.at[Signal.INF_BAND]
upper_band = current_signal.at[constants.Signal.SUP_BAND] upper_band = current_signal.at[Signal.SUP_BAND]
return lower_band == constants.UNKNOWN or upper_band == constants.UNKNOWN return lower_band == Constants.UNKNOWN or upper_band == Constants.UNKNOWN
def change_unit(num): def change_unit(num):
digits = len(num) digits = len(num)