Skip to content

Commit

Permalink
Automatic update notificaton added
Browse files Browse the repository at this point in the history
  • Loading branch information
Ultrawipf committed Aug 23, 2022
1 parent 14206f1 commit d251871
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 37 deletions.
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
- Added analog filter option
- Added ADS111X source dialog
- Added manual range tuning option for local analog and ADS111X

#### Updater:
- Added update browser (Help->updates)
- Added automatic update notifications for firmware and GUI if detected

Redesign:
#### Redesign:
- Redesigned UI layout
- Added effect monitoring windows
- Added advanced effect tuning window
Expand Down
32 changes: 28 additions & 4 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
import updater

# This GUIs version
VERSION = "1.9.4"
VERSION = "1.9.5"

# Minimal supported firmware version.
# Major version of firmware must match firmware. Minor versions must be higher or equal
Expand Down Expand Up @@ -83,6 +83,7 @@ def __init__(self):
self.fw_version_str = None

self.setup()
self.check_configurator_update()

def setup(self):
"""Init the systray, the serial, the toolbar, the status bar and the connection status."""
Expand Down Expand Up @@ -158,6 +159,18 @@ def reboot(self):
self.send_command("sys", "reboot")
self.reconnect()

def check_configurator_update(self):
"""Checks if there is an update for the configurator only"""
release = updater.GithubRelease.get_latest_release(updater.GUIREPO)
if not release:
return
releaseversion,_ = updater.GithubRelease.get_version(release)
if updater.UpdateChecker.compare_versions(VERSION,releaseversion):
# New release available for firmware
msg = "New configurator update available.<br>Warning: Check if compatible with firmware.<br>Install firmware from <a href=\"https://github.com/Ultrawipf/OpenFFBoard/releases\"> main repo</a>"
notification = updater.UpdateNotification(release,self,msg,VERSION)
notification.exec()

def open_dfu_dialog(self):
"""Open the dfu dialog and start managing."""
msg = PyQt6.QtWidgets.QDialog()
Expand Down Expand Up @@ -412,10 +425,11 @@ def version_check(self, ver):
gui_outdated = False

fw_outdated = (
min_fw_split[0] > fw_ver_split[0] or min_fw_split[1] > fw_ver_split[1] \
or min_fw_split[2] > fw_ver_split[2]
min_fw_split[0] > fw_ver_split[0] \
or min_fw_split[1] > fw_ver_split[1] and min_fw_split[0] == fw_ver_split[0] \
or min_fw_split[2] > fw_ver_split[2] and min_fw_split[1] == fw_ver_split[1] and min_fw_split[0] == fw_ver_split[0]
)
gui_outdated = min_fw_split[0] < fw_ver_split[0] or min_fw_split[1] < fw_ver_split[1]
gui_outdated = min_fw_split[0] < fw_ver_split[0] or min_fw_split[1] < fw_ver_split[1] and min_fw_split[0] == fw_ver_split[0]

if gui_outdated:
msg = PyQt6.QtWidgets.QMessageBox(
Expand All @@ -439,6 +453,16 @@ def version_check(self, ver):
"and GUI are up to date if you encounter errors."
)
msg.exec()
# Check github
mainreporelease = updater.GithubRelease.get_latest_release(updater.MAINREPO)
releaseversion,_ = updater.GithubRelease.get_version(mainreporelease)
if updater.UpdateChecker.compare_versions(self.fw_version_str,releaseversion):
# New release available for firmware
msg = "New firmware available"
notification = updater.UpdateNotification(mainreporelease,self,msg,self.fw_version_str)
notification.exec()



def serial_connected(self, connected):
"""Check the release when a board is connected."""
Expand Down
50 changes: 32 additions & 18 deletions res/updatebrowser.ui
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,32 @@
<string>Updatebrowser</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="1">
<item row="4" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>2</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Release notes</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="label_releaseInfo">
<property name="text">
<string>Info</string>
</property>
</widget>
</item>
<item>
<widget class="QTextBrowser" name="textBrowser_releasenotes"/>
</item>
</layout>
</widget>
</item>
<item row="2" column="1">
<widget class="QGroupBox" name="groupBox_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
Expand Down Expand Up @@ -87,7 +112,7 @@
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Ultrawipf/OpenFFBoard-configurator&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Configurator only</string>
<string>Configurator only (Only use if newer than main repo)</string>
</property>
<attribute name="buttonGroup">
<string notr="true">buttonGroup_repo</string>
Expand All @@ -97,7 +122,7 @@
</layout>
</widget>
</item>
<item row="1" column="0">
<item row="2" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
Expand Down Expand Up @@ -142,22 +167,11 @@
</layout>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>2</verstretch>
</sizepolicy>
<item row="1" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="text">
<string>Info: Use the main repo for firmware updates and always use matching configurator release</string>
</property>
<property name="title">
<string>Release notes</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QTextBrowser" name="textBrowser_releasenotes"/>
</item>
</layout>
</widget>
</item>
</layout>
Expand Down
80 changes: 66 additions & 14 deletions updater.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import PyQt6.QtGui
import PyQt6.QtCore
import PyQt6.QtWidgets
from PyQt6.QtWidgets import QListWidgetItem
from PyQt6.QtWidgets import QListWidgetItem,QGroupBox,QHBoxLayout,QVBoxLayout,QLabel,QDialog,QTextBrowser,QPushButton
import base_ui
import pydfu
import requests
Expand All @@ -16,6 +16,11 @@
import helper
from PyQt6.QtGui import QPalette, QColor
from PyQt6.QtCore import Qt
from datetime import datetime
from optionsdialog import OptionsDialogGroupBox

MAINREPO = "Ultrawipf/OpenFFBoard"
GUIREPO = "Ultrawipf/OpenFFBoard-Configurator"

class GithubRelease():

Expand Down Expand Up @@ -53,6 +58,11 @@ def get_latest_release(repo : str):
release = json.loads(response.content)
return(release)

@staticmethod
def get_time(release : dict):
"""Returns a datetime object of the creation time"""
return datetime.strptime(release['created_at'],'%Y-%m-%dT%H:%M:%SZ')

@staticmethod
def get_version(release : dict):
"""Returns None if invalid tag, otherwise (version,postfix) like ("1.2.3","dev")"""
Expand All @@ -78,9 +88,17 @@ class UpdateChecker():
@staticmethod
def compare_versions(curver,comparever):
"""Returns False if current version newer or identical, True if comparever is newer"""
if not curver or not comparever:
return False
comparever_i = [int(i) for i in comparever.split(".")]
curver_i = [int(i) for i in curver.split(".")]
return comparever_i[0] > curver_i[0] or comparever_i[1] > curver_i[1] or comparever_i[2] > curver_i[2]
outdated = (
comparever_i[0] > curver_i[0] \
or comparever_i[1] > curver_i[1] and comparever_i[0] == curver_i[0] \
or comparever_i[2] > curver_i[2] and comparever_i[1] == curver_i[1] and comparever_i[0] == curver_i[0]
)
# return comparever_i[0] > curver_i[0] or comparever_i[1] > curver_i[1] or comparever_i[2] > curver_i[2]
return outdated


@staticmethod
Expand All @@ -103,8 +121,7 @@ def __init__(self,parentWidget):
self.listWidget_release.currentItemChanged.connect(self.release_changed)
self.listWidget_files.currentItemChanged.connect(self.file_changed)
self.buttonGroup_repo.buttonClicked.connect(self.repo_changed)

self.read_releases("Ultrawipf/OpenFFBoard")
self.read_releases(MAINREPO)

def fill_releases(self,releases : dict):
self.listWidget_release.clear()
Expand All @@ -130,9 +147,9 @@ def get_selected_release(self):

def repo_changed(self,button):
if button == self.radioButton_configurator:
self.read_releases("Ultrawipf/OpenFFBoard-Configurator")
self.read_releases(GUIREPO)
else:
self.read_releases("Ultrawipf/OpenFFBoard")
self.read_releases(MAINREPO)

def read_releases(self,repo : str):
releases = GithubRelease.get_releases(repo,True)
Expand All @@ -155,9 +172,12 @@ def release_changed(self,current : QListWidgetItem,old : QListWidgetItem):
if not current:
return
release = current.data(Qt.ItemDataRole.UserRole)
self.textBrowser_releasenotes.setText(GithubRelease.get_description(release))
self.textBrowser_releasenotes.setMarkdown(GithubRelease.get_description(release))
self.label_releaseUrl.setText(f"<a href=\"{release['html_url']}\">{release['html_url']}</a>")
self.fill_files(release)
publishtime = GithubRelease.get_time(release)
infotext = f"Date: {publishtime}"
self.label_releaseInfo.setText(infotext)

def file_changed(self,current : QListWidgetItem,old : QListWidgetItem):
if not current:
Expand All @@ -167,11 +187,43 @@ def file_changed(self,current : QListWidgetItem,old : QListWidgetItem):



if __name__ == "__main__":
##test
newver,r = UpdateChecker.check_update("Ultrawipf/OpenFFBoard","1.2.3")
print(GithubRelease.get_version(r),newver)
class UpdateNotification(QDialog):
"""Shows a dialog with release information"""
def __init__(self,release,main,desc,curver):
self.main = main
QDialog.__init__(self, main)
self.setWindowTitle("Update available")
self.vbox = QVBoxLayout()
self.setLayout(self.vbox)
self.infolabel = QLabel(desc)
self.infolabel.setOpenExternalLinks(True)
self.infolabel.setTextFormat(Qt.TextFormat.RichText)
self.vbox.addWidget(self.infolabel)
if not release:
self.vbox.addWidget(QLabel("Error displaying release"))
return
self.releaseversion = release["tag_name"]
url = release['html_url']
self.versionlabel = QLabel(f"New version: <a href=\"{url}\"> {self.releaseversion}</a>, Current version: {curver}")
self.versionlabel.setOpenExternalLinks(True)
self.versionlabel.setTextFormat(Qt.TextFormat.RichText)
self.vbox.addWidget(self.versionlabel)

self.titlelabel = QLabel(f"<a href=\"{url}\"> {GithubRelease.get_title(release)}</a>")
self.titlelabel.setOpenExternalLinks(True)
self.vbox.addWidget(self.titlelabel)

self.updatebrowserbutton = QPushButton("Open update browser",self)
self.updatebrowserbutton.clicked.connect(self.open_updater)

self.releasenotes = QTextBrowser(self)
self.releasenotes.setMarkdown(GithubRelease.get_description(release))
self.vbox.addWidget(self.releasenotes)
self.vbox.addWidget(self.updatebrowserbutton)



releasest = GithubRelease.get_releases("Ultrawipf/OpenFFBoard",True)
if releasest:
print(GithubRelease.get_title(releasest[0]))
def open_updater(self):
"""Opens the updatebrowser"""
self.close()
UpdateBrowser(self).exec()

0 comments on commit d251871

Please sign in to comment.