mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Automatic OSTC firmware update: download file and try to install
This successfully downloads the hex file. The actuall update of the OSTC fails before it gets started with a crash when the ConfigureDiveComputer object is created. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
		
							parent
							
								
									0be0cdb046
								
							
						
					
					
						commit
						003f5d18b6
					
				
					 3 changed files with 73 additions and 23 deletions
				
			
		| 
						 | 
				
			
			@ -1,17 +1,21 @@
 | 
			
		|||
#include "configuredivecomputerdialog.h"
 | 
			
		||||
 | 
			
		||||
#include "../divecomputer.h"
 | 
			
		||||
#include "../libdivecomputer.h"
 | 
			
		||||
#include "../helpers.h"
 | 
			
		||||
#include "../display.h"
 | 
			
		||||
#include "../divelist.h"
 | 
			
		||||
#include "divecomputer.h"
 | 
			
		||||
#include "libdivecomputer.h"
 | 
			
		||||
#include "helpers.h"
 | 
			
		||||
#include "display.h"
 | 
			
		||||
#include "divelist.h"
 | 
			
		||||
#include "configuredivecomputer.h"
 | 
			
		||||
#include "mainwindow.h"
 | 
			
		||||
#include <QFileDialog>
 | 
			
		||||
#include <QMessageBox>
 | 
			
		||||
#include <QSettings>
 | 
			
		||||
#include <QWebElement>
 | 
			
		||||
#include <QWebFrame>
 | 
			
		||||
#include <QWebPage>
 | 
			
		||||
#include <QNetworkAccessManager>
 | 
			
		||||
#include <QNetworkRequest>
 | 
			
		||||
#include <QNetworkReply>
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
 | 
			
		||||
struct product {
 | 
			
		||||
| 
						 | 
				
			
			@ -193,29 +197,37 @@ ConfigureDiveComputerDialog::ConfigureDiveComputerDialog(QWidget *parent) :
 | 
			
		|||
OstcFirmwareCheck::OstcFirmwareCheck(QString product)
 | 
			
		||||
{
 | 
			
		||||
	QUrl url;
 | 
			
		||||
	if (product == "OSTC 3")
 | 
			
		||||
	if (product == "OSTC 3") {
 | 
			
		||||
		url = QUrl("http://www.heinrichsweikamp.net/autofirmware/ostc3_changelog.txt");
 | 
			
		||||
	else if (product == "OSTC Sport")
 | 
			
		||||
		latestFirmwareHexFile = QString("http://www.heinrichsweikamp.net/autofirmware/ostc3_firmware.hex");
 | 
			
		||||
	} else if (product == "OSTC Sport") {
 | 
			
		||||
		url = QUrl("http://www.heinrichsweikamp.net/autofirmware/ostc_sport_changelog.txt");
 | 
			
		||||
	else // not one of the known dive computers
 | 
			
		||||
		latestFirmwareHexFile = QString("http://www.heinrichsweikamp.net/autofirmware/ostc_sport_firmware.hex");
 | 
			
		||||
	} else { // not one of the known dive computers
 | 
			
		||||
		return;
 | 
			
		||||
	hwVersionPage.mainFrame()->load(url);
 | 
			
		||||
	connect(&hwVersionPage, SIGNAL(loadFinished(bool)), this, SLOT(parseOstcFwVersion()));
 | 
			
		||||
	}
 | 
			
		||||
	connect(&manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(parseOstcFwVersion(QNetworkReply *)));
 | 
			
		||||
	QNetworkRequest download(url);
 | 
			
		||||
	manager.get(download);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OstcFirmwareCheck::parseOstcFwVersion()
 | 
			
		||||
void OstcFirmwareCheck::parseOstcFwVersion(QNetworkReply *reply)
 | 
			
		||||
{
 | 
			
		||||
	QString parse = hwVersionPage.mainFrame()->toPlainText();
 | 
			
		||||
	QString parse = reply->readAll();
 | 
			
		||||
	int firstOpenBracket = parse.indexOf('[');
 | 
			
		||||
	int firstCloseBracket = parse.indexOf(']');
 | 
			
		||||
	latestFirmwareAvailable = parse.mid(firstOpenBracket + 1, firstCloseBracket - firstOpenBracket -1);
 | 
			
		||||
	qDebug() << "latest firmware available" << latestFirmwareAvailable;
 | 
			
		||||
	disconnect(&manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(parseOstcFwVersion(QNetworkReply*)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OstcFirmwareCheck::checkLatest(QWidget *parent, uint32_t firmwareOnDevice)
 | 
			
		||||
void OstcFirmwareCheck::checkLatest(QWidget *_parent, device_data_t *data)
 | 
			
		||||
{
 | 
			
		||||
	devData = *data;
 | 
			
		||||
	parent = _parent;
 | 
			
		||||
	// for now libdivecomputer gives us the firmware on device undecoded as integer
 | 
			
		||||
	// for the OSTC that means highbyte.lowbyte is the version number
 | 
			
		||||
	int firmwareOnDevice = devData.libdc_firmware;
 | 
			
		||||
	QString firmware;
 | 
			
		||||
	firmware = QString("%1.%2").arg(firmwareOnDevice / 256). arg(firmwareOnDevice % 256);
 | 
			
		||||
	if (!latestFirmwareAvailable.isEmpty() && latestFirmwareAvailable != firmware) {
 | 
			
		||||
| 
						 | 
				
			
			@ -229,14 +241,44 @@ void OstcFirmwareCheck::checkLatest(QWidget *parent, uint32_t firmwareOnDevice)
 | 
			
		|||
		response.setIcon(QMessageBox::Question);
 | 
			
		||||
		response.setWindowModality(Qt::WindowModal);
 | 
			
		||||
		int ret = response.exec();
 | 
			
		||||
		if (ret == QMessageBox::Accepted) {
 | 
			
		||||
			qDebug() << "go to firmware upgrade";
 | 
			
		||||
		} else {
 | 
			
		||||
			qDebug() << "no upgrade";
 | 
			
		||||
		}
 | 
			
		||||
		if (ret == QMessageBox::Accepted)
 | 
			
		||||
			upgradeFirmware();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OstcFirmwareCheck::upgradeFirmware()
 | 
			
		||||
{
 | 
			
		||||
	// start download of latestFirmwareHexFile
 | 
			
		||||
	QString saveFileName = latestFirmwareHexFile;
 | 
			
		||||
	saveFileName.replace("http://www.heinrichsweikamp.net/autofirmware/", "");
 | 
			
		||||
	saveFileName.replace("firmware", latestFirmwareAvailable);
 | 
			
		||||
	QString filename = existing_filename ?: prefs.default_filename;
 | 
			
		||||
	QFileInfo fi(filename);
 | 
			
		||||
	filename = fi.absolutePath().append(QDir::separator()).append(saveFileName);
 | 
			
		||||
	storeFirmware = QFileDialog::getSaveFileName(parent, tr("Save the downloaded firmware as"),
 | 
			
		||||
						     filename, tr("HEX files (*.hex)"));
 | 
			
		||||
	if (storeFirmware.isEmpty())
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	connect(&manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(saveOstcFirmware(QNetworkReply *)));
 | 
			
		||||
	QNetworkRequest download(latestFirmwareHexFile);
 | 
			
		||||
	manager.get(download);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OstcFirmwareCheck::saveOstcFirmware(QNetworkReply *reply)
 | 
			
		||||
{
 | 
			
		||||
	// firmware is downloaded
 | 
			
		||||
	// call config->startFirmwareUpdate() with that file and the device data
 | 
			
		||||
 | 
			
		||||
	QByteArray firmwareData = reply->readAll();
 | 
			
		||||
	QFile file(storeFirmware);
 | 
			
		||||
	file.open(QIODevice::WriteOnly);
 | 
			
		||||
	file.write(firmwareData);
 | 
			
		||||
	file.close();
 | 
			
		||||
	ConfigureDiveComputer *config = new ConfigureDiveComputer(MainWindow::instance());
 | 
			
		||||
	config->startFirmwareUpdate(storeFirmware, &devData);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ConfigureDiveComputerDialog::~ConfigureDiveComputerDialog()
 | 
			
		||||
{
 | 
			
		||||
	QSettings settings;
 | 
			
		||||
| 
						 | 
				
			
			@ -1023,6 +1065,8 @@ void ConfigureDiveComputerDialog::on_updateFirmwareButton_clicked()
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void ConfigureDiveComputerDialog::on_DiveComputerList_currentRowChanged(int currentRow)
 | 
			
		||||
{
 | 
			
		||||
	// Disable the buttons to do operations on this data
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@
 | 
			
		|||
#include "../libdivecomputer.h"
 | 
			
		||||
#include "configuredivecomputer.h"
 | 
			
		||||
#include <QStyledItemDelegate>
 | 
			
		||||
#include <QWebPage>
 | 
			
		||||
#include <QNetworkAccessManager>
 | 
			
		||||
 | 
			
		||||
class GasSpinBoxItemDelegate : public QStyledItemDelegate
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -107,13 +107,19 @@ class OstcFirmwareCheck : QObject
 | 
			
		|||
	Q_OBJECT
 | 
			
		||||
public:
 | 
			
		||||
	explicit OstcFirmwareCheck(QString product);
 | 
			
		||||
	void checkLatest(QWidget *parent, uint32_t firmwareOnDevice);
 | 
			
		||||
	void checkLatest(QWidget *parent, device_data_t *data);
 | 
			
		||||
public
 | 
			
		||||
slots:
 | 
			
		||||
	void parseOstcFwVersion();
 | 
			
		||||
	void parseOstcFwVersion(QNetworkReply *reply);
 | 
			
		||||
	void saveOstcFirmware(QNetworkReply * reply);
 | 
			
		||||
private:
 | 
			
		||||
	QWebPage hwVersionPage;
 | 
			
		||||
	void upgradeFirmware();
 | 
			
		||||
	device_data_t devData;
 | 
			
		||||
	QString latestFirmwareAvailable;
 | 
			
		||||
	QString latestFirmwareHexFile;
 | 
			
		||||
	QString storeFirmware;
 | 
			
		||||
	QWidget *parent;
 | 
			
		||||
	QNetworkAccessManager manager;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // CONFIGUREDIVECOMPUTERDIALOG_H
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -404,7 +404,7 @@ void DownloadFromDCWidget::onDownloadThreadFinished()
 | 
			
		|||
			MainWindow::instance()->dive_list()->selectDive(idx, true);
 | 
			
		||||
			QString dcName = data.devname;
 | 
			
		||||
			if (ostcFirmwareCheck)
 | 
			
		||||
				ostcFirmwareCheck->checkLatest(this, data.libdc_firmware);
 | 
			
		||||
				ostcFirmwareCheck->checkLatest(this, &data);
 | 
			
		||||
		}
 | 
			
		||||
	} else if (currentState == CANCELLING || currentState == CANCELLED) {
 | 
			
		||||
		if (import_thread_cancelled) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue