20 Commits

Author SHA1 Message Date
Marco Dalla Tiezza
5d3cdb7abb Updated to v4.0.3 (hotfix) 2024-06-10 21:57:47 +02:00
Marco Dalla Tiezza
5b8670814b Removed setProperty and findChild in dowloader.py for code uniformity 2024-06-10 21:51:53 +02:00
Marco Dalla Tiezza
19acf11b1a Fixed a potential bug affecting ARM architecture 2024-06-10 21:30:28 +02:00
Marco Dalla Tiezza
39056d1d91 Updated name of excluded DLLs (only for linux since it is using a lib prefix) 2024-06-10 21:22:32 +02:00
Marco Dalla Tiezza
436c54b733 Fixed #48 an error occurig on Linux where configuration file path are not properly resolved during startup with the binary version of the program 2024-06-10 20:40:46 +02:00
Marco Dalla Tiezza
b48a42dcc8 Explicit DLLs inclusion/exclusion in Nuitka, close #47 2024-06-10 16:55:04 +02:00
Marco Dalla Tiezza
e00e21c46a Fixed #46 2024-06-10 11:56:27 +02:00
Marco Dalla Tiezza
2aa821ee65 Minor docs fix 2024-06-09 16:42:19 +02:00
Marco Dalla Tiezza
5ab0c39aa9 Rolling out v4.0.1 2024-06-09 16:31:21 +02:00
Marco Dalla Tiezza
f09bbd3311 Revert "Bump Nuitka 2.3.1"
This reverts commit 91589018a3.
2024-06-09 16:07:24 +02:00
Marco Dalla Tiezza
91589018a3 Bump Nuitka 2.3.1 2024-06-09 15:42:40 +02:00
Marco Dalla Tiezza
d41c9e1ed6 Added installer icon, bump version 4.0.1 2024-06-09 15:36:54 +02:00
Marco Dalla Tiezza
0cbd9a7a0b Updated documentation 2024-06-09 15:17:13 +02:00
Marco Dalla Tiezza
7db68ab2ad Integrity check for the configuration parser 2024-06-06 22:34:51 +02:00
Marco Dalla Tiezza
c7c53b5a68 Solved clipping of the scrollbar on different textareas 2024-06-06 20:12:29 +02:00
Marco Dalla Tiezza
9d2443b0f0 Updated docs 2024-06-06 19:20:03 +02:00
Marco Dalla Tiezza
2c3ffd5e66 Updated readme image 2024-06-06 19:15:46 +02:00
Marco Dalla Tiezza
485eccb373 Added DB autoload on startup option 2024-06-06 19:06:45 +02:00
Marco Dalla Tiezza
faf9a5293a Normalized K and A index lights to NOAA standard nomnclature 2024-06-06 18:11:15 +02:00
Marco Dalla Tiezza
e58cf4d206 Updated docs 2024-06-06 15:51:20 +02:00
31 changed files with 1023 additions and 915 deletions

3
.gitignore vendored
View File

@@ -6,3 +6,6 @@ data/
*.qtds
artemis_rc.py
site
Generated
app.build
app.dist

View File

@@ -3,7 +3,19 @@
> [!NOTE]
> This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) and the format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [Unreleased] - 2024-05-28
## [Unreleased]
## [4.0.3] - 2024-06-10
### Changed
- Optimized final package size (reduced by 30% to 50%) by explicitly including necessary plugins/DLLs and excluding unnecessary ones with Nuitka [#47](https://github.com/AresValley/Artemis/issues/47)
### Fixed
- When the links/urls in the description field of a signal are clicked, they open the default browser [#46](https://github.com/AresValley/Artemis/issues/46)
- Fixed an error occurig on Linux where configuration file path are not properly resolved during startup with the binary version of the program (they are if running from source) [#48](https://github.com/AresValley/Artemis/issues/48)
## [4.0.1] - 2024-06-9
### Added
- Database format has been changed from .csv to a proper relational DB (sqlite) which is much easier handled thanks to the native library shipped with python
- Possibility to create an arbitrary number of new databases for storing new custom signals
@@ -89,7 +101,9 @@ First release.
<!-- Links definitions -->
[Unreleased]: https://github.com/AresValley/Artemis/compare/v3.2.4...HEAD
[Unreleased]: https://github.com/AresValley/Artemis/compare/v4.0.3...HEAD
[4.0.1]: https://github.com/AresValley/Artemis/compare/v4.0.1...v4.0.3
[4.0.1]: https://github.com/AresValley/Artemis/compare/v3.2.4...v4.0.1
[3.2.4]: https://github.com/AresValley/Artemis/compare/v3.2.1...v3.2.4
[3.2.3]: https://github.com/AresValley/Artemis/compare/v3.2.2...v3.2.3
[3.2.2]: https://github.com/AresValley/Artemis/compare/v3.2.1...v3.2.2

View File

@@ -15,7 +15,7 @@
**Artemis** is a software designed to assist **radio frequency (RF) signal identification and storage**. It simplifies real-time spectrum analysis by leveraging one of the most extensive and community-driven databases, containing nearly **500 recognized signals**. This comprehensive software solution allows users to collect RF signals with specific parameters such as frequency, bandwidth, modulation, etc. Users can also store spectrum waterfalls, audio samples, and all types of documents for future reference. Artemis provides a robust platform to manage a wide range of RF data with precision and ease.
<div align="center">
<img src="docs/assets/artemis_preview.png">
<img src="docs/assets/artemis_preview.webp">
</div>
## Documentation

File diff suppressed because it is too large Load Diff

View File

@@ -10,6 +10,7 @@ from artemis.utils.path_utils import DATA_DIR
from artemis.utils.network_utils import NetworkManager
from artemis.utils.generic_utils import generate_filter_query
from artemis.utils.path_utils import normalize_dialog_path
from artemis.utils.config_utils import CONFIGURE_QT
from artemis.ui.preferences import UIPreferences
from artemis.ui.dbmanager import UIdbmanager
@@ -69,6 +70,8 @@ class UIArtemis(QObject):
self.network_manager = NetworkManager(self)
self.autoload_db()
def _connect(self):
# QML > Python connections
@@ -331,6 +334,13 @@ class UIArtemis(QObject):
self.cateditor.load_cateditor_ui()
def autoload_db(self):
sig_id_path = DATA_DIR / 'SigID' / Constants.SQL_NAME
autoload = CONFIGURE_QT.value("Database", "autoload", 0)
if sig_id_path.exists() and int(autoload):
self.load_db('SigID')
def dialog_popup(self, message_type, title, message):
""" Opens a general dialog popup

View File

@@ -12,6 +12,9 @@ class UIDownloader(QObject):
# Python > QML Signals
show_ui = Signal()
close_ui = Signal()
update_progress_bar = Signal(int, int)
update_status = Signal(str)
def __init__(self, parent):
super().__init__()
@@ -21,8 +24,6 @@ class UIDownloader(QObject):
self._engine = QQmlApplicationEngine()
self._engine.load('qrc:/ui/Downloader.qml')
self._window = self._engine.rootObjects()[0]
self._progress_bar = self._window.findChild(QObject, "progressBar")
self._label_progress = self._window.findChild(QObject, "labelProgress")
self._connect()
@@ -34,6 +35,8 @@ class UIDownloader(QObject):
# Python > QML connections
self.show_ui.connect(self._window.show)
self.close_ui.connect(self._window.close)
self.update_progress_bar.connect(self._window.updateProgressBar)
self.update_status.connect(self._window.updateStatus)
@Slot()
@@ -66,7 +69,7 @@ class UIDownloader(QObject):
""" Stop the download when user press abort button """
if self.reply:
self.reply.abort()
self._progress_bar.setProperty("value", 0)
self.update_progress_bar.emit(0, 0)
if self.file:
self.file.cancelWriting()
@@ -93,10 +96,10 @@ class UIDownloader(QObject):
if self.file:
self.file.commit()
self._label_progress.setProperty("text", "Checking DB integrity (SHA-256)")
self.update_status.emit("Checking DB integrity (SHA-256)")
if match_hash(self.dest_file, self._parent.network_manager.remote_db_hash):
self._label_progress.setProperty("text", "Unpacking archive...")
self.update_status.emit("Unpacking archive...")
delete_dir(DATA_DIR / 'SigID')
unpack_tar(self.dest_file, DATA_DIR / 'SigID')
delete_file(self.dest_file)
@@ -109,9 +112,8 @@ class UIDownloader(QObject):
""" Update progress bar and label
"""
total_bytes = self._parent.network_manager.remote_db_size
self._label_progress.setProperty("text", "{:.1f} Mb / {:.1f} Mb".format(bytesReceived/10**6, total_bytes/10**6))
self._progress_bar.setProperty("to", total_bytes)
self._progress_bar.setProperty("value", bytesReceived)
self.update_status.emit("{:.1f} Mb / {:.1f} Mb".format(bytesReceived/10**6, total_bytes/10**6))
self.update_progress_bar.emit(bytesReceived, total_bytes)
@Slot(QNetworkReply.NetworkError)

View File

@@ -9,6 +9,7 @@ class UIPreferences(QObject):
show_ui = Signal()
load_material_accent = Signal(str)
load_material_theme = Signal(str)
load_autoload = Signal(int)
def __init__(self, parent):
@@ -27,18 +28,21 @@ class UIPreferences(QObject):
# QML > Python connections
self._window.saveMaterialAccent.connect(self.save_material_accent)
self._window.saveMaterialTheme.connect(self.save_material_theme)
self._window.saveAutoload.connect(self.save_autoload)
# Python > QML connections
self.show_ui.connect(self._window.show)
self.load_material_accent.connect(self._window.loadMaterialAccent)
self.load_material_theme.connect(self._window.loadMaterialTheme)
self.load_autoload.connect(self._window.loadAutoload)
def load_preferences_ui(self):
""" Loading all the initial preferences from the conf file to the UI
"""
self.load_material_accent.emit(CONFIGURE_QT.get_or_default("Material", "Accent", "Green"))
self.load_material_theme.emit(CONFIGURE_QT.get_or_default("Material", "Theme", "System"))
self.load_material_accent.emit(CONFIGURE_QT.value("Material", "Accent", "Green"))
self.load_material_theme.emit(CONFIGURE_QT.value("Material", "Theme", "System"))
self.load_autoload.emit(int(CONFIGURE_QT.value("Database", "autoload", 0)))
self.show_ui.emit()
@@ -54,3 +58,10 @@ class UIPreferences(QObject):
""" Saving material theme setting
"""
CONFIGURE_QT.set("Material", "Theme", material_theme)
@Slot(int)
def save_autoload(self, autoload):
""" Saving autoload setting
"""
CONFIGURE_QT.set("Database", "autoload", str(autoload))

View File

@@ -6,7 +6,7 @@ from artemis.utils.sys_utils import copy_file
class Config(ConfigParser):
""" Custom configuration class derived from ConfigParser.
Used to get, set, save and remove any configuration from the conf file
Used to get value, set, save and remove any configuration from the conf file
"""
def __init__(self, config_file_path, space_around_delimiters=False):
@@ -15,11 +15,13 @@ class Config(ConfigParser):
self.read(self._config_file_path)
self._space_around_delimiters = space_around_delimiters
def get_or_default(self, section, option, default_value):
value = super().get(section, option)
return value if value else default_value
def value(self, section, option, default_value):
value = super().get(section, option, fallback=default_value)
return value
def set(self, section, option, value=None):
if not self.has_section(section):
self.add_section(section)
super().set(section, option, value)
self.save()
@@ -32,10 +34,42 @@ class Config(ConfigParser):
self.write(f, space_around_delimiters=self._space_around_delimiters)
if not (PREFERENCES_DIR / 'qtquickcontrols2.conf').exists():
copy_file(
BASE_DIR / 'config' / 'qtquickcontrols2.conf',
PREFERENCES_DIR / 'qtquickcontrols2.conf'
)
def merge_config_files(old_config_path, template_config_path):
""" Merge two configuration files: if the old one lacks some
sections or options from a comparison with a template,
this function will add what is missing to the old conf file
"""
old_config = ConfigParser()
old_config.read(old_config_path)
new_config = ConfigParser()
new_config.read(template_config_path)
for section in new_config.sections():
if not old_config.has_section(section):
old_config.add_section(section)
for option in new_config.options(section):
if not old_config.has_option(section, option):
old_config.set(section, option, new_config.get(section, option))
with open(old_config_path, 'w') as f:
old_config.write(f)
def check_conf_file():
""" Check the integrity of the used conf file.
If it is not present it will add a copy to the PREF_DIR
and if it is different in structure (different section/options)
it will merge the conf file with the new template one
"""
active_conf = (PREFERENCES_DIR / 'qtquickcontrols2.conf').resolve()
template_conf = (BASE_DIR / 'config' / 'qtquickcontrols2.conf').resolve()
if not active_conf.exists():
copy_file(template_conf, active_conf)
else:
merge_config_files(active_conf, template_conf)
check_conf_file()
CONFIGURE_QT = Config((PREFERENCES_DIR / 'qtquickcontrols2.conf').resolve().as_posix())

View File

@@ -10,7 +10,7 @@ class Constants():
APPLICATION_NAME = 'Artemis'
ORGANIZATION_NAME = 'AresValley'
ORGANIZATION_DOMAIN = 'aresvalley.com'
APPLICATION_VERSION = '4.0.0'
APPLICATION_VERSION = '4.0.3'
SQL_NAME = 'data.sqlite'

View File

@@ -21,7 +21,7 @@ def _app_dir():
elif is_linux():
app_dir_path = Path.home() / '.local' / 'share' / Constants.ORGANIZATION_NAME / Constants.APPLICATION_NAME
else:
app_dir_path = BASE_DIR
app_dir_path = BASE_DIR.resolve()
if not app_dir_path.exists():
app_dir_path.mkdir(parents=True)

View File

@@ -5,10 +5,10 @@ from artemis.utils.config_utils import CONFIGURE_QT
def set_ui():
os.environ['QT_QUICK_CONTROLS_STYLE'] = CONFIGURE_QT.get_or_default('Controls', 'style', 'Material')
os.environ['QT_QUICK_CONTROLS_MATERIAL_VARIANT'] = CONFIGURE_QT.get_or_default('Material', 'variant', 'Dense')
os.environ['QT_QUICK_CONTROLS_MATERIAL_THEME'] = CONFIGURE_QT.get_or_default('Material', 'theme', 'System')
os.environ['QT_QUICK_CONTROLS_MATERIAL_ACCENT'] = CONFIGURE_QT.get_or_default('Material', 'accent', 'Green')
os.environ['QT_QUICK_CONTROLS_STYLE'] = CONFIGURE_QT.value('Controls', 'style', 'Material')
os.environ['QT_QUICK_CONTROLS_MATERIAL_VARIANT'] = CONFIGURE_QT.value('Material', 'variant', 'Dense')
os.environ['QT_QUICK_CONTROLS_MATERIAL_THEME'] = CONFIGURE_QT.value('Material', 'theme', 'System')
os.environ['QT_QUICK_CONTROLS_MATERIAL_ACCENT'] = CONFIGURE_QT.value('Material', 'accent', 'Green')
if is_windows():
os.environ['QSG_RHI_BACKEND'] = 'opengl'

View File

@@ -13,13 +13,21 @@ python -m nuitka app.py \
--show-modules \
--assume-yes-for-downloads \
--enable-plugin=pyside6 \
--force-stderr-spec="{TEMP}/artemis.err.log" \
--force-stdout-spec="{TEMP}/artemis.out.log" \
--include-qt-plugins=sensible,styles,qml,multimedia \
--noinclude-dlls=libQt6Charts* \
--noinclude-dlls=libQt6Quick3D* \
--noinclude-dlls=libQt6Sensors* \
--noinclude-dlls=libQt6Test* \
--noinclude-dlls=libQt6WebEngine* \
--include-qt-plugins=sensible \
--include-qt-plugins=styles \
--include-qt-plugins=qml \
--include-qt-plugins=multimedia \
--include-data-files=./artemis/resources.py=./artemis/resources.py \
--include-data-files=./config/qtquickcontrols2.conf=./config/qtquickcontrols2.conf \
--include-data-files=./building/Linux/create_shortcut.sh=./create_shortcut.sh \
--include-data-files=./images/artemis_icon.svg=./images/artemis_icon.svg
--include-data-files=./images/artemis_icon.svg=./images/artemis_icon.svg \
--force-stderr-spec="{TEMP}/artemis.err.log" \
--force-stdout-spec="{TEMP}/artemis.out.log"
chmod 755 ./app.dist/app.bin

View File

@@ -12,15 +12,23 @@ python -m nuitka app.py `
--assume-yes-for-downloads `
--windows-console-mode=disable `
--enable-plugin=pyside6 `
--force-stderr-spec="{TEMP}\artemis.err.log" `
--force-stdout-spec="{TEMP}\artemis.out.log" `
--include-qt-plugins=sensible,styles,qml,multimedia `
--noinclude-dlls="Qt6Charts*" `
--noinclude-dlls="Qt6Quick3D*" `
--noinclude-dlls="Qt6Sensors*" `
--noinclude-dlls="Qt6Test*" `
--noinclude-dlls="Qt6WebEngine*" `
--include-qt-plugins=sensible `
--include-qt-plugins=styles `
--include-qt-plugins=qml `
--include-qt-plugins=multimedia `
--include-data-files=.\artemis\resources.py=.\artemis\resources.py `
--include-data-files=.\config\qtquickcontrols2.conf=.\config\qtquickcontrols2.conf `
--force-stderr-spec="{TEMP}\artemis.err.log" `
--force-stdout-spec="{TEMP}\artemis.out.log" `
--windows-company-name=Aresvalley.com `
--windows-product-name=Artemis `
--windows-file-version=4.0.0 `
--windows-product-version=4.0.0 `
--windows-file-version=4.0.3 `
--windows-product-version=4.0.3 `
--windows-file-description=Artemis `
--windows-icon-from-ico=images\artemis_icon.ico

View File

@@ -1,5 +1,5 @@
#define MyAppName "Artemis"
#define MyAppVersion "4.0.0"
#define MyAppVersion "4.0.3"
#define MyAppPublisher "AresValley"
#define MyAppURL "https://www.aresvalley.com/"
#define MyAppExeName "artemis.exe"
@@ -18,7 +18,7 @@ LicenseFile=..\..\LICENSE
PrivilegesRequiredOverridesAllowed=dialog
OutputDir=..\
OutputBaseFilename=Artemis
SetupIconFile=..\..\images\artemis_icon.ico
SetupIconFile=..\..\images\installer_icon.ico
Compression=lzma2/ultra64
SolidCompression=yes
VersionInfoVersion={#MyAppVersion}

View File

@@ -23,6 +23,6 @@ python -m nuitka app.py \
--macos-app-name=Artemis \
--macos-app-mode=gui \
--macos-sign-identity=ad-hoc \
--macos-app-version=4.0.0
--macos-app-version=4.0.3
echo "Building Linux target finished."

View File

@@ -5,3 +5,6 @@ style=Material
variant=Dense
theme=System
accent=Green
[Database]
autoload=0

View File

@@ -6,10 +6,10 @@
"total_bytes": 244449280
},
"windows": {
"version": "4.0.0"
"version": "4.0.1"
},
"linux": {
"version": "4.0.0"
"version": "4.0.1"
},
"mac": {
"version": "4.0.0"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 810 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

View File

@@ -12,65 +12,3 @@ Artemis is maintained by Marco Dalla Tiezza and released under the [GPLv3](https
* [**Eric Wiessner (KI7POL)**](https://github.com/WheezyE "GitHub profile") - *ARM port (Raspberry Pi3B+ and Pi4B)*
* [**Pierpaolo Pravatto**](https://github.com/ppravatto "GitHub profile") - *Wiki page, β Tester*
* [**Francesco Capostagno**](https://github.com/fcapostagno "GitHub profile"), **Luca**, **Pietro** - *β Tester*
## Donators
* Eric Hahn
* Alan Lawrence
* Diego Gil Fernandez
* Torsten Teichert
* Charles Preston
* Brad Hein
* Paolo Romani
* Michelle Corbani
* Martin van Duinen
* Valentino Zardi
* Emmanuel Fabre
* Oscar Nilsson
* Pierre Declercq
* Detlef Jahn
* Oliver Schellenberg
* Stephane Imbertone
* Roel Ketelaars
* Timothy Ehrhart
* George Mager
* Gerhard Amon
* Gerald Schmidt
* Carlos Rocha
* Joshua Frohberg
* Bill Riches
* Jeffrey Krehbiel
* Володимир Багмет
* Philip Hamlin
* David Davies
* Nigel P. Lawrence
* Marco Rissi (PP5ZX)
* Martin van Duinen
* Alex Diamantopulo
* Joseph Winter
* Mark Bender
* Rolf Gerhardt
* Denese Harris
* Benjamin Steele
* Alexander Irmscher
* Jonathan Chang
* Torsten Lipke
* Massimo Petrantoni
* William Arcand
* Jon Carp
* Robert Crone
* William Houston
* Richard Quasne
* Tom Krugliakov
* Francisco Neira Basso
* Alistair Macrae
* Kevin Arburn
* Marek Barłóg
* Gabriel Glösmann
* Corbin Williams
* Ton Machielsen
* Ivan Rancic
* Alipio Fernandez
* Matt Eisele
* Martin Dudel
* Harald Geier

View File

@@ -9,3 +9,7 @@ title: Documentation
</p>
**Artemis** is a software designed to assist **radio frequency (RF) signal identification and storage**. It simplifies real-time spectrum analysis by leveraging one of the most extensive and community-driven databases, containing nearly **500 recognized signals**. This comprehensive software solution allows users to collect RF signals with specific parameters such as frequency, bandwidth, modulation, etc. Users can also store spectrum waterfalls, audio samples, and all types of documents for future reference. Artemis provides a robust platform to manage a wide range of RF data with precision and ease.
<p align="center" markdown>
[Artemis Homepage](https://www.aresvalley.com){ .md-button }
</p>

View File

@@ -12,7 +12,12 @@
---
## :simple-linux: Linux
1. Download `Artemis-Linux-x86_64-4.x.x.tar` in the Assets menu from the [:material-download: LATEST RELEASE](https://github.com/AresValley/Artemis/releases) and extract the tarball archive in a folder of your choice and run the executable `app.bin`.
1. Download `Artemis-Linux-x86_64-4.x.x.tar` in the Assets menu from the [:material-download: LATEST RELEASE](https://github.com/AresValley/Artemis/releases) and extract the tarball archive in a folder of your choice.
2. Before running `app.bin`, be sure to have the executable permissions to the binary file with:
```
chmod 700 app.bin
```
### Create a Shortcut
@@ -38,5 +43,5 @@ The support for the macOS compiled version of the program is temporarily limited
* **Run the program directly from the source:** Follow the instructions provided in [this chapter](run_from_source.md) to launch the program from the source code.
* **Compile the Artemis 4 binaries on your machine:** In this case, you can contribute by reporting any issues you encounter by [opening an Issue](https://github.com/AresValley/Artemis/issues).
* **Use the last available compiled version (3.2.1):** Although this version is no longer officially supported, it remains available for use: [:material-download: Artemis-3.2.1.dmg](https://aresvalley.com/download/11/).
* **Use the last available compiled version (3.2.1):** Although this version is no longer officially supported, it remains available for use: [:material-download: Artemis-3.2.1.dmg](https://www.aresvalley.com/?sdm_process_download=1&download_id=377).

View File

@@ -5,8 +5,21 @@
## 1. Kp Index
The **K index** is a number (from 0 to 9) that shows how much Earth's magnetic field is disturbed. A K index of 1 means things are calm, while a K index of 5 or higher indicates a geomagnetic storm. These disturbances are measured with magnetometers that track changes in Earth's magnetic field every three hours. The K itself comes from a German word "Kennziffer" meaning "characteristic digit". To get a big picture of what's happening around the world, an official planetary **Kp index** is calculated. This is done by averaging the K indices from a special network of 13 geomagnetic observatories located around the globe at mid-latitudes.
## 2. A Index
The **A index** represents the three-hourly equivalent amplitude of geomagnetic activity at a specific magnetometer station, derived from the station-specific K index. Due to the quasi-logarithmic nature of the K-scale in relation to magnetometer fluctuations, directly averaging a set of K indices is not really meaningful. Instead each K is converted back into a linear scale. The **Ap index** is determined by averaging the eight daily A values, providing a measure of geomagnetic activity for a specific day. Days with higher levels of geomagnetic activity correspond to higher daily Ap values.
|Index|Activity Level|High Latitudes|Low Latitudes|Possible Source|
|-|-|-|-|-|
|**Kp 0**|Inactive|Weak & slow aurora possible|Aurora extremely unlikely|Small influx of particles due to some reconnections mostly at the magnetotail|
|**Kp 1**|Very Quiet|Weak & slow aurora likely|Aurora very unlikely|Vide supra|
|**Kp 2**|Quiet|Moderate auroral display|Aurora unlikely|Vide supra|
|**Kp 3**|Unsettled|Active auroral display, sporadic substorm possible|Weak aurora display possible|Coronal hole sending fast winds or remains after days of storming, enhanced solar wind|
|**Kp 4**|Active|Active auroral display, multiple sporadic substorms possible|Weak Aurora Display Possible|Vide supra|
|**Kp 5**|Minor Storm (G1)|Very active auroral display, multiple substorms likely|Aurora display likely|Coronal hole sending fast winds or coronal mass ejection (CME), enhanced solar wind|
|**Kp 6**|Moderate Storm (G2)|Strong auroral display, longer substorms|Active auroral display very likely|Vide supra|
|**Kp 7**|Strong Storm (G3)|Very strong auroral display|Strong auroral display extremely likely|Large CMEs caused by solar storms or flares, very enhanced solar wind with strong shock wave|
|**Kp 8**|Severe Storm (G4)|Extremely strong aurora, long periods of substorming|Strong auroral display extremely likely|Vide supra|
|**Kp 9**|Extreme Storm (G5)|Extremely strong aurora, long periods of substorming|Very strong auroral display, overhead aurora possible|Super CMEs, Carrington-class events, devastating solar wind with extreme shock waves|
## 2. Ap Index
The **A index** represents the three-hourly equivalent amplitude of geomagnetic activity at a specific magnetometer station, derived from the station-specific K index. Due to the quasi-logarithmic nature of the K-scale in relation to magnetometer fluctuations, directly averaging a set of K indices is not really meaningful. Instead each K is converted back into a linear scale. The **Ap index** is determined by averaging the eight daily Ap values (3-hour) and using the same stations grid explained for the Kp index in the previous section. This provides a measure of geomagnetic activity for a specific day. Days with higher levels of geomagnetic activity correspond to higher daily Ap values.
## 3. NOAA Space Weather Scale

BIN
images/installer_icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

View File

@@ -82,18 +82,6 @@ Window {
}
}
function contentChanged() {
if (listView.currentIndex !== -1) {
myModel.set(
listView.currentIndex,
{
'name': nameField.text,
'description': descriptionField.text,
}
)
}
}
function lockMenu(toggle) {
if (toggle) {
openButton.enabled = false
@@ -236,16 +224,18 @@ Window {
}
}
ScrollView {
Layout.fillHeight: true
Flickable {
Layout.fillWidth: true
ScrollBar.vertical.interactive: true
TextArea {
Layout.fillHeight: true
TextArea.flickable: TextArea {
id: newDescriptionField
placeholderText: qsTr("Description")
font.pointSize: 10
wrapMode: TextEdit.WordWrap
}
ScrollBar.vertical: ScrollBar {
width: 10
}
}
}
@@ -293,16 +283,18 @@ Window {
}
}
ScrollView {
Layout.fillHeight: true
Flickable {
Layout.fillWidth: true
ScrollBar.vertical.interactive: true
TextArea {
Layout.fillHeight: true
TextArea.flickable: TextArea {
id: editDescriptionField
placeholderText: qsTr("Description")
font.pointSize: 10
wrapMode: TextEdit.WordWrap
}
ScrollBar.vertical: ScrollBar {
width: 10
}
}
}
@@ -446,9 +438,7 @@ Window {
id: nameField
Layout.fillWidth: true
placeholderText: qsTr("Name")
onTextChanged: {
contentChanged()
}
readOnly: true
}
TextField {
@@ -458,18 +448,18 @@ Window {
readOnly: true
}
ScrollView {
Flickable {
Layout.fillWidth: true
Layout.fillHeight: true
ScrollBar.vertical.interactive: true
TextArea {
TextArea.flickable: TextArea {
id: descriptionField
wrapMode: TextEdit.WordWrap
placeholderText: qsTr("Description")
readOnly: true
font.pointSize: 10
onTextChanged: {
contentChanged()
}
wrapMode: TextEdit.WordWrap
}
ScrollBar.vertical: ScrollBar {
width: 10
}
}

View File

@@ -4,6 +4,7 @@ import QtQuick.Controls
import QtQuick.Controls.Material
import QtQuick.Layouts
Window {
id: windowDownloader
@@ -23,6 +24,15 @@ Window {
signal onAbort()
function updateProgressBar(bytesReceived, bytesTotal) {
progressBar.value = bytesReceived
progressBar.to = bytesTotal
}
function updateStatus(arg) {
progressLabel.text = arg
}
Page {
id: page
anchors.fill: parent
@@ -37,17 +47,19 @@ Window {
}
ProgressBar {
objectName: "progressBar"
id: progressBar
Layout.rightMargin: 20
Layout.leftMargin: 20
Layout.fillWidth: true
value: 0
to: 0
}
Label {
objectName: "labelProgress"
id: progressLabel
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
}
Button {
text: qsTr("Abort")
icon.source: "qrc:/images/icons/abort.svg"

View File

@@ -23,10 +23,12 @@ Window {
signal saveMaterialAccent(string arg)
signal saveMaterialTheme(string arg)
signal saveAutoload(int arg)
function saveAll() {
saveMaterialAccent(comboBoxAccent.currentText)
saveMaterialTheme(comboBoxTheme.currentText)
saveAutoload(checkBoxAutoload.checked)
}
function loadMaterialAccent(accent) {
@@ -47,6 +49,14 @@ Window {
}
}
function loadAutoload(toggle) {
if (toggle) {
checkBoxAutoload.checked = true
} else {
checkBoxAutoload.checked = false
}
}
DialogMessage {
id: dialogPreferencesSaved
modal: true
@@ -132,6 +142,21 @@ Window {
}
}
RowLayout {
Layout.fillWidth: true
Label {
text: "Auto-load SigID Database on Startup"
font.pixelSize: 12
clip: true
Layout.fillWidth: true
}
CheckBox {
id: checkBoxAutoload
}
}
Item {
Layout.fillHeight: true
}

View File

@@ -154,17 +154,18 @@ Window {
}
}
ScrollView {
Flickable {
Layout.fillWidth: true
Layout.topMargin: 5
Layout.fillHeight: true
ScrollBar.vertical.interactive: true
TextArea {
Layout.topMargin: 5
TextArea.flickable: TextArea {
id: paramDescription
placeholderText: qsTr("Description")
wrapMode: TextEdit.WordWrap
font.pointSize: 10
wrapMode: TextEdit.WordWrap
}
ScrollBar.vertical: ScrollBar {
width: 10
}
}

View File

@@ -274,7 +274,6 @@ Page {
Layout.fillWidth: true
}
RowLayout {
width: 100
height: 100
@@ -573,18 +572,23 @@ Page {
}
}
ScrollView {
Flickable {
Layout.fillWidth: true
Layout.topMargin: 5
Layout.fillHeight: true
ScrollBar.vertical.interactive: true
TextArea {
Layout.topMargin: 5
TextArea.flickable: TextArea {
id: descriptionTextArea
placeholderText: qsTr("Description")
font.pointSize: 10
wrapMode: TextEdit.WordWrap
textFormat: Text.MarkdownText
font.pointSize: 10
readOnly: true
onLinkActivated: (link) => {
Qt.openUrlExternally(link)
}
}
ScrollBar.vertical: ScrollBar {
width: 10
}
}
}

View File

@@ -62,7 +62,7 @@ Item {
Layout.fillHeight: true
clip: true
Label {
text: qsTr("MAJOR STORM")
text: qsTr("STRONG STORM")
anchors.fill: parent
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
@@ -78,7 +78,7 @@ Item {
Layout.fillHeight: true
clip: true
Label {
text: qsTr("MINOR STORM")
text: qsTr("MODERATE STORM")
anchors.fill: parent
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
@@ -94,7 +94,7 @@ Item {
Layout.fillHeight: true
clip: true
Label {
text: qsTr("ACTIVE")
text: qsTr("ACTIVE-STORM")
anchors.fill: parent
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter

View File

@@ -58,7 +58,7 @@ Item {
topLeftRadius: 10
topRightRadius: 10
Label {
text: qsTr("SUPER STORM")
text: qsTr("EXTREME STORM")
anchors.fill: parent
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
@@ -74,7 +74,7 @@ Item {
Layout.fillHeight: true
clip: true
Label {
text: qsTr("EXTREME STORM")
text: qsTr("SEVERE STORM")
anchors.fill: parent
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
@@ -90,7 +90,7 @@ Item {
Layout.fillHeight: true
clip: true
Label {
text: qsTr("SEVERE STORM")
text: qsTr("STRONG STORM")
anchors.fill: parent
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
@@ -106,7 +106,7 @@ Item {
Layout.fillHeight: true
clip: true
Label {
text: qsTr("MAJOR STORM")
text: qsTr("MODERATE STORM")
anchors.fill: parent
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter