Commit 09cc683c authored by Michael Carpenter's avatar Michael Carpenter

More changes for a better looking and functioning ApmFirmwareConfig screen

parent 56efe884
......@@ -263,8 +263,7 @@ FORMS += src/ui/MainWindow.ui \
src/ui/configuration/ArduRoverPidConfig.ui \
src/ui/configuration/terminalconsole.ui \
src/ui/configuration/SerialSettingsDialog.ui \
src/ui/configuration/ApmFirmwareConfig.ui \
src/ui/configuration/ApmFirmwareStatus.ui
src/ui/configuration/ApmFirmwareConfig.ui
INCLUDEPATH += src \
src/ui \
src/ui/linechart \
......@@ -455,8 +454,7 @@ HEADERS += src/MG.h \
src/ui/configuration/SerialSettingsDialog.h \
src/ui/configuration/terminalconsole.h \
src/ui/configuration/ApmHighlighter.h \
src/ui/configuration/ApmFirmwareConfig.h \
src/ui/configuration/ApmFirmwareStatus.h
src/ui/configuration/ApmFirmwareConfig.h
# Google Earth is only supported on Mac OS and Windows with Visual Studio Compiler
macx|macx-g++|macx-g++42|win32-msvc2008|win32-msvc2010|win32-msvc2012::HEADERS += src/ui/map3D/QGCGoogleEarthView.h
......@@ -666,8 +664,7 @@ SOURCES += src/main.cc \
src/ui/configuration/console.cpp \
src/ui/configuration/SerialSettingsDialog.cc \
src/ui/configuration/ApmHighlighter.cc \
src/ui/configuration/ApmFirmwareConfig.cc \
src/ui/configuration/ApmFirmwareStatus.cc
src/ui/configuration/ApmFirmwareConfig.cc
# Enable Google Earth only on Mac OS and Windows with Visual Studio compiler
macx|macx-g++|macx-g++42|win32-msvc2008|win32-msvc2010|win32-msvc2012::SOURCES += src/ui/map3D/QGCGoogleEarthView.cc
......
#include "ApmFirmwareConfig.h"
#include <QXmlStreamReader>
#include <QMessageBox>
#include <QProcess>
#include "LinkManager.h"
#include "LinkInterface.h"
#include "qserialport.h"
#include "qserialportinfo.h"
#include "SerialLink.h"
#include "ApmFirmwareConfig.h"
ApmFirmwareConfig::ApmFirmwareConfig(QWidget *parent) : QWidget(parent)
{
ui.setupUi(this);
firmwareStatus = 0;
//firmwareStatus = 0;
m_betaFirmwareChecked = false;
m_tempFirmwareFile=0;
//
......@@ -30,111 +29,122 @@ ApmFirmwareConfig::ApmFirmwareConfig(QWidget *parent) : QWidget(parent)
connect(ui.quadPushButton,SIGNAL(clicked()),this,SLOT(burnButtonClicked()));
connect(ui.triPushButton,SIGNAL(clicked()),this,SLOT(burnButtonClicked()));
connect(ui.y6PushButton,SIGNAL(clicked()),this,SLOT(burnButtonClicked()));
requestFirmwares(false);
connect(ui.betaFirmwareButton,SIGNAL(clicked()),this,SLOT(betaFirmwareButtonClicked()));
requestFirmwares();
connect(ui.betaFirmwareButton,SIGNAL(clicked(bool)),this,SLOT(betaFirmwareButtonClicked(bool)));
ui.progressBar->setMaximum(100);
ui.progressBar->setValue(0);
ui.progressBar->setVisible(false);
ui.textBrowser->setVisible(false);
connect(ui.showOutputCheckBox,SIGNAL(clicked(bool)),ui.textBrowser,SLOT(setShown(bool)));
}
void ApmFirmwareConfig::requestFirmwares(bool beta)
void ApmFirmwareConfig::requestBetaFirmwares()
{
m_betaFirmwareChecked = true;
QNetworkReply *reply1 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/beta/apm2-heli/git-version.txt")));
QNetworkReply *reply2 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/beta/apm2-quad/git-version.txt")));
QNetworkReply *reply3 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/beta/apm2-hexa/git-version.txt")));
QNetworkReply *reply4 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/beta/apm2-octa/git-version.txt")));
QNetworkReply *reply5 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/beta/apm2-octa-quad/git-version.txt")));
QNetworkReply *reply6 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/beta/apm2-tri/git-version.txt")));
QNetworkReply *reply7 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/beta/apm2-y6/git-version.txt")));
QNetworkReply *reply8 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Plane/beta/apm2/git-version.txt")));
QNetworkReply *reply9 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Rover/beta/apm2/git-version.txt")));
if (!beta)
{
QNetworkReply *reply1 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/stable/apm2-heli/git-version.txt")));
QNetworkReply *reply2 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/stable/apm2-quad/git-version.txt")));
QNetworkReply *reply3 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/stable/apm2-hexa/git-version.txt")));
QNetworkReply *reply4 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/stable/apm2-octa/git-version.txt")));
QNetworkReply *reply5 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/stable/apm2-octa-quad/git-version.txt")));
QNetworkReply *reply6 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/stable/apm2-tri/git-version.txt")));
QNetworkReply *reply7 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/stable/apm2-y6/git-version.txt")));
QNetworkReply *reply8 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Plane/stable/apm2/git-version.txt")));
QNetworkReply *reply9 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Rover/stable/apm2/git-version.txt")));
m_buttonToUrlMap[ui.roverPushButton] = "http://firmware.diydrones.com/Rover/stable/apm2/APMrover2.hex";
m_buttonToUrlMap[ui.planePushButton] = "http://firmware.diydrones.com/Plane/stable/apm2/ArduPlane.hex";
m_buttonToUrlMap[ui.copterPushButton] = "http://firmware.diydrones.com/Copter/stable/apm2-heli/ArduCopter.hex";
m_buttonToUrlMap[ui.hexaPushButton] = "http://firmware.diydrones.com/Copter/stable/apm2-hexa/ArduCopter.hex";
m_buttonToUrlMap[ui.octaQuadPushButton] = "http://firmware.diydrones.com/Copter/stable/apm2-octa-quad/ArduCopter.hex";
m_buttonToUrlMap[ui.octaPushButton] = "http://firmware.diydrones.com/Copter/stable/apm2-octa/ArduCopter.hex";
m_buttonToUrlMap[ui.quadPushButton] = "http://firmware.diydrones.com/Copter/stable/apm2-quad/ArduCopter.hex";
m_buttonToUrlMap[ui.triPushButton] = "http://firmware.diydrones.com/Copter/stable/apm2-tri/ArduCopter.hex";
m_buttonToUrlMap[ui.y6PushButton] = "http://firmware.diydrones.com/Copter/stable/apm2-y6/ArduCopter.hex";
m_buttonToUrlMap[ui.roverPushButton] = "http://firmware.diydrones.com/Rover/beta/apm2/APMrover2.hex";
m_buttonToUrlMap[ui.planePushButton] = "http://firmware.diydrones.com/Plane/beta/apm2/ArduPlane.hex";
m_buttonToUrlMap[ui.copterPushButton] = "http://firmware.diydrones.com/Copter/beta/apm2-heli/ArduCopter.hex";
m_buttonToUrlMap[ui.hexaPushButton] = "http://firmware.diydrones.com/Copter/beta/apm2-hexa/ArduCopter.hex";
m_buttonToUrlMap[ui.octaQuadPushButton] = "http://firmware.diydrones.com/Copter/beta/apm2-octa-quad/ArduCopter.hex";
m_buttonToUrlMap[ui.octaPushButton] = "http://firmware.diydrones.com/Copter/beta/apm2-octa/ArduCopter.hex";
m_buttonToUrlMap[ui.quadPushButton] = "http://firmware.diydrones.com/Copter/beta/apm2-quad/ArduCopter.hex";
m_buttonToUrlMap[ui.triPushButton] = "http://firmware.diydrones.com/Copter/beta/apm2-tri/ArduCopter.hex";
m_buttonToUrlMap[ui.y6PushButton] = "http://firmware.diydrones.com/Copter/beta/apm2-y6/ArduCopter.hex";
//http://firmware.diydrones.com/Plane/stable/apm2/ArduPlane.hex
connect(reply1,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply1,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply2,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply2,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply3,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply3,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply4,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply4,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply5,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply5,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply6,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply6,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply7,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply7,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply8,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply8,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply9,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply9,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
qDebug() << "Getting Stable firmware...";
}
else
{
QNetworkReply *reply1 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/beta/apm2-heli/git-version.txt")));
QNetworkReply *reply2 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/beta/apm2-quad/git-version.txt")));
QNetworkReply *reply3 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/beta/apm2-hexa/git-version.txt")));
QNetworkReply *reply4 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/beta/apm2-octa/git-version.txt")));
QNetworkReply *reply5 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/beta/apm2-octa-quad/git-version.txt")));
QNetworkReply *reply6 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/beta/apm2-tri/git-version.txt")));
QNetworkReply *reply7 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/beta/apm2-y6/git-version.txt")));
QNetworkReply *reply8 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Plane/beta/apm2/git-version.txt")));
QNetworkReply *reply9 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Rover/beta/apm2/git-version.txt")));
m_buttonToUrlMap[ui.roverPushButton] = "http://firmware.diydrones.com/Rover/beta/apm2/APMrover2.hex";
m_buttonToUrlMap[ui.planePushButton] = "http://firmware.diydrones.com/Plane/beta/apm2/ArduPlane.hex";
m_buttonToUrlMap[ui.copterPushButton] = "http://firmware.diydrones.com/Copter/beta/apm2-heli/ArduCopter.hex";
m_buttonToUrlMap[ui.hexaPushButton] = "http://firmware.diydrones.com/Copter/beta/apm2-hexa/ArduCopter.hex";
m_buttonToUrlMap[ui.octaQuadPushButton] = "http://firmware.diydrones.com/Copter/beta/apm2-octa-quad/ArduCopter.hex";
m_buttonToUrlMap[ui.octaPushButton] = "http://firmware.diydrones.com/Copter/beta/apm2-octa/ArduCopter.hex";
m_buttonToUrlMap[ui.quadPushButton] = "http://firmware.diydrones.com/Copter/beta/apm2-quad/ArduCopter.hex";
m_buttonToUrlMap[ui.triPushButton] = "http://firmware.diydrones.com/Copter/beta/apm2-tri/ArduCopter.hex";
m_buttonToUrlMap[ui.y6PushButton] = "http://firmware.diydrones.com/Copter/beta/apm2-y6/ArduCopter.hex";
//http://firmware.diydrones.com/Plane/stable/apm2/ArduPlane.hex
connect(reply1,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply1,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply2,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply2,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply3,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply3,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply4,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply4,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply5,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply5,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply6,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply6,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply7,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply7,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply8,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply8,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply9,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply9,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
qDebug() << "Getting Beta firmware...";
}
//http://firmware.diydrones.com/Plane/stable/apm2/ArduPlane.hex
connect(reply1,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply1,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply2,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply2,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply3,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply3,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply4,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply4,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply5,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply5,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply6,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply6,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply7,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply7,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply8,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply8,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply9,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply9,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
qDebug() << "Getting Beta firmware...";
}
void ApmFirmwareConfig::requestFirmwares()
{
m_betaFirmwareChecked = false;
QNetworkReply *reply1 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/stable/apm2-heli/git-version.txt")));
QNetworkReply *reply2 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/stable/apm2-quad/git-version.txt")));
QNetworkReply *reply3 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/stable/apm2-hexa/git-version.txt")));
QNetworkReply *reply4 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/stable/apm2-octa/git-version.txt")));
QNetworkReply *reply5 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/stable/apm2-octa-quad/git-version.txt")));
QNetworkReply *reply6 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/stable/apm2-tri/git-version.txt")));
QNetworkReply *reply7 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Copter/stable/apm2-y6/git-version.txt")));
QNetworkReply *reply8 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Plane/stable/apm2/git-version.txt")));
QNetworkReply *reply9 = m_networkManager->get(QNetworkRequest(QUrl("http://firmware.diydrones.com/Rover/stable/apm2/git-version.txt")));
m_buttonToUrlMap[ui.roverPushButton] = "http://firmware.diydrones.com/Rover/stable/apm2/APMrover2.hex";
m_buttonToUrlMap[ui.planePushButton] = "http://firmware.diydrones.com/Plane/stable/apm2/ArduPlane.hex";
m_buttonToUrlMap[ui.copterPushButton] = "http://firmware.diydrones.com/Copter/stable/apm2-heli/ArduCopter.hex";
m_buttonToUrlMap[ui.hexaPushButton] = "http://firmware.diydrones.com/Copter/stable/apm2-hexa/ArduCopter.hex";
m_buttonToUrlMap[ui.octaQuadPushButton] = "http://firmware.diydrones.com/Copter/stable/apm2-octa-quad/ArduCopter.hex";
m_buttonToUrlMap[ui.octaPushButton] = "http://firmware.diydrones.com/Copter/stable/apm2-octa/ArduCopter.hex";
m_buttonToUrlMap[ui.quadPushButton] = "http://firmware.diydrones.com/Copter/stable/apm2-quad/ArduCopter.hex";
m_buttonToUrlMap[ui.triPushButton] = "http://firmware.diydrones.com/Copter/stable/apm2-tri/ArduCopter.hex";
m_buttonToUrlMap[ui.y6PushButton] = "http://firmware.diydrones.com/Copter/stable/apm2-y6/ArduCopter.hex";
//http://firmware.diydrones.com/Plane/stable/apm2/ArduPlane.hex
connect(reply1,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply1,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply2,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply2,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply3,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply3,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply4,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply4,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply5,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply5,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply6,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply6,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply7,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply7,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply8,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply8,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
connect(reply9,SIGNAL(finished()),this,SLOT(firmwareListFinished()));
connect(reply9,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
qDebug() << "Getting Stable firmware...";
}
void ApmFirmwareConfig::betaFirmwareButtonClicked()
void ApmFirmwareConfig::betaFirmwareButtonClicked(bool betafirmwareenabled)
{
if (!m_betaFirmwareChecked)
if (betafirmwareenabled)
{
m_betaFirmwareChecked = true;
requestFirmwares(true);
QMessageBox::information(0,"Warning","Beta firmwares are from the latest trunk. Use at your own risk!!");
ui.label->setText("<h2>Beta Firmware</h2>");
ui.betaFirmwareButton->setText("Stable Firmware");
requestBetaFirmwares();
}
else
{
m_betaFirmwareChecked = false;
requestFirmwares(false);
ui.label->setText("<h2>Firmware</h2>");
ui.betaFirmwareButton->setText("Beta Firmware");
requestFirmwares();
}
}
void ApmFirmwareConfig::firmwareProcessFinished(int status)
......@@ -144,7 +154,26 @@ void ApmFirmwareConfig::firmwareProcessFinished(int status)
{
return;
}
//qDebug() << "Error:" << proc->errorString();
if (status != 0)
{
//Error of some kind
QMessageBox::information(0,"Error","An error has occured during the upload process. See window for details");
ui.textBrowser->setVisible(true);
ui.showOutputCheckBox->setChecked(true);
ui.textBrowser->setPlainText(ui.textBrowser->toPlainText().append("\n\nERROR!!\n" + proc->errorString()));
QScrollBar *sb = ui.textBrowser->verticalScrollBar();
if (sb)
{
sb->setValue(sb->maximum());
}
ui.statusLabel->setText("Error during upload");
}
else
{
//Ensure we're reading 100%
ui.progressBar->setValue(100);
ui.statusLabel->setText("Upload complete");
}
//qDebug() << "Upload finished!" << QString::number(status);
m_tempFirmwareFile->deleteLater(); //This will remove the temporary file.
m_tempFirmwareFile = 0;
......@@ -157,24 +186,38 @@ void ApmFirmwareConfig::firmwareProcessReadyRead()
{
return;
}
QString error = proc->readAllStandardError() + proc->readAllStandardOutput();
if (error.contains("Writing"))
QString output = proc->readAllStandardError() + proc->readAllStandardOutput();
if (output.contains("Writing"))
{
firmwareStatus->resetProgress();
//firmwareStatus->resetProgress();
ui.progressBar->setValue(0);
}
else if (error.contains("Reading"))
else if (output.contains("Reading"))
{
firmwareStatus->resetProgress();
ui.progressBar->setValue(50);
}
if (error.startsWith("#"))
if (output.startsWith("#"))
{
firmwareStatus->progressTick();
ui.progressBar->setValue(ui.progressBar->value()+1);
ui.textBrowser->setPlainText(ui.textBrowser->toPlainText().append(output));
QScrollBar *sb = ui.textBrowser->verticalScrollBar();
if (sb)
{
sb->setValue(sb->maximum());
}
}
else
{
firmwareStatus->passMessage(error);
ui.textBrowser->setPlainText(ui.textBrowser->toPlainText().append(output + "\n"));
QScrollBar *sb = ui.textBrowser->verticalScrollBar();
if (sb)
{
sb->setValue(sb->maximum());
}
}
qDebug() << "E:" << error;
qDebug() << "E:" << output;
//qDebug() << "AVR Output:" << proc->readAllStandardOutput();
//qDebug() << "AVR Output:" << proc->readAllStandardError();
}
......@@ -213,68 +256,78 @@ void ApmFirmwareConfig::downloadFinished()
//info.manufacturer() == "Arduino LLC (www.arduino.cc)"
//info.description() == "%mega2560.name%"
bool foundconnected = false;
QString detectedcomport = "COM4";
for (int i=0;i<LinkManager::instance()->getLinks().size();i++)
{
if (LinkManager::instance()->getLinks()[i]->isConnected())
{
//This is likely the serial link we want.
SerialLink *link = qobject_cast<SerialLink*>(LinkManager::instance()->getLinks()[i]);
if (!link)
{
qDebug() << "Eror, trying to program over a non serial link. This should not happen";
return;
}
detectedcomport = link->getPortName();
link->requestReset();
foundconnected = true;
link->disconnect();
link->wait(1000); // Wait 1 second for it to disconnect.
}
}
if (!foundconnected)
{
QMessageBox::information(0,"Error","You must be connected to a MAV over serial link to flash firmware");
return;
}
qDebug() << "Attempting to reset port";
QSerialPort port;
port.setPortName(detectedcomport);
port.setPortName(m_detectedComPort);
port.open(QIODevice::ReadWrite);
port.setDataTerminalReady(true);
port.waitForBytesWritten(250);
port.setDataTerminalReady(false);
port.close();
firmwareStatus->setStatus("Burning");
ui.statusLabel->setText("Burning");
#ifdef Q_OS_WIN
process->start("avrdude/avrdude.exe",QStringList() << "-Cavrdude/avrdude.conf" << "-pm2560" << "-cstk500" << QString("-P").append(detectedcomport) << QString("-Uflash:w:").append(m_tempFirmwareFile->fileName()).append(":i"));
process->start("avrdude/avrdude.exe",QStringList() << "-Cavrdude/avrdude.conf" << "-pm2560" << "-cstk500" << QString("-P").append(m_detectedComPort) << QString("-Uflash:w:").append(m_tempFirmwareFile->fileName()).append(":i"));
#else
process->start("avrdude",QStringList() << "-Cavrdude/avrdude.conf" << "-pm2560" << "-cstk500" << QString("-P").append(detectedcomport) << QString("-Uflash:w:").append(m_tempFirmwareFile->fileName()).append(":i"));
process->start("avrdude",QStringList() << "-Cavrdude/avrdude.conf" << "-pm2560" << "-cstk500" << QString("-P").append(m_detectedComPort) << QString("-Uflash:w:").append(m_tempFirmwareFile->fileName()).append(":i"));
#endif
}
void ApmFirmwareConfig::firmwareProcessError(QProcess::ProcessError error)
{
qDebug() << "Error:" << error;
}
void ApmFirmwareConfig::firmwareDownloadProgress(qint64 received,qint64 total)
{
ui.progressBar->setValue( 100.0 * ((double)received/(double)total));
}
void ApmFirmwareConfig::burnButtonClicked()
{
QPushButton *senderbtn = qobject_cast<QPushButton*>(sender());
if (m_buttonToUrlMap.contains(senderbtn))
{
bool foundconnected = false;
for (int i=0;i<LinkManager::instance()->getLinks().size();i++)
{
if (LinkManager::instance()->getLinks()[i]->isConnected())
{
//This is likely the serial link we want.
SerialLink *link = qobject_cast<SerialLink*>(LinkManager::instance()->getLinks()[i]);
if (!link)
{
qDebug() << "Eror, trying to program over a non serial link. This should not happen";
return;
}
if (!(QMessageBox::question(this,"WARNING","You are about to upload new firmware to your board. This will disconnect you if you are currently connected. Be sure the MAV is on the ground, and connected over USB/Serial link.\n\nDo you wish to proceed?",QMessageBox::Yes,QMessageBox::No) == QMessageBox::Yes))
{
return;
}
m_detectedComPort = link->getPortName();
link->requestReset();
foundconnected = true;
link->disconnect();
link->wait(1000); // Wait 1 second for it to disconnect.
}
}
if (!foundconnected)
{
QMessageBox::information(0,"Error","You must be connected to a MAV over serial link to flash firmware. Please connect to a MAV then try again");
return;
}
qDebug() << "Go download:" << m_buttonToUrlMap[senderbtn];
QNetworkReply *reply = m_networkManager->get(QNetworkRequest(QUrl(m_buttonToUrlMap[senderbtn])));
//http://firmware.diydrones.com/Plane/stable/apm2/ArduPlane.hex
connect(reply,SIGNAL(finished()),this,SLOT(downloadFinished()));
connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(firmwareListError(QNetworkReply::NetworkError)));
firmwareStatus = new ApmFirmwareStatus();
firmwareStatus->show();
firmwareStatus->setStatus("Downloading");
connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(firmwareDownloadProgress(qint64,qint64)));
ui.statusLabel->setText("Downloading");
ui.progressBar->setVisible(true);
}
}
......@@ -302,109 +355,114 @@ void ApmFirmwareConfig::firmwareListFinished()
QString outstr = "";
if (stripVersionFromGitReply(reply->url().toString(),replystr,"apm2-heli",(m_betaFirmwareChecked ? "beta" : "stable"),&outstr))
{
ui.copterLabel->setText(outstr);
if (m_betaFirmwareChecked)
{
ui.copterLabel->setText("BETA " + outstr);
}
else
{
ui.copterLabel->setText(outstr);
}
return;
}
if (stripVersionFromGitReply(reply->url().toString(),replystr,"apm2-quad",(m_betaFirmwareChecked ? "beta" : "stable"),&outstr))
{
ui.quadLabel->setText(outstr);
if (m_betaFirmwareChecked)
{
ui.quadLabel->setText("BETA " + outstr);
}
else
{
ui.quadLabel->setText(outstr);
}
return;
}
if (stripVersionFromGitReply(reply->url().toString(),replystr,"apm2-hexa",(m_betaFirmwareChecked ? "beta" : "stable"),&outstr))
{
ui.hexaLabel->setText(outstr);
if (m_betaFirmwareChecked)
{
ui.hexaLabel->setText("BETA " + outstr);
}
else
{
ui.hexaLabel->setText(outstr);
}
return;
}
if (stripVersionFromGitReply(reply->url().toString(),replystr,"apm2-octa",(m_betaFirmwareChecked ? "beta" : "stable"),&outstr))
if (stripVersionFromGitReply(reply->url().toString(),replystr,"apm2-octa-quad",(m_betaFirmwareChecked ? "beta" : "stable"),&outstr))
{
ui.octaLabel->setText(outstr);
if (m_betaFirmwareChecked)
{
ui.octaQuadLabel->setText("BETA " + outstr);
}
else
{
ui.octaQuadLabel->setText(outstr);
}
return;
}
if (stripVersionFromGitReply(reply->url().toString(),replystr,"apm2-octa-quad",(m_betaFirmwareChecked ? "beta" : "stable"),&outstr))
if (stripVersionFromGitReply(reply->url().toString(),replystr,"apm2-octa",(m_betaFirmwareChecked ? "beta" : "stable"),&outstr))
{
ui.octaQuadLabel->setText(outstr);
if (m_betaFirmwareChecked)
{
ui.octaLabel->setText("BETA " + outstr);
}
else
{
ui.octaLabel->setText(outstr);
}
return;
}
if (stripVersionFromGitReply(reply->url().toString(),replystr,"apm2-tri",(m_betaFirmwareChecked ? "beta" : "stable"),&outstr))
{
ui.triLabel->setText(outstr);
if (m_betaFirmwareChecked)
{
ui.triLabel->setText("BETA " + outstr);
}
else
{
ui.triLabel->setText(outstr);
}
return;
}
if (stripVersionFromGitReply(reply->url().toString(),replystr,"apm2-y6",(m_betaFirmwareChecked ? "beta" : "stable"),&outstr))
{
ui.y6Label->setText(outstr);
if (m_betaFirmwareChecked)
{
ui.y6Label->setText("BETA " + outstr);
}
else
{
ui.y6Label->setText(outstr);
}
return;
}
if (stripVersionFromGitReply(reply->url().toString(),replystr,"Plane",(m_betaFirmwareChecked ? "beta" : "stable"),&outstr))
{
ui.planeLabel->setText(outstr);
if (m_betaFirmwareChecked)
{
ui.planeLabel->setText("BETA " + outstr);
}
else
{
ui.planeLabel->setText(outstr);
}
return;
}
if (stripVersionFromGitReply(reply->url().toString(),replystr,"Rover",(m_betaFirmwareChecked ? "beta" : "stable"),&outstr))
{
ui.roverLabel->setText(outstr);
return;
}
//qDebug() << replystr;
/*
QXmlStreamReader xml(replystr);
while (!xml.atEnd())
{
if (xml.name() == "options" && xml.isStartElement())
if (m_betaFirmwareChecked)
{
xml.readNext();
while (xml.name() != "options")
{
if (xml.name() == "Firmware" && xml.isStartElement())
{
xml.readNext();
FirmwareDef def;
while (xml.name() != "Firmware")
{
if (xml.name() == "url" && xml.isStartElement())
{
xml.readNext();
def.url = xml.text().toString();
}
else if (xml.name() == "url2560" && xml.isStartElement())
{
xml.readNext();
def.url2560 = xml.text().toString();
}
else if (xml.name() == "url2560-2" && xml.isStartElement())
{
xml.readNext();
def.url25602 = xml.text().toString();
}
else if (xml.name() == "urlpx4" && xml.isStartElement())
{
xml.readNext();
def.urlpx4 = xml.text().toString();
}
else if (xml.name() == "name" && xml.isStartElement())
{
xml.readNext();
def.name = xml.text().toString();
}
else if (xml.name() == "desc" && xml.isStartElement())
{
xml.readNext();
def.desc = xml.text().toString();
}
else if (xml.name() == "format_version" && xml.isStartElement())
{
xml.readNext();
def.version = xml.text().toString().toInt();
}
xml.readNext();
}
}
xml.readNext();
}
ui.roverLabel->setText("BETA " + outstr);
}
else
{
ui.roverLabel->setText(outstr);
}
xml.readNext();
}*/
return;
}
qDebug() << "Match not found for:" << reply->url();
qDebug() << "Git version line:" << replystr;
}
ApmFirmwareConfig::~ApmFirmwareConfig()
......
......@@ -8,6 +8,9 @@
#include <QDebug>
#include <QTemporaryFile>
#include <QProcess>
#include <QXmlStreamReader>
#include <QMessageBox>
#include <QProcess>
#include "qserialport.h"
#include "ui_ApmFirmwareConfig.h"
#include "ApmFirmwareStatus.h"
......@@ -23,16 +26,19 @@ private slots:
void firmwareListFinished();
void firmwareListError(QNetworkReply::NetworkError error);
void burnButtonClicked();
void betaFirmwareButtonClicked();
void betaFirmwareButtonClicked(bool betafirmwareenabled);
void downloadFinished();
void firmwareProcessFinished(int status);
void firmwareProcessReadyRead();
void firmwareProcessError(QProcess::ProcessError error);
void firmwareDownloadProgress(qint64 received,qint64 total);
private:
ApmFirmwareStatus *firmwareStatus;
//ApmFirmwareStatus *firmwareStatus;
QString m_detectedComPort;
QTemporaryFile *m_tempFirmwareFile;
QNetworkAccessManager *m_networkManager;
void requestFirmwares(bool beta);
void requestFirmwares();
void requestBetaFirmwares();
bool stripVersionFromGitReply(QString url,QString reply,QString type,QString stable,QString *out);
bool m_betaFirmwareChecked;
QMap<QPushButton*,QString> m_buttonToUrlMap;
......
......@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>958</width>
<height>497</height>
<width>868</width>
<height>661</height>
</rect>
</property>
<property name="windowTitle">
......@@ -18,7 +18,7 @@
<rect>
<x>10</x>
<y>20</y>
<width>91</width>
<width>211</width>
<height>31</height>
</rect>
</property>
......@@ -428,14 +428,69 @@
<widget class="QPushButton" name="betaFirmwareButton">
<property name="geometry">
<rect>
<x>760</x>
<x>700</x>
<y>440</y>
<width>91</width>
<width>131</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Beta firmwares</string>
<string>Beta firmware</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
<widget class="QProgressBar" name="progressBar">
<property name="geometry">
<rect>
<x>50</x>
<y>470</y>
<width>791</width>
<height>23</height>
</rect>
</property>
<property name="value">
<number>24</number>
</property>
</widget>
<widget class="QTextBrowser" name="textBrowser">
<property name="geometry">
<rect>
<x>60</x>
<y>500</y>
<width>741</width>
<height>151</height>
</rect>
</property>
</widget>
<widget class="QCheckBox" name="showOutputCheckBox">
<property name="geometry">
<rect>
<x>600</x>
<y>440</y>
<width>101</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>Show Output</string>
</property>
</widget>
<widget class="QLabel" name="statusLabel">
<property name="geometry">
<rect>
<x>60</x>
<y>440</y>
<width>141</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Status</string>
</property>
</widget>
</widget>
......
#include "ApmFirmwareStatus.h"
ApmFirmwareStatus::ApmFirmwareStatus(QWidget *parent) : QWidget(parent)
{
ui.setupUi(this);
ui.progressBar->setMaximum(50);
}
ApmFirmwareStatus::~ApmFirmwareStatus()
{
}
void ApmFirmwareStatus::passMessage(QString msg)
{
ui.textBrowser->append(msg);
}
void ApmFirmwareStatus::setStatus(QString message)
{
ui.label->setText("<h2>" + message + "</h2>");
}
void ApmFirmwareStatus::resetProgress()
{
ui.progressBar->setValue(0);
}
void ApmFirmwareStatus::progressTick()
{
ui.progressBar->setValue(ui.progressBar->value()+1);
}
#ifndef APMFIRMWARESTATUS_H
#define APMFIRMWARESTATUS_H
#include <QWidget>
#include "ui_ApmFirmwareStatus.h"
class ApmFirmwareStatus : public QWidget
{
Q_OBJECT
public:
explicit ApmFirmwareStatus(QWidget *parent = 0);
~ApmFirmwareStatus();
void passMessage(QString msg);
void setStatus(QString message);
void resetProgress();
void progressTick();
private:
Ui::ApmFirmwareStatus ui;
};
#endif // APMFIRMWARESTATUS_H
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ApmFirmwareStatus</class>
<widget class="QWidget" name="ApmFirmwareStatus">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>889</width>
<height>313</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QPushButton" name="closePushButton">
<property name="geometry">
<rect>
<x>390</x>
<y>110</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Close</string>
</property>
</widget>
<widget class="QTextBrowser" name="textBrowser">
<property name="geometry">
<rect>
<x>10</x>
<y>150</y>
<width>871</width>
<height>141</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>20</x>
<y>20</y>
<width>291</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string>&lt;h2&gt;Status&lt;/h2&gt;</string>
</property>
</widget>
<widget class="QProgressBar" name="progressBar">
<property name="geometry">
<rect>
<x>10</x>
<y>70</y>
<width>851</width>
<height>23</height>
</rect>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment