diff --git a/CHANGELOG.md b/CHANGELOG.md
index 444887c..12d2132 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,12 @@
### Added
- Created a setting panel for the audio player
- Selection of the audio output device. Closes [#4](https://github.com/AresValley/Artemis/issues/4)
+- Added the following (advanced) products to the space weather module [#53](https://github.com/AresValley/Artemis/issues/53):
+ - Sun Synoptic Analysis (SAS)
+ - GOES Solar Ultraviolet Imager (SUVI), all wavelenght (94 Å, 131 Å, 171 Å, 195 Å, 284 Å, 304 Å)
+ - GOES Thematic Map (from SUVI)
+ - Large Angle and Spectrometric Coronagraph (LASCO), both C2/C3 optical imaging of the Sun’s corona
+ - Helioseismic and Magnetic Imager (HMI): Magnetogram, Intensitygram, Dopplergram (TODO)
### Fixed
- Fixed margins for downloader window
diff --git a/artemis.qrc b/artemis.qrc
index df0a67f..4973397 100644
--- a/artemis.qrc
+++ b/artemis.qrc
@@ -41,6 +41,8 @@
ui/SpaceWeatherForecastPage.qml
ui/SpaceWeatherDRAPPage.qml
ui/SpaceWeatherAuroraPage.qml
+ ui/SpaceWeatherSSA.qml
+ ui/SpaceWeatherSunImagers.qml
ui/About.qml
diff --git a/artemis/resources.py b/artemis/resources.py
index dbfae83..5317984 100644
--- a/artemis/resources.py
+++ b/artemis/resources.py
@@ -1,6 +1,6 @@
# Resource object code (Python 3)
# Created by: object code
-# Created by: The Resource Compiler for Qt version 6.7.1
+# Created by: The Resource Compiler for Qt version 6.7.2
# WARNING! All changes made in this file will be lost!
from PySide6 import QtCore
@@ -6023,43 +6023,45 @@ Text\x0d\x0a \
.WordWrap\x0d\x0a \
}\x0d\x0a }\x0d\x0a}\x0d\x0a\
\
-\x00\x00\x02*\
+\x00\x00\x02M\
\x00\
-\x00\x08\x87x\xda\xbdUQk\xdb0\x10~\x0f\xe4?\
-\x88>\xb5\x0f\xd3\xd2\xc2\x18\x18\xfa\x90f\x8c\x15ZH\
-\x97B\x9e\x15\xfb\x1c\x8b\xca\x92'\x9dI\xb2\xe1\xff>\
-\xc9\xb2\x12\xdbq\xb6\xa5\xa3\x15y\x90\xee\xbe\xbb\xfb\xee\
-\xf4Y\xe1y\xa14\x92'|*y\xfc2\x1e\xf1\xce\
-\x99.\xb9L\xd4\xe6\xc8\
-2\x04\xcd\x998B<\xb0\x9d*\xd1F\x8eG>9\
-\xf95\x1e\x11\xbbx\x12\x91MmY\x14,\x86%0\
-\xcc@;\x9c\xf3nx\x82YD\xae'\x93\x897d\
-\xc0\xd7\x19F\xe4\xb33x\xd3L\xd9R\x12$R%\
-\xdd^\x00\x82M\xda\xe4wkKn\xc9\x22\xd6\x00\x92\
-\xd6\x09\xc9GrC>\x90\xfd\xfe\x80\xdc\x1d\x90\xbeR\
-\x03=\x1c<\xb6\x0a\xc5s\x950\xc1q\x17\xd9N\xe9\
-\xb4(\x04\x8f\x19r%\x1f\x9d\xddCR\xc1\xd6\xa6\xf6\
-\x87\xb1z;r\x14\x10\x91\x1f\xe6Y_^L5B\
-\xce\x8d-U\x8f\x814s\xb8\xb8\x0a\xe8\xb4\x94\xb1K\
-L\xca\x22\xb1C\xbeS\x88*\xbfc\xfa2\x07c\xd8\
-\x1a\xae\xda\x0d\x1b\x97c\x0f\xa1\x08[\xb4\x8d5\xc8V\
-\x07~;\xb7\xc6v4\x93q\xa6\xb4\xa1)\x17\x22\x22\
-\x05\xd3v\xb6\x01[SQ\xca\xderD\x1e\xd8\x0aD\
-;0\xdcg\xb7|\xd7\x9fZ\xa9\xd0\x82oA,\xf8\
-O\xdb\xfe\xf5M\xd7/ \xc59K\x12.\xd7\x11\xf9\
-\xd4\xf5iw\x09\xa7\x9c\xab\xba\xde\x90\xb7j\x93\x9f)\
-Q\xe6\xd2\xcb\xb1\xcf\xfdo\x8d\xbb\xf5\xccV\xb6\xa7~\
-d\xe8\x1ck\xef\xb1\xaf\xd1\xb1O\xe9Ex\x0c\xf2\xa4\
-\xea\xeaK\x8fG]B\x9f@ Q\xdav\xe5\x10\x8f\
-Z[\xf6\xc6\x83\xb4f\xa5vU\x9d\x94\xfa\xb0\xea?\
-S\x7fU\x1abf\xd0\xbcE\xf2/\xdf\xa7\xf3\xb7\xc8\
-;-\xb5\xd2\xec\x1f2W\xfd\xd1/\x90\xc5/\xc3\xd2\
-q+\xf6\x83\xbe\x97\x09l\x83\x14h\xdb\xf8\xc7+\xff\
-\xd6\xbcl\xfe\xce_\xaf\x8d{\xfb\x90\x9c\x1aC\xfb\x89\
-md\xd1\xff\xf8\x87Tm\x86\xc3\x86\x83\xaa\xc1\xb9\xbe\
-\x9eg\xd0\xd8\xb9D\xdbq\xef\xc3\xd4\x09\xf6\x5c\x96!\
-\xe6}\x18z\xe9\x9f\xcb\xf1\x10u\x0e\xcb\x13\xc7j\xff\
-\xf7c\x7f\xbf\x01\x0fJ\x0a\x01\
+\x00\x0a{x\xda\xbdVQo\xda0\x10~G\xe2?\
+X}j\x1f\x96\xd1J\xd3\xa4H}\xa0L\xd3\x90Z\
+\x89.\x95\xfal\x92\x03\xac:vf\x9f\x05l\xca\x7f\
+\x9f\x1d\xc7\x10B\xd8\x96N`\xf1\x90\xdc}w\xf7\xdd\
+\xf9\xb3\x03\xcb\x0b\xa9\x90<\xe3\xb3a\xe9\xdbp\xc0\x0e\
+\xde\xa3W&2\xb9>2O\xa4@%\xb9>\xe9\x88\
+\x9e(\x82b\x94\x1f!\x1e\xe9V\x1a\xb4\x91\xc3\x81O\
+N~\x0d\x07\xc4.\x96\xc5d]Y\x92\x82\xa6\xf0\x0a\
+\x14W\xa0\x1c\xcey\xd7,\xc3ULnG\xa3\x917\
+\xac\x80-W\x18\x93\xcf\xce\xe0M\x13iK\x09\x10\x18\
+I\xe1\x9e9 \xd8\xa4u~\xb76\xe4\x9e$\xa9\x02\
+\x10Q\x95\x90|$w\xe4\x03\xd9=\xef\x91\xdb=\xd2\
+W\xaa\xa1\xfb\x17\x8f-C\xf1\x5cf\x943\xdc\xc6\xb6\
+\xd3h\x5c\x14\x9c\xa5\x14\x99\x14O\xce\xee!\x0bN\x97\
+\xba\xf2\x87\xb1z;2\xe4\x10\x93\x1f\xfaE]_\x8d\
+\x15B\xce\xb4-U\x8d\x81\xd4s\xb8\xba\x09\xe8\x85\x11\
+\xa9KLL\x91\xd9!?HD\x99?Pu\x9d\x83\
+\xd6t\x097\xcd\x86\xb5\xcb\xb1\x83D\x08\x1b\xb4\x8d\xd5\
+\xc8F\x07\xfeqf\x8d\xcdh*\xd2\x95T:Z0\
+\xcecRPeg\x1b\xb0\x15\x15)\xed.\xc7\xe4\x91\
+\xce\x817\x03\xc3~\x1e\x96?\xf4/\xacT\xa2\x82m\
+\x80'\xec\xa7m\xff\xf6\xee\xd0\xcfa\x813\x9aeL\
+,c\xf2\xe9\xd0\xa7\xdc&\x9cr\xce\xabz]\xde\xb2\
+I~\x22\xb9\xc9\x85\x97c\x9b\xfb\xdf\x1aw\xeb\x85\xce\
+mO\xed\xc8\xd09V\xdec_\xadc\x9f\xd2\x8b\xf0\
+\x18\xe4IU\xd5_=\x1e\x95\x816\x81@\xc2\xd8v\
+E\x17\x8fJ[v\xc7\x83\xb4&F\xb9\xaaNJm\
+X\xf9\x9f\xa9\xbfJ\x05)\xd5\xa8\xcf\x91\xfc\xcb\xf7\xf1\
+\xec\x1cy\xc7FIE\xcf\x919I\xc6gIk\x04\
+\x99\xe6\xf6\x90\xaa\x7f\x99s\xd9\x16L\x824}\xeb\x16\
+\xbc[\xa9\x97\xc7Td\xb0\x09\x02\x8e\x9a\xc6?\x0a\xf5\
+[}\x1f{\xa5\xbe_\xd1S{\xfd\x9d\x9aE\xf3\xc3\
+P\x8b\xb9}eu\x9dE\xdd\x1d\xd6\x1dTv\xce\xf5\
+\xfd<\xc3\xc9\xe8K\xb4\x19w\x19\xa6\xee\x98\xf5e\x19\
+b.\xc3\xd0\x1f\xd8\xbe\x1c\xf7Q\x97ai\x0f\x7f\x1f\
+z\x16~!^F\xd4\x97G/z\xbb\xa8>,O\
+\xbc\x96\xbb\xbf\x1c\xf6\xf7\x1b\xfa\xe8n|\
\x00\x00\x08\xee\
\x00\
\x00[Ux\xda\xed\x5cms\xdb6\x12\xfe\xde\x99\xfe\
@@ -6404,6 +6406,158 @@ Mode: Image.Pres\
erveAspectFit\x0d\x0a \
}\x0d\x0a }\x0d\
\x0a}\x0d\x0a\
+\x00\x00\x09W\
+i\
+mport QtQuick\x0d\x0ai\
+mport QtQuick.Wi\
+ndow\x0d\x0aimport QtQ\
+uick.Controls\x0d\x0ai\
+mport QtQuick.Co\
+ntrols.Material\x0d\
+\x0aimport QtQuick.\
+Layouts\x0d\x0a\x0d\x0a\x0d\x0aPag\
+e {\x0d\x0a id: spa\
+ceWeatherSunImag\
+ers\x0d\x0a anchors\
+.fill: parent\x0d\x0a\x0d\
+\x0a objectName:\
+ \x22spaceWeatherSu\
+nImagers\x22\x0d\x0a\x0d\x0a \
+ property var po\
+seidon_json\x0d\x0a\x0d\x0a \
+ function load\
+DrapReport(posei\
+don_data) {\x0d\x0a \
+ poseidon_js\
+on = poseidon_da\
+ta\x0d\x0a load\
+Image(poseidon_j\
+son['URL'][combo\
+BoxImageProduct.\
+currentValue.val\
+ue])\x0d\x0a }\x0d\x0a\x0d\x0a \
+ function load\
+Image(url) {\x0d\x0a \
+ checkUrlEx\
+ists(url, functi\
+on(exists) {\x0d\x0a \
+ if (ex\
+ists) {\x0d\x0a \
+ imageBo\
+x.source = url\x0d\x0a\
+ } el\
+se {\x0d\x0a \
+ imageBox.s\
+ource = \x22qrc:///\
+images/artemis_n\
+ot_available.svg\
+\x22\x0d\x0a }\
+\x0d\x0a })\x0d\x0a \
+ }\x0d\x0a\x0d\x0a funct\
+ion checkUrlExis\
+ts(url, callback\
+) {\x0d\x0a var\
+ xhr = new XMLHt\
+tpRequest()\x0d\x0a \
+ xhr.onready\
+statechange = fu\
+nction() {\x0d\x0a \
+ if (xhr.\
+readyState === X\
+MLHttpRequest.DO\
+NE) {\x0d\x0a \
+ callback(\
+xhr.status === 2\
+00)\x0d\x0a \
+ }\x0d\x0a }\x0d\x0a \
+ xhr.open(\
+\x22HEAD\x22, url, tru\
+e)\x0d\x0a xhr.\
+send()\x0d\x0a }\x0d\x0a\x0d\
+\x0a ColumnLayou\
+t {\x0d\x0a anc\
+hors.fill: paren\
+t\x0d\x0a ancho\
+rs.rightMargin: \
+10\x0d\x0a anch\
+ors.leftMargin: \
+10\x0d\x0a anch\
+ors.bottomMargin\
+: 10\x0d\x0a an\
+chors.topMargin:\
+ 10\x0d\x0a\x0d\x0a C\
+omboBox {\x0d\x0a \
+ id: combo\
+BoxImageProduct\x0d\
+\x0a tex\
+tRole: 'text'\x0d\x0a \
+ Layou\
+t.fillWidth: tru\
+e\x0d\x0a m\
+odel: ListModel\
+ {\x0d\x0a \
+ ListElement \
+{ text: \x22SUVI 94\
+ \xc3\x85\x22; value: \x22SU\
+VI_094\x22 }\x0d\x0a \
+ ListE\
+lement { text: \x22\
+SUVI 131 \xc3\x85\x22; va\
+lue: \x22SUVI_131\x22 \
+}\x0d\x0a \
+ ListElement {\
+ text: \x22SUVI 171\
+ \xc3\x85\x22; value: \x22SU\
+VI_171\x22 }\x0d\x0a \
+ ListE\
+lement { text: \x22\
+SUVI 195 \xc3\x85\x22; va\
+lue: \x22SUVI_195\x22 \
+}\x0d\x0a \
+ ListElement {\
+ text: \x22SUVI 284\
+ \xc3\x85\x22; value: \x22SU\
+VI_284\x22 }\x0d\x0a \
+ ListE\
+lement { text: \x22\
+SUVI 304 \xc3\x85\x22; va\
+lue: \x22SUVI_304\x22 \
+}\x0d\x0a \
+ ListElement {\
+ text: \x22LASCO C2\
+\x22; value: \x22LASCO\
+_C2\x22 }\x0d\x0a \
+ ListElem\
+ent { text: \x22LAS\
+CO C3\x22; value: \x22\
+LASCO_C3\x22 }\x0d\x0a \
+ Lis\
+tElement { text:\
+ \x22Thematic Map\x22;\
+ value: \x22SUVI_TH\
+EMATIC\x22 }\x0d\x0a \
+ }\x0d\x0a \
+ onActivate\
+d: {\x0d\x0a \
+ loadImage(\
+poseidon_json['U\
+RL'][comboBoxIma\
+geProduct.curren\
+tValue.value])\x0d\x0a\
+ }\x0d\x0a \
+ }\x0d\x0a\x0d\x0a \
+ Image {\x0d\x0a \
+ id: ima\
+geBox\x0d\x0a \
+ Layout.fillHe\
+ight: true\x0d\x0a \
+ Layout.f\
+illWidth: true\x0d\x0a\
+ fill\
+Mode: Image.Pres\
+erveAspectFit\x0d\x0a\x0d\
+\x0a }\x0d\x0a \
+}\x0d\x0a}\x0d\x0a\
\x00\x00\x04[\
\x00\
\x00\x12\x85x\xda\xddX_o\xdb6\x10\x7f/\xd0\xef\
@@ -6476,6 +6630,89 @@ b\xdb\xfa>\xa9xx\xc1r\xec\x83\xf5\x85\xa5\xe8\x0b\
\xc4_\xbb\xf1\xd85y\x87\x12\xa4\x98pf\xef\x13\xc3\
c\x81\xda\xdd\xee\xc3\xe4\xf0E\x22\x92\x05\x88\x10\xcb\xe6\
\x8c\xbb\x17~\xff\x06f\x1eq:\
+\x00\x00\x05\x01\
+i\
+mport QtQuick\x0d\x0ai\
+mport QtQuick.Wi\
+ndow\x0d\x0aimport QtQ\
+uick.Controls\x0d\x0ai\
+mport QtQuick.Co\
+ntrols.Material\x0d\
+\x0aimport QtQuick.\
+Layouts\x0d\x0a\x0d\x0a\x0d\x0aPag\
+e {\x0d\x0a id: spa\
+ceWeatherSSA\x0d\x0a \
+ anchors.fill: \
+parent\x0d\x0a\x0d\x0a ob\
+jectName: \x22space\
+WeatherSSA\x22\x0d\x0a\x0d\x0a \
+ function load\
+DrapReport(posei\
+don_data) {\x0d\x0a \
+ checkUrlExi\
+sts(poseidon_dat\
+a['URL']['SYNOPT\
+IC_MAP'], functi\
+on(exists) {\x0d\x0a \
+ if (ex\
+ists) {\x0d\x0a \
+ imageBo\
+x.source = posei\
+don_data['URL'][\
+'SYNOPTIC_MAP']\x0d\
+\x0a } e\
+lse {\x0d\x0a \
+ imageBox.\
+source = \x22qrc://\
+/images/artemis_\
+not_available.sv\
+g\x22\x0d\x0a \
+}\x0d\x0a })\x0d\x0a \
+ }\x0d\x0a\x0d\x0a func\
+tion checkUrlExi\
+sts(url, callbac\
+k) {\x0d\x0a va\
+r xhr = new XMLH\
+ttpRequest()\x0d\x0a \
+ xhr.onread\
+ystatechange = f\
+unction() {\x0d\x0a \
+ if (xhr\
+.readyState === \
+XMLHttpRequest.D\
+ONE) {\x0d\x0a \
+ callback\
+(xhr.status === \
+200)\x0d\x0a \
+ }\x0d\x0a }\x0d\x0a\
+ xhr.open\
+(\x22HEAD\x22, url, tr\
+ue)\x0d\x0a xhr\
+.send()\x0d\x0a }\x0d\x0a\
+\x0d\x0a ColumnLayo\
+ut {\x0d\x0a an\
+chors.fill: pare\
+nt\x0d\x0a anch\
+ors.rightMargin:\
+ 10\x0d\x0a anc\
+hors.leftMargin:\
+ 10\x0d\x0a anc\
+hors.bottomMargi\
+n: 10\x0d\x0a a\
+nchors.topMargin\
+: 10\x0d\x0a\x0d\x0a \
+Image {\x0d\x0a \
+ id: imageBo\
+x\x0d\x0a L\
+ayout.fillHeight\
+: true\x0d\x0a \
+ Layout.fillW\
+idth: true\x0d\x0a \
+ fillMode\
+: Image.Preserve\
+AspectFit\x0d\x0a \
+ }\x0d\x0a }\x0d\x0a}\x0d\x0a\
+\
\x00\x00\x0a\x18\
\x00\
\x00Xhx\xda\xed\x5cko\xdb:\x12\xfd^\xa0\xff\
@@ -7252,10 +7489,20 @@ qt_resource_name = b"\
\x00S\
\x00p\x00a\x00c\x00e\x00W\x00e\x00a\x00t\x00h\x00e\x00r\x00A\x00u\x00r\x00o\x00r\
\x00a\x00P\x00a\x00g\x00e\x00.\x00q\x00m\x00l\
+\x00\x1a\
+\x05\xbc\x12\x9c\
+\x00S\
+\x00p\x00a\x00c\x00e\x00W\x00e\x00a\x00t\x00h\x00e\x00r\x00S\x00u\x00n\x00I\x00m\
+\x00a\x00g\x00e\x00r\x00s\x00.\x00q\x00m\x00l\
\x00\x0f\
\x0e^\x1a\x9c\
\x00P\
\x00r\x00e\x00f\x00e\x00r\x00e\x00n\x00c\x00e\x00s\x00.\x00q\x00m\x00l\
+\x00\x13\
+\x06\xfb\xe9|\
+\x00S\
+\x00p\x00a\x00c\x00e\x00W\x00e\x00a\x00t\x00h\x00e\x00r\x00S\x00S\x00A\x00.\x00q\
+\x00m\x00l\
\x00\x0e\
\x08!D\x9c\
\x00S\
@@ -7289,7 +7536,7 @@ qt_resource_name = b"\
qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x11\x00\x00\x00\x1a\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x13\x00\x00\x00\x1a\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x0a\x00\x02\x00\x00\x00\x05\x00\x00\x00\x03\
\x00\x00\x00\x00\x00\x00\x00\x00\
@@ -7334,7 +7581,7 @@ qt_resource_struct = b"\
\x00\x00\x01r\x00\x00\x00\x00\x00\x01\x00\x01\x1c\x98\
\x00\x00\x01\x8f\xff^8P\
\x00\x00\x01\x96\x00\x00\x00\x00\x00\x01\x00\x01\x1d\x90\
-\x00\x00\x01\x90K\x1aN%\
+\x00\x00\x01\x90K\xe3\xbe\xa0\
\x00\x00\x01\xb4\x00\x00\x00\x00\x00\x01\x00\x01 F\
\x00\x00\x01\x8f\xff^8P\
\x00\x00\x01\x0e\x00\x00\x00\x00\x00\x01\x00\x01\x16\xe5\
@@ -7349,38 +7596,42 @@ qt_resource_struct = b"\
\x00\x00\x01\x8f\xff^8P\
\x00\x00\x036\x00\x01\x00\x00\x00\x01\x00\x01>\x85\
\x00\x00\x01\x90\x13\xddn\xea\
-\x00\x00\x05\xa2\x00\x00\x00\x00\x00\x01\x00\x01\xa1\x8a\
+\x00\x00\x05:\x00\x00\x00\x00\x00\x01\x00\x01\x8b>\
+\x00\x00\x01\x90LRx\x5c\
+\x00\x00\x06\x08\x00\x00\x00\x00\x00\x01\x00\x01\xb0\x0d\
\x00\x00\x01\x8f\xff^8P\
\x00\x00\x03l\x00\x01\x00\x00\x00\x01\x00\x01I\x06\
\x00\x00\x01\x8f\xff^8_\
-\x00\x00\x05\x80\x00\x00\x00\x00\x00\x01\x00\x01\x99\x96\
-\x00\x00\x01\x90J\xbe\xce\x04\
-\x00\x00\x03R\x00\x02\x00\x00\x00\x04\x00\x00\x00+\
+\x00\x00\x05\x98\x00\x00\x00\x00\x00\x01\x00\x01\x98\xf8\
+\x00\x00\x01\x90LO8\x08\
+\x00\x00\x05\xe6\x00\x00\x00\x00\x00\x01\x00\x01\xa8\x19\
+\x00\x00\x01\x90K\xe3\xbe\xa0\
+\x00\x00\x03R\x00\x02\x00\x00\x00\x04\x00\x00\x00-\
\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x04\xbe\x00\x01\x00\x00\x00\x01\x00\x01v\x08\
+\x00\x00\x04\xbe\x00\x01\x00\x00\x00\x01\x00\x01v+\
\x00\x00\x01\x90\x13\xdd\x17\xd4\
-\x00\x00\x05^\x00\x01\x00\x00\x00\x01\x00\x01\x8fz\
+\x00\x00\x05\xc4\x00\x01\x00\x00\x00\x01\x00\x01\x9d\xfd\
\x00\x00\x01\x90\x01\x93J\xb0\
-\x00\x00\x04\xe0\x00\x01\x00\x00\x00\x01\x00\x01~\xfa\
+\x00\x00\x04\xe0\x00\x01\x00\x00\x00\x01\x00\x01\x7f\x1d\
\x00\x00\x01\x90\x18\xf5\x014\
\x00\x00\x04B\x00\x01\x00\x00\x00\x01\x00\x01a\xf6\
\x00\x00\x01\x90\x13\xdd\x17\xd3\
\x00\x00\x04p\x00\x00\x00\x00\x00\x01\x00\x01n\x15\
\x00\x00\x01\x8f\xff^8P\
\x00\x00\x04\x98\x00\x01\x00\x00\x00\x01\x00\x01s\xda\
-\x00\x00\x01\x8f\xff^8P\
-\x00\x00\x05:\x00\x01\x00\x00\x00\x01\x00\x01\x8b\x1b\
+\x00\x00\x01\x90LRh&\
+\x00\x00\x05t\x00\x01\x00\x00\x00\x01\x00\x01\x94\x99\
\x00\x00\x01\x90\x1b[j\x99\
-\x00\x00\x05\x00\x00\x00\x00\x00\x00\x01\x00\x01\x85\xf2\
+\x00\x00\x05\x00\x00\x00\x00\x00\x00\x01\x00\x01\x86\x15\
\x00\x00\x01\x8f\xff^8P\
-\x00\x00\x05\xd6\x00\x01\x00\x00\x00\x01\x00\x01\xaa=\
+\x00\x00\x06<\x00\x01\x00\x00\x00\x01\x00\x01\xb8\xc0\
\x00\x00\x01\x8f\xff^8_\
-\x00\x00\x06\x1e\x00\x01\x00\x00\x00\x01\x00\x01\xb2U\
+\x00\x00\x06\x84\x00\x01\x00\x00\x00\x01\x00\x01\xc0\xd8\
\x00\x00\x01\x8f\xff^8_\
-\x00\x00\x05\xba\x00\x01\x00\x00\x00\x01\x00\x01\xa7:\
+\x00\x00\x06 \x00\x01\x00\x00\x00\x01\x00\x01\xb5\xbd\
\x00\x00\x01\x8f\xff^8_\
-\x00\x00\x05\xfa\x00\x01\x00\x00\x00\x01\x00\x01\xad\x00\
-\x00\x00\x01\x90K\x22\xa8\x89\
+\x00\x00\x06`\x00\x01\x00\x00\x00\x01\x00\x01\xbb\x83\
+\x00\x00\x01\x90K\xe3\xbe\xa0\
"
def qInitResources():
diff --git a/artemis/ui/spaceweather.py b/artemis/ui/spaceweather.py
index 7f3e521..7cf2623 100644
--- a/artemis/ui/spaceweather.py
+++ b/artemis/ui/spaceweather.py
@@ -13,6 +13,8 @@ class UIspaceweather(QObject):
load_poseidon_report = Signal(dict)
load_poseidon_forecast_report = Signal(dict)
load_poseidon_drap_report = Signal(dict)
+ load_poseidon_SSA_report = Signal(dict)
+ load_poseidon_sun_images_report = Signal(dict)
load_aurora_report = Signal()
update_bottom_bar = Signal(str)
@@ -30,6 +32,8 @@ class UIspaceweather(QObject):
self._window_forecast = self._window.findChild(QObject, "spaceWeatherForecastObj")
self._window_drap = self._window.findChild(QObject, "spaceWeatherDRAPObj")
self._window_aurora = self._window.findChild(QObject, "spaceWeatherAuroraObj")
+ self._window_SSA = self._window.findChild(QObject, "spaceWeatherSSA")
+ self._window_sun_images = self._window.findChild(QObject, "spaceWeatherSunImagers")
self._connect()
@@ -43,6 +47,8 @@ class UIspaceweather(QObject):
self.load_poseidon_report.connect(self._window_current.loadReport)
self.load_poseidon_forecast_report.connect(self._window_forecast.loadForecastReport)
self.load_poseidon_drap_report.connect(self._window_drap.loadDrapReport)
+ self.load_poseidon_SSA_report.connect(self._window_SSA.loadDrapReport)
+ self.load_poseidon_sun_images_report.connect(self._window_sun_images.loadDrapReport)
self.load_aurora_report.connect(self._window_aurora.loadAuroraReport)
@@ -62,6 +68,8 @@ class UIspaceweather(QObject):
self.load_poseidon_report.emit(poseidon_data)
self.load_poseidon_forecast_report.emit(poseidon_data)
self.load_poseidon_drap_report.emit(poseidon_data)
+ self.load_poseidon_sun_images_report.emit(poseidon_data)
+ self.load_poseidon_SSA_report.emit(poseidon_data)
self.load_aurora_report.emit()
self.update_bottom_bar.emit(
diff --git a/ui/SpaceWeather.qml b/ui/SpaceWeather.qml
index b9368e9..feb8996 100644
--- a/ui/SpaceWeather.qml
+++ b/ui/SpaceWeather.qml
@@ -56,6 +56,12 @@ Window {
TabButton {
text: qsTr("Aurora")
}
+ TabButton {
+ text: qsTr("SSA")
+ }
+ TabButton {
+ text: qsTr("Sun Imagers")
+ }
}
StackLayout {
@@ -86,6 +92,18 @@ Window {
id: spaceWeatherAuroraPage
}
}
+
+ Item {
+ SpaceWeatherSSA {
+ id: spaceWeatherSSA
+ }
+ }
+
+ Item {
+ SpaceWeatherSunImagers {
+ id: spaceWeatherSunImagers
+ }
+ }
}
}
}
diff --git a/ui/SpaceWeatherSSA.qml b/ui/SpaceWeatherSSA.qml
new file mode 100644
index 0000000..85881f5
--- /dev/null
+++ b/ui/SpaceWeatherSSA.qml
@@ -0,0 +1,49 @@
+import QtQuick
+import QtQuick.Window
+import QtQuick.Controls
+import QtQuick.Controls.Material
+import QtQuick.Layouts
+
+
+Page {
+ id: spaceWeatherSSA
+ anchors.fill: parent
+
+ objectName: "spaceWeatherSSA"
+
+ function loadDrapReport(poseidon_data) {
+ checkUrlExists(poseidon_data['URL']['SYNOPTIC_MAP'], function(exists) {
+ if (exists) {
+ imageBox.source = poseidon_data['URL']['SYNOPTIC_MAP']
+ } else {
+ imageBox.source = "qrc:///images/artemis_not_available.svg"
+ }
+ })
+ }
+
+ function checkUrlExists(url, callback) {
+ var xhr = new XMLHttpRequest()
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState === XMLHttpRequest.DONE) {
+ callback(xhr.status === 200)
+ }
+ }
+ xhr.open("HEAD", url, true)
+ xhr.send()
+ }
+
+ ColumnLayout {
+ anchors.fill: parent
+ anchors.rightMargin: 10
+ anchors.leftMargin: 10
+ anchors.bottomMargin: 10
+ anchors.topMargin: 10
+
+ Image {
+ id: imageBox
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ fillMode: Image.PreserveAspectFit
+ }
+ }
+}
diff --git a/ui/SpaceWeatherSunImagers.qml b/ui/SpaceWeatherSunImagers.qml
new file mode 100644
index 0000000..eb546b2
--- /dev/null
+++ b/ui/SpaceWeatherSunImagers.qml
@@ -0,0 +1,77 @@
+import QtQuick
+import QtQuick.Window
+import QtQuick.Controls
+import QtQuick.Controls.Material
+import QtQuick.Layouts
+
+
+Page {
+ id: spaceWeatherSunImagers
+ anchors.fill: parent
+
+ objectName: "spaceWeatherSunImagers"
+
+ property var poseidon_json
+
+ function loadDrapReport(poseidon_data) {
+ poseidon_json = poseidon_data
+ loadImage(poseidon_json['URL'][comboBoxImageProduct.currentValue.value])
+ }
+
+ function loadImage(url) {
+ checkUrlExists(url, function(exists) {
+ if (exists) {
+ imageBox.source = url
+ } else {
+ imageBox.source = "qrc:///images/artemis_not_available.svg"
+ }
+ })
+ }
+
+ function checkUrlExists(url, callback) {
+ var xhr = new XMLHttpRequest()
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState === XMLHttpRequest.DONE) {
+ callback(xhr.status === 200)
+ }
+ }
+ xhr.open("HEAD", url, true)
+ xhr.send()
+ }
+
+ ColumnLayout {
+ anchors.fill: parent
+ anchors.rightMargin: 10
+ anchors.leftMargin: 10
+ anchors.bottomMargin: 10
+ anchors.topMargin: 10
+
+ ComboBox {
+ id: comboBoxImageProduct
+ textRole: 'text'
+ Layout.fillWidth: true
+ model: ListModel {
+ ListElement { text: "SUVI 94 Å"; value: "SUVI_094" }
+ ListElement { text: "SUVI 131 Å"; value: "SUVI_131" }
+ ListElement { text: "SUVI 171 Å"; value: "SUVI_171" }
+ ListElement { text: "SUVI 195 Å"; value: "SUVI_195" }
+ ListElement { text: "SUVI 284 Å"; value: "SUVI_284" }
+ ListElement { text: "SUVI 304 Å"; value: "SUVI_304" }
+ ListElement { text: "LASCO C2"; value: "LASCO_C2" }
+ ListElement { text: "LASCO C3"; value: "LASCO_C3" }
+ ListElement { text: "Thematic Map"; value: "SUVI_THEMATIC" }
+ }
+ onActivated: {
+ loadImage(poseidon_json['URL'][comboBoxImageProduct.currentValue.value])
+ }
+ }
+
+ Image {
+ id: imageBox
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ fillMode: Image.PreserveAspectFit
+
+ }
+ }
+}