725 lines
27 KiB
C++
725 lines
27 KiB
C++
/* mainwindow.cpp - the main window and business logic
|
|
|
|
Copyright 2016 Eric A. Cottrell <eric.c.boston@gmail.com>
|
|
|
|
This file is part of GREFwTool. Source code is available at https://github.com/LinuxSheeple-E/GREFwTool
|
|
|
|
GREFwTool is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
GREFwTool is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GREFwTool. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
#include "include/mainwindow.h"
|
|
#include "ui_mainwindow.h"
|
|
#include "include/display.h"
|
|
#include "include/settingsdialog.h"
|
|
#include "include/webdownloader.h"
|
|
#include "include/grefirmware.h"
|
|
|
|
#include <QMessageBox>
|
|
#include <QProgressDialog>
|
|
#include <QStandardPaths>
|
|
#include <QtSerialPort/QSerialPort>
|
|
#include <QDateTime>
|
|
#include <QTextStream>
|
|
#include <QString>
|
|
#include <QStringList>
|
|
#include <QFile>
|
|
|
|
/* Constructor
|
|
*/
|
|
MainWindow::MainWindow(QWidget *parent) :
|
|
QMainWindow(parent),
|
|
ui(new Ui::MainWindow),
|
|
scannerMode(SCANNER_MODE_UNKNOWN),
|
|
nakCount(0)
|
|
{
|
|
ui->setupUi(this);
|
|
|
|
// allocate the main classes
|
|
display = new Display(this);
|
|
setCentralWidget(display);
|
|
|
|
serial = new QSerialPort(this);
|
|
settings = new SettingsDialog(this);
|
|
progress = nullptr;
|
|
downloader = new WebDownloader(this);
|
|
firmware = new GREFirmware(this);
|
|
parser = new GREParser(this);
|
|
|
|
// Connect the UI actions to the class slots
|
|
connect(ui->actionConnect, SIGNAL(triggered()), this, SLOT(openSerialPort()));
|
|
connect(ui->actionDisconnect, SIGNAL(triggered()), this, SLOT(closeSerialPort()));
|
|
connect(ui->actionQuit, SIGNAL(triggered()), this, SLOT(close()));
|
|
connect(ui->actionSettings, SIGNAL(triggered()), settings, SLOT(show()));
|
|
connect(ui->actionClear, SIGNAL(triggered()), display, SLOT(clear()));
|
|
connect(ui->actionDownloadFirmware, SIGNAL(triggered()), this, SLOT(processFirmwareDownload()));
|
|
connect(ui->actionUpdateFirmware, SIGNAL(triggered()), this, SLOT(processFirmwareUpdate()));
|
|
connect(ui->actionSetTime, SIGNAL(triggered()), this, SLOT(setTime()));
|
|
connect(ui->actionClearPassword, SIGNAL(triggered(bool)), parser, SLOT(clearPassword()));
|
|
connect(ui->actionAbout, SIGNAL(triggered()), this, SLOT(about()));
|
|
connect(ui->actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
|
|
|
|
// Setup the actions
|
|
ui->actionConnect->setEnabled(true);
|
|
ui->actionDisconnect->setEnabled(false);
|
|
ui->actionQuit->setEnabled(true);
|
|
ui->actionSettings->setEnabled(true);
|
|
ui->actionUpdateFirmware->setEnabled(false);
|
|
ui->actionSetTime->setEnabled(false);
|
|
ui->actionClearPassword->setEnabled(false);
|
|
|
|
// Setup the scanner file directory and scanner type configuration
|
|
scannerFileDirectory = QStandardPaths::locate(QStandardPaths::AppDataLocation, QString(), QStandardPaths::LocateDirectory);
|
|
scannerTypeConfig();
|
|
|
|
// Wire the class signals to the class slots
|
|
connect(settings, SIGNAL(applySettings()), this, SLOT(handleApplySettings()));
|
|
|
|
connect(downloader, SIGNAL(downloadComplete()), this, SLOT(processDownloadComplete()));
|
|
connect(downloader, SIGNAL(downloadError()), this, SLOT(processDownloadError()));
|
|
|
|
connect(serial, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(handleSerialError(QSerialPort::SerialPortError)));
|
|
connect(serial, SIGNAL(readyRead()), this, SLOT(readData()));
|
|
|
|
connect(parser, SIGNAL(sendData(QByteArray)), this, SLOT(writeData(QByteArray)));
|
|
connect(parser, SIGNAL(updateEOT(void)), this, SLOT(processEOT(void)));
|
|
connect(parser, SIGNAL(updateEnq(void)), this, SLOT(processEnq(void)));
|
|
connect(parser, SIGNAL(updateAck(void)), this, SLOT(processAck(void)));
|
|
connect(parser, SIGNAL(updateDLE(void)), this, SLOT(processDLE(void)));
|
|
connect(parser, SIGNAL(updateNak(void)), this, SLOT(processNak(void)));
|
|
connect(parser, SIGNAL(updateCan(void)), this, SLOT(processCan(void)));
|
|
connect(parser, SIGNAL(updateCpuUpdateMode(void)), this, SLOT(processCpuUpdateMode(void)));
|
|
connect(parser, SIGNAL(updatePowerStatus(bool)), this, SLOT(processPowerStatus(bool)));
|
|
connect(parser, SIGNAL(updateVersion(GREParser::VersionVal)), this, SLOT(processVersion(GREParser::VersionVal)));
|
|
connect(parser, SIGNAL(updateCCDump(QString)), this, SLOT(processCCDump(QString)));
|
|
|
|
// Setup the download timeout timer
|
|
dlTimer = new QTimer(this);
|
|
dlTimer->setInterval(30000);
|
|
dlTimer->setSingleShot(true);
|
|
connect(dlTimer, SIGNAL(timeout()), this, SLOT(dlTimeout()));
|
|
|
|
// Setup the communications timeout timer
|
|
commsTimer = new QTimer(this);
|
|
commsTimer->setInterval(3000);
|
|
commsTimer->setSingleShot(true);
|
|
connect(commsTimer, SIGNAL(timeout()), this, SLOT(commsTimeout()));
|
|
}
|
|
/* Destructor
|
|
*/
|
|
MainWindow::~MainWindow()
|
|
{
|
|
delete settings;
|
|
delete ui;
|
|
}
|
|
/* openSerialPort - open the serial communications to the scanner
|
|
*/
|
|
void MainWindow::openSerialPort()
|
|
{
|
|
SettingsDialog::Settings p = settings->getCurrentSettings();
|
|
// Close the port if it is open
|
|
if (serial->isOpen())
|
|
{
|
|
serial->close();
|
|
}
|
|
serial->setPortName(p.serialPortName);
|
|
serial->setBaudRate(p.baudRate);
|
|
serial->setDataBits(p.dataBits);
|
|
serial->setParity(p.parity);
|
|
serial->setStopBits(p.stopBits);
|
|
serial->setFlowControl(p.flowControl);
|
|
if (serial->open(QIODevice::ReadWrite)) {
|
|
parser->initialize();
|
|
ui->actionConnect->setEnabled(false);
|
|
ui->actionDisconnect->setEnabled(true);
|
|
ui->actionSettings->setEnabled(false);
|
|
ui->actionUpdateFirmware->setEnabled(false);
|
|
ui->actionSetTime->setEnabled(true);
|
|
ui->actionClearPassword->setEnabled(true);
|
|
display->putMessage(tr("Connected to %1 " ).arg(p.serialPortName));
|
|
} else {
|
|
display->putError(tr("Open Serial Port Error: %1").arg(serial->errorString()));
|
|
QMessageBox::critical(this, tr("Error"), serial->errorString());
|
|
}
|
|
}
|
|
/* closeSerialPort - close the serial communications to the scanner
|
|
*/
|
|
void MainWindow::closeSerialPort()
|
|
{
|
|
SettingsDialog::Settings p = settings->getCurrentSettings();
|
|
scannerMode = SCANNER_MODE_UNKNOWN;
|
|
ui->actionConnect->setEnabled(true);
|
|
ui->actionDisconnect->setEnabled(false);
|
|
ui->actionSettings->setEnabled(true);
|
|
ui->actionUpdateFirmware->setEnabled(false);
|
|
ui->actionSetTime->setEnabled(false);
|
|
ui->actionClearPassword->setEnabled(false);
|
|
if (serial->isOpen())
|
|
{
|
|
serial->close();
|
|
}
|
|
display->putMessage(tr("Disconnected from %1 " ).arg(p.serialPortName));
|
|
}
|
|
/* about - A simple about box
|
|
*/
|
|
void MainWindow::about()
|
|
{
|
|
QMessageBox::about(this, tr("About GREFwTool"),
|
|
tr("<b>GREFwTool</b> Version ") + qApp->applicationVersion() + tr(" updates GRE scanner firmware using Qt." ));
|
|
}
|
|
/* writeData - write data to the scanner
|
|
*/
|
|
void MainWindow::writeData(const QByteArray &data)
|
|
{
|
|
SettingsDialog::Settings p = settings->getCurrentSettings();
|
|
if (serial->isOpen())
|
|
{
|
|
serial->write(data);
|
|
if(p.protocolDebugEnabled)
|
|
displayProtocol(data, true);
|
|
}
|
|
}
|
|
/* readData - read data from the scanner
|
|
*/
|
|
void MainWindow::readData()
|
|
{
|
|
SettingsDialog::Settings p = settings->getCurrentSettings();
|
|
QByteArray data;
|
|
if (serial->isOpen())
|
|
{
|
|
data = serial->readAll();
|
|
if(p.protocolDebugEnabled)
|
|
displayProtocol(data, false);
|
|
parser->receiveData(data);
|
|
}
|
|
}
|
|
/* dlTimeout - process the download timeout timer
|
|
*/
|
|
void MainWindow::dlTimeout()
|
|
{
|
|
QString message("Timeout while downloading firmware file.");
|
|
display->putError(message);
|
|
QMessageBox::critical(this, tr("Timeout"), message);
|
|
downloadMode = DOWNLOAD_MODE_ERROR;
|
|
ui->actionDownloadFirmware->setEnabled(true);
|
|
|
|
|
|
}
|
|
/* commsTimeout - process the communications timeout timer
|
|
*/
|
|
void MainWindow::commsTimeout()
|
|
{
|
|
QString message("Timeout while updating scanner. Please reset scanner and try again.");
|
|
display->putError(message);
|
|
progress->cancel();
|
|
processCan(); // cancel and close serial port
|
|
}
|
|
/* displayProtocol - display bytes sent and received from scanner
|
|
This is used for debugging purposes
|
|
*/
|
|
void MainWindow::displayProtocol(const QByteArray &data, bool txFlag)
|
|
{
|
|
QString displayBytes;
|
|
QString displayAscii;
|
|
QString value;
|
|
for(QByteArray::const_iterator it = data.cbegin(); it != data.cend(); it++)
|
|
{
|
|
unsigned char c = *it;
|
|
value = QString("%1 ").arg(c, 2, 16, QLatin1Char('0'));
|
|
displayBytes.append(value);
|
|
if((c >= ' ' && c <= '~') )
|
|
{
|
|
displayAscii.append(c);
|
|
}
|
|
else
|
|
{
|
|
value = QString("<%1>").arg(c, 2, 16, QLatin1Char('0'));
|
|
displayAscii.append(value);
|
|
}
|
|
|
|
}
|
|
if(txFlag)
|
|
display->putTxBytes(tr("Tx[Hex: %1 Ascii: %2] ").arg(displayBytes).arg(displayAscii));
|
|
else
|
|
display->putRxBytes(tr("Rx[Hex: %1 Ascii: %2] ").arg(displayBytes).arg(displayAscii));
|
|
|
|
}
|
|
/* processEOT - process the CPU Update complete character from scanner
|
|
*/
|
|
void MainWindow::processEOT(void )
|
|
{
|
|
commsTimer->stop();
|
|
QString message("CPU Update Complete. Reconnect after scanner reboots. ");
|
|
closeSerialPort(); // Prevent error on Scanner Report
|
|
updatePacket.clear();
|
|
scannerMode = SCANNER_MODE_UPDATE_DONE;
|
|
progress->reset();
|
|
ui->actionUpdateFirmware->setEnabled(false);
|
|
display->putMessage(message);
|
|
nakCount = 0;
|
|
}
|
|
/* processEnq - process the CPU Update start character from scanner
|
|
*/
|
|
void MainWindow::processEnq(void )
|
|
{
|
|
QString message("CPU is updating.");
|
|
commsTimer->stop();
|
|
if(scannerMode == SCANNER_MODE_CPU_UPDATE)
|
|
{
|
|
updatePacket = firmware->getNextPacket();
|
|
if(!updatePacket.isEmpty())
|
|
{
|
|
parser->sendPacket(updatePacket);
|
|
progress->setValue(firmware->getOffset());
|
|
}
|
|
commsTimer->start();
|
|
scannerMode = SCANNER_MODE_UPDATE_IN_PROGRESS;
|
|
display->putMessage(message);
|
|
}
|
|
nakCount = 0;
|
|
}
|
|
/* processAck - process the acknowledgement character from scanner
|
|
*/
|
|
void MainWindow::processAck(void )
|
|
{
|
|
commsTimer->stop();
|
|
if(scannerMode == SCANNER_MODE_UPDATE_IN_PROGRESS)
|
|
{
|
|
updatePacket = firmware->getNextPacket();
|
|
if(!updatePacket.isEmpty())
|
|
{
|
|
parser->sendPacket(updatePacket);
|
|
progress->setValue(firmware->getOffset());
|
|
}
|
|
commsTimer->start();
|
|
}
|
|
nakCount = 0;
|
|
}
|
|
/* processDLE - process the CPU Update wait character from scanner
|
|
*/
|
|
void MainWindow::processDLE(void )
|
|
{
|
|
QString message("CPU Update Wait. ");
|
|
commsTimer->start();
|
|
nakCount = 0;
|
|
display->putMessage(message);
|
|
}
|
|
/* processNak - process the negative acknowledgement character from scanner
|
|
*/
|
|
void MainWindow::processNak(void )
|
|
{
|
|
QString message("CPU Update Rejected. ");
|
|
commsTimer->stop();
|
|
if((scannerMode == SCANNER_MODE_UPDATE_IN_PROGRESS) && !updatePacket.isEmpty())
|
|
{
|
|
if(++nakCount > 2)
|
|
{
|
|
scannerMode = SCANNER_MODE_UPDATE_ERROR;
|
|
progress->cancel();
|
|
display->putError(message);
|
|
QMessageBox::critical(this, tr("Error"), message);
|
|
return;
|
|
}
|
|
parser->sendPacket(updatePacket);
|
|
commsTimer->start();
|
|
}
|
|
}
|
|
/* processCan - process the CPU Update cancel character from scanner
|
|
*/
|
|
void MainWindow::processCan(void )
|
|
{
|
|
QString message("CPU Update Error.");
|
|
commsTimer->stop();
|
|
updatePacket.clear();
|
|
scannerMode = SCANNER_MODE_UPDATE_ERROR;
|
|
progress->cancel();
|
|
closeSerialPort(); // Prevent error on Scanner Report
|
|
display->putError(message);
|
|
QMessageBox::critical(this, tr("Error"), message);
|
|
}
|
|
/* processCpuUpdateMode - process the CPU Update Mode character from scanner
|
|
*/
|
|
void MainWindow::processCpuUpdateMode(void )
|
|
{
|
|
QString message("Scanner is in CPU Update Mode. ");
|
|
display->putMessage(message);
|
|
ui->actionUpdateFirmware->setEnabled(true);
|
|
scannerMode = SCANNER_MODE_CPU_UPDATE;
|
|
}
|
|
/* processPowerStatus - process the power status response from scanner
|
|
*/
|
|
void MainWindow::processPowerStatus(const bool &data )
|
|
{
|
|
QString message = QString("Scanner is %1. ").arg((data)?"ON":"off");
|
|
display->putMessage(message);
|
|
ui->actionUpdateFirmware->setEnabled(false);
|
|
scannerMode = (data)?SCANNER_MODE_ON:SCANNER_MODE_OFF;
|
|
}
|
|
/* processVersion - process the version response from scanner
|
|
*/
|
|
void MainWindow::processVersion(const GREParser::VersionVal &data )
|
|
{
|
|
QString message = QString("Version %1 %2 %3 %4 %5 ").arg(data.model).arg(data.ver1).arg(data.ver2).arg(data.ver3).arg(data.ver4);
|
|
display->putMessage(message);
|
|
}
|
|
/* processCCDump - Simple processing of CCDump response from scanner
|
|
*/
|
|
void MainWindow::processCCDump(const QString &data )
|
|
{
|
|
QString message = QString("CCDump: %1 ").arg(data);
|
|
display->putMessage(message);
|
|
}
|
|
/* handleSerialError - process Serial Port errors
|
|
*/
|
|
void MainWindow::handleSerialError(QSerialPort::SerialPortError error)
|
|
{
|
|
switch(error)
|
|
{
|
|
case QSerialPort::ResourceError:
|
|
display->putError(tr("Serial Port Error: %1").arg(serial->errorString()));
|
|
QMessageBox::critical(this, tr("Critical Error"), serial->errorString());
|
|
closeSerialPort();
|
|
break;
|
|
// Open errors are handled elsewhere
|
|
case QSerialPort::NotOpenError: // Qt 5.2 and above
|
|
case QSerialPort::WriteError:
|
|
case QSerialPort::ReadError:
|
|
case QSerialPort::UnsupportedOperationError:
|
|
case QSerialPort::TimeoutError: // Qt 5.2 and above
|
|
case QSerialPort::UnknownError:
|
|
display->putError(tr("Serial Port Error: %1").arg(serial->errorString()));
|
|
break;
|
|
default:
|
|
// do nothing
|
|
break;
|
|
}
|
|
}
|
|
/* handleApplySettings - process apply button in settings dialog being pressed
|
|
*/
|
|
void MainWindow::handleApplySettings()
|
|
{
|
|
scannerTypeConfig();
|
|
}
|
|
/* scannerTypeConfig - configure remote directories and filenames based on firmware type
|
|
*/
|
|
void MainWindow::scannerTypeConfig()
|
|
{
|
|
SettingsDialog::Settings s = settings->getCurrentSettings();
|
|
switch(s.firmwareType)
|
|
{
|
|
case SettingsDialog::PSR800Scanner:
|
|
remoteFileDirectory = QString::fromUtf8("http://902Public:Iiu893%40f@scanner-update.com/0602902/public/");
|
|
versionFileName = QString::fromUtf8("versions.php");
|
|
break;
|
|
case SettingsDialog::PRO18Scanner:
|
|
remoteFileDirectory = QString::fromUtf8("http://903Public:glew%25g93@scanner-update.com/0602903/public/");
|
|
versionFileName = QString::fromUtf8("versions.php");
|
|
break;
|
|
case SettingsDialog::PRO668Scanner:
|
|
remoteFileDirectory = QString::fromUtf8("http://pro668Public:;oeig(%40p06@scanner-update.com/pro668/public/");
|
|
versionFileName = QString::fromUtf8("versions.php");
|
|
break;
|
|
case SettingsDialog::WS1080Scanner:
|
|
remoteFileDirectory = QString::fromUtf8("http://ws1080Public:1Lus*eug84@scanner-update.com/ws1080/public/");
|
|
versionFileName = QString::fromUtf8("versions.php");
|
|
break;
|
|
case SettingsDialog::PRO107Scanner:
|
|
remoteFileDirectory = QString::fromUtf8("http://Public0602:lkjgie!853@scanner-update.com/0602/public/");
|
|
versionFileName = QString::fromUtf8("versions.php");
|
|
break;
|
|
case SettingsDialog::PSR700Scanner:
|
|
remoteFileDirectory = QString::fromUtf8("http://901Public:pw2+DR4i@scanner-update.com/0602-901/public/");
|
|
versionFileName = QString::fromUtf8("versions.php");
|
|
break;
|
|
default:
|
|
remoteFileDirectory.clear();
|
|
remoteFileDirectory.clear();
|
|
versionFileName.clear();
|
|
break;
|
|
|
|
}
|
|
}
|
|
/* processFirmwareDownload - start the process of downloading firmware from website
|
|
*/
|
|
void MainWindow::processFirmwareDownload()
|
|
{
|
|
QUrl remote(remoteFileDirectory+versionFileName);
|
|
QString local(scannerFileDirectory+versionFileName);
|
|
QString message("Downloading Version File. ");
|
|
ui->actionDownloadFirmware->setEnabled(false);
|
|
display->clear();
|
|
display->putMessage(message);
|
|
downloadMode = DOWNLOAD_MODE_VER_FILE;
|
|
dlTimer->start();
|
|
downloader->doDownload(remote, local);
|
|
}
|
|
/* processDownloadComplete - process the file downloaded from website
|
|
Multiple files are downloaded.
|
|
The website has a version file that lists the filenames needed to be downloaded.
|
|
*/
|
|
void MainWindow::processDownloadComplete()
|
|
{
|
|
QFile *file;
|
|
QString message;
|
|
QString html;
|
|
// tokens
|
|
QString cpu("CPU");
|
|
QString cpuRelease("CPURelease");
|
|
QString cpu2("CPU2");
|
|
QString cpu2Release("CPU2Release");
|
|
// Stop the timer
|
|
dlTimer->stop();
|
|
// downloadMode is the state and indicates the file being downloaded.
|
|
if(downloadMode == DOWNLOAD_MODE_VER_FILE)
|
|
{ // process the version file, which should be the first one downloaded.
|
|
message = QString("Version File Downloaded. ");
|
|
display->putMessage(message);
|
|
file = new QFile(scannerFileDirectory+versionFileName);
|
|
cpuFileName.clear();
|
|
cpu2FileName.clear();
|
|
cpuFileVersion.clear();
|
|
cpu2FileVersion.clear();
|
|
cpuReleaseName.clear();
|
|
cpu2ReleaseName.clear();
|
|
if(file != nullptr)
|
|
{
|
|
if(file->open(QFile::ReadOnly))
|
|
{ // extract the filename and versions
|
|
QTextStream its(file);
|
|
QString line, lastType;
|
|
lastType.clear();
|
|
while(its.readLineInto(&line))
|
|
{
|
|
QStringList parms = line.split('\t');
|
|
|
|
if(parms.at(0).compare(cpu) == 0)
|
|
{
|
|
cpuFileVersion = parms.at(1).trimmed();
|
|
cpuFileName = parms.at(2).section(' ', 0, 0);
|
|
}
|
|
else if(parms.at(0).compare(cpuRelease) == 0)
|
|
{
|
|
cpuReleaseName = parms.at(2).trimmed();
|
|
}
|
|
else if(parms.at(0).compare(cpu2) == 0)
|
|
{
|
|
cpu2FileVersion = parms.at(1).trimmed();
|
|
cpu2FileName = parms.at(2).trimmed();
|
|
}
|
|
else if(parms.at(0).compare(cpu2Release) == 0)
|
|
{
|
|
cpu2ReleaseName = parms.at(2).trimmed();
|
|
}
|
|
// some files only use a ReleaseNotes tag
|
|
else if(parms.at(0).compare(QString("ReleaseNotes"))== 0)
|
|
{ // ReleaseNotes tag is used for multiple files so check the previous tag
|
|
if(lastType.compare(cpu) == 0)
|
|
cpuReleaseName = parms.at(2).trimmed();
|
|
else if (lastType.compare(cpu2) == 0)
|
|
cpu2ReleaseName = parms.at(2).trimmed();
|
|
}
|
|
lastType = parms.at(0).trimmed();
|
|
}
|
|
file->close();
|
|
}
|
|
delete file;
|
|
file = nullptr;
|
|
}
|
|
// check CPU filename
|
|
if(cpuFileName.isEmpty())
|
|
{
|
|
message = QString("Version File Parsing Error. ");
|
|
display->putError(message);
|
|
QMessageBox::critical(this, tr("Error"), message);
|
|
downloadMode = DOWNLOAD_MODE_ERROR;
|
|
ui->actionDownloadFirmware->setEnabled(true);
|
|
}
|
|
else
|
|
{ // setup to downnload CPU firmware file
|
|
QUrl remote(remoteFileDirectory+cpuFileName);
|
|
QString local(scannerFileDirectory+cpuFileName);
|
|
message = QString("Downloading Firmware Ver: %1 Filename: %2 ").arg(cpuFileVersion).arg(cpuFileName);
|
|
display->putMessage(message);
|
|
dlTimer->start();
|
|
downloader->doDownload(remote, local);
|
|
downloadMode = DOWNLOAD_MODE_CPU_FILE;
|
|
}
|
|
}
|
|
else if (downloadMode == DOWNLOAD_MODE_CPU_FILE)
|
|
{ // CPU firmware file done so check CPU release filename
|
|
if(cpuReleaseName.isEmpty())
|
|
{
|
|
|
|
message = QString("Version File Parsing Error. ");
|
|
display->putError(message);
|
|
QMessageBox::critical(this, tr("Error"), message);
|
|
downloadMode = DOWNLOAD_MODE_ERROR;
|
|
ui->actionDownloadFirmware->setEnabled(true);
|
|
}
|
|
else
|
|
{ // setup to download CPU release file
|
|
QUrl remote(remoteFileDirectory+cpuReleaseName);
|
|
QString local(scannerFileDirectory+cpuReleaseName);
|
|
message = QString("Downloading Firmware Release Notes: %1 ").arg(cpuReleaseName);
|
|
display->putMessage(message);
|
|
dlTimer->start();
|
|
downloader->doDownload(remote, local);
|
|
downloadMode = DOWNLOAD_MODE_CPU_RELEASE;
|
|
}
|
|
}
|
|
else if (downloadMode == DOWNLOAD_MODE_CPU_RELEASE)
|
|
{ // CPU release file done so display it as HTML
|
|
file = new QFile(scannerFileDirectory+cpuReleaseName);
|
|
if(file != nullptr)
|
|
{
|
|
if(file->open(QFile::ReadOnly))
|
|
{
|
|
QTextStream rts(file);
|
|
html = rts.readAll();
|
|
display->putHtml(html);
|
|
file->close();
|
|
}
|
|
delete file;
|
|
file = nullptr;
|
|
}
|
|
// In current usage there is no CPU2 firmware file so finish
|
|
if(cpu2FileName.isEmpty())
|
|
{
|
|
message = QString("Fimware Download Complete. ");
|
|
display->putMessage(message);
|
|
downloadMode = DOWNLOAD_MODE_DONE;
|
|
ui->actionDownloadFirmware->setEnabled(true);
|
|
}
|
|
else
|
|
{ // Future case to setup for downloading CPU2 firmware file
|
|
QUrl remote(remoteFileDirectory+cpu2FileName);
|
|
QString local(scannerFileDirectory+cpu2FileName);
|
|
message = QString("Downloading Firmware2 Ver: %1 Filename: %2 ").arg(cpu2FileVersion).arg(cpu2FileName);
|
|
display->putMessage(message);
|
|
dlTimer->start();
|
|
downloader->doDownload(remote, local);
|
|
downloadMode = DOWNLOAD_MODE_CPU2_FILE;
|
|
}
|
|
}
|
|
else if (downloadMode == DOWNLOAD_MODE_CPU2_FILE)
|
|
{ // Future case: CPU2 firmware file done so check CPU2 release filename
|
|
if(cpu2ReleaseName.isEmpty())
|
|
{
|
|
|
|
message = QString("Version File Parsing Error. ");
|
|
display->putError(message);
|
|
QMessageBox::critical(this, tr("Error"), message);
|
|
downloadMode = DOWNLOAD_MODE_ERROR;
|
|
ui->actionDownloadFirmware->setEnabled(true);
|
|
}
|
|
else
|
|
{
|
|
QUrl remote(remoteFileDirectory+cpu2ReleaseName);
|
|
QString local(scannerFileDirectory+cpu2ReleaseName);
|
|
message = QString("Downloading Firmware2 Release Notes: %1 ").arg(cpu2ReleaseName);
|
|
display->putMessage(message);
|
|
dlTimer->start();
|
|
downloader->doDownload(remote, local);
|
|
downloadMode = DOWNLOAD_MODE_CPU2_RELEASE;
|
|
}
|
|
}
|
|
else if (downloadMode == DOWNLOAD_MODE_CPU2_RELEASE)
|
|
{ // Future case: CPU2 release file done so display it as HTML
|
|
file = new QFile(scannerFileDirectory+cpu2ReleaseName);
|
|
if(file != nullptr)
|
|
{
|
|
if(file->open(QFile::ReadOnly))
|
|
{
|
|
QTextStream rts(file);
|
|
html = rts.readAll();
|
|
display->putHtml(html);
|
|
file->close();
|
|
}
|
|
delete file;
|
|
file = nullptr;
|
|
}
|
|
message = QString("Firmware Download Complete. ");
|
|
display->putMessage(message);
|
|
downloadMode = DOWNLOAD_MODE_DONE;
|
|
ui->actionDownloadFirmware->setEnabled(true);
|
|
}
|
|
else
|
|
{ // Unhandled downloadMode value so show error
|
|
QString message("Firmware Download mode error. ");
|
|
display->putError(message);
|
|
QMessageBox::critical(this, tr("Error"), message);
|
|
downloadMode = DOWNLOAD_MODE_ERROR;
|
|
ui->actionDownloadFirmware->setEnabled(true);
|
|
}
|
|
}
|
|
/* processDownloadError - process error occuring during file download from website
|
|
*/
|
|
void MainWindow::processDownloadError()
|
|
{
|
|
dlTimer->stop();
|
|
QString message("Error while downloading file. ");
|
|
display->putError(message);
|
|
QMessageBox::critical(this, tr("Error"), message);
|
|
downloadMode = DOWNLOAD_MODE_ERROR;
|
|
ui->actionDownloadFirmware->setEnabled(true);
|
|
|
|
}
|
|
/* processFirmwareUpdate - start the CPU firmware update
|
|
*/
|
|
void MainWindow::processFirmwareUpdate()
|
|
{
|
|
SettingsDialog::Settings s = settings->getCurrentSettings();
|
|
if(firmware->openFile(scannerFileDirectory))
|
|
{
|
|
if(firmware->getPlatform() == s.firmwareType)
|
|
{
|
|
if((s.scannerType != s.firmwareType) && !firmware->transcode(s.scannerType))
|
|
{ // if transcode is needed and not supported then error
|
|
QString message("Transcode not supported for this scanner or version of firmware. ");
|
|
display->putError(message);
|
|
QMessageBox::critical(this, tr("Error"), message);
|
|
return;
|
|
}
|
|
ui->actionUpdateFirmware->setEnabled(false);
|
|
// Create progress dialog, if needed, without an abort button.
|
|
if(progress == nullptr)
|
|
{
|
|
progress = new QProgressDialog("Updating Firmware", QString(), 0, firmware->getImageSize(), this);
|
|
}
|
|
else // update image size of existing dialog
|
|
{
|
|
progress->setMaximum(firmware->getImageSize());
|
|
}
|
|
// send the header
|
|
updatePacket = firmware->getFirstPacket();
|
|
parser->sendPacket(updatePacket);
|
|
commsTimer->start();
|
|
}
|
|
else
|
|
{
|
|
QString message("Wrong firmware file for scanner. ");
|
|
display->putError(message);
|
|
QMessageBox::critical(this, tr("Error"), message);
|
|
}
|
|
}
|
|
|
|
}
|
|
/* setTime - set the date and time on scanner using current computer date and time
|
|
*/
|
|
void MainWindow::setTime()
|
|
{
|
|
QString message("Date and Time sent to scanner. ");
|
|
parser->setDateTime(QDateTime::currentDateTime());
|
|
display->putMessage(message);
|
|
}
|