Newer
Older
#include <QJsonDocument>
#include <QFile>
Lorenz Meier
committed
#include "PX4FirmwareUpgradeWorker.h"
#include <SerialLink.h>
#include <QGC.h>
Lorenz Meier
committed
#include "uploader.h"
Lorenz Meier
committed
#include <QDebug>
Lorenz Meier
committed
#define PROTO_GET_SYNC 0x21
#define PROTO_EOC 0x20
#define PROTO_NOP 0x00
#define PROTO_OK 0x10
#define PROTO_FAILED 0x11
#define PROTO_INSYNC 0x12
Lorenz Meier
committed
PX4FirmwareUpgradeWorker::PX4FirmwareUpgradeWorker(QObject *parent) :
QObject(parent),
link(NULL)
{
}
PX4FirmwareUpgradeWorker* PX4FirmwareUpgradeWorker::putWorkerInThread(QObject *parent)
{
PX4FirmwareUpgradeWorker *worker = new PX4FirmwareUpgradeWorker;
QThread *workerThread = new QThread(parent);
connect(workerThread, SIGNAL(started()), worker, SLOT(startContinousScan()));
connect(workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
worker->moveToThread(workerThread);
// Starts an event loop, and emits workerThread->started()
workerThread->start();
return worker;
Lorenz Meier
committed
}
void PX4FirmwareUpgradeWorker::startContinousScan()
Lorenz Meier
committed
{
exitThread = false;
while (!exitThread) {
// if (detect()) {
// break;
// }
QGC::SLEEP::msleep(20);
Lorenz Meier
committed
}
if (exitThread) {
link->disconnect();
delete link;
exit(0);
}
Lorenz Meier
committed
}
void PX4FirmwareUpgradeWorker::detect()
Lorenz Meier
committed
{
if (!link)
{
link = new SerialLink("", 921600);
connect(link, SIGNAL(bytesReceived(LinkInterface*,QByteArray)), this, SLOT(receiveBytes(LinkInterface*,QByteArray)));
}
// Get a list of ports
QVector<QString>* ports = link->getCurrentPorts();
// Scan
for (int i = 0; i < ports->size(); i++)
{
// Ignore known wrong link names
if (ports->at(i).contains("Bluetooth")) {
//continue;
Lorenz Meier
committed
}
link->setPortName(ports->at(i));
// Open port and talk to it
link->connect();
Lorenz Meier
committed
char buf[2] = { PROTO_GET_SYNC, PROTO_EOC };
Lorenz Meier
committed
if (!link->isConnected()) {
continue;
}
// Send sync request
insync = false;
link->writeBytes(buf, 2);
// Wait for response
QGC::SLEEP::msleep(20);
if (insync)
emit validPortFound(ports->at(i));
break;
}
//ui.portName->setCurrentIndex(ui.baudRate->findText(QString("%1").arg(this->link->getPortName())));
// Set port
// Load current link config
}
void PX4FirmwareUpgradeWorker::receiveBytes(LinkInterface* link, QByteArray b)
{
for (int position = 0; position < b.size(); position++) {
qDebug() << "BYTES";
qDebug() << (char)(b[position]);
Lorenz Meier
committed
if (((const char)b[position]) == PROTO_INSYNC)
Lorenz Meier
committed
{
qDebug() << "SYNC";
insync = true;
}
Lorenz Meier
committed
if (insync && ((const char)b[position]) == PROTO_OK)
Lorenz Meier
committed
emit detectionStatusChanged("Found PX4 board");
}
}
printf("\n");
}
void PX4FirmwareUpgradeWorker::loadFirmware(const QString &filename)
{
Lorenz Meier
committed
qDebug() << __FILE__ << __LINE__ << "LOADING FW" << filename;
PX4_Uploader uploader;
const char* filenames[2];
filenames[0] = filename.toStdString().c_str();
filenames[1] = NULL;
uploader.upload(filenames, "/dev/tty.usbmodem1");
// QFile f(filename);
// if (f.open(QIODevice::ReadOnly))
// {
// QByteArray buf = f.readAll();
// f.close();
// firmware = QJsonDocument::fromBinaryData(buf);
// if (firmware.isNull()) {
// emit upgradeStatusChanged(tr("Failed decoding file %1").arg(filename));
// } else {
// emit upgradeStatusChanged(tr("Ready to flash %1").arg(filename));
// }
// } else {
// emit upgradeStatusChanged(tr("Failed opening file %1").arg(filename));
// }
}
void PX4FirmwareUpgradeWorker::upgrade()
Lorenz Meier
committed
{
emit upgradeStatusChanged(tr("Starting firmware upgrade.."));
}
Lorenz Meier
committed
void PX4FirmwareUpgradeWorker::abort()
{
exitThread = true;