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 + + } + } +}