Commit 8c58db2f authored by Lorenz Meier's avatar Lorenz Meier
Browse files

Merge pull request #907 from DonLakeFlyer/FlashFix

More stability changes
parents e1616d01 c12df96f
...@@ -119,6 +119,12 @@ Again: ...@@ -119,6 +119,12 @@ Again:
bool PX4Bootloader::write(QSerialPort* port, const uint8_t* data, qint64 maxSize) bool PX4Bootloader::write(QSerialPort* port, const uint8_t* data, qint64 maxSize)
{ {
// Make sure we don't overflow output buffer
while (port->bytesToWrite() > 50) {
int bump = 0;
bump++;
}
qint64 bytesWritten = port->write((const char*)data, maxSize); qint64 bytesWritten = port->write((const char*)data, maxSize);
if (bytesWritten == -1) { if (bytesWritten == -1) {
_errorString = tr("Write failed: %1").arg(port->errorString()); _errorString = tr("Write failed: %1").arg(port->errorString());
...@@ -147,34 +153,35 @@ bool PX4Bootloader::write(QSerialPort* port, const uint8_t byte) ...@@ -147,34 +153,35 @@ bool PX4Bootloader::write(QSerialPort* port, const uint8_t byte)
bool PX4Bootloader::read(QSerialPort* port, uint8_t* data, qint64 maxSize, bool warnOnError, int readTimeout) bool PX4Bootloader::read(QSerialPort* port, uint8_t* data, qint64 maxSize, bool warnOnError, int readTimeout)
{ {
qint64 bytesRead; qint64 bytesToRead = 0;
if (port->bytesAvailable() < maxSize) { while (bytesToRead < maxSize) {
if (!port->waitForReadyRead(readTimeout)) { if (port->bytesAvailable() == 0) {
_errorString = tr("Timeout waiting for read bytes available: %1").arg(port->errorString()); if (!port->waitForReadyRead(readTimeout)) {
_errorString = tr("Timeout waiting for byte to be available");
if (warnOnError) {
qWarning() << _errorString;
}
return false;
}
Q_ASSERT(port->bytesAvailable() != 0);
}
qint64 bytesRead;
bytesRead = port->read((char*)&data[bytesToRead], maxSize);
if (bytesRead == -1) {
_errorString = tr("Read failed: Could not read 1 byte, error: %1").arg(port->errorString());
if (warnOnError) { if (warnOnError) {
qWarning() << _errorString; qWarning() << _errorString;
} }
return false; return false;
} else {
Q_ASSERT(bytesRead != 0);
bytesToRead += bytesRead;
} }
} }
bytesRead = port->read((char*)data, maxSize);
if (bytesRead == -1) {
_errorString = tr("Read failed: Could not read %1 resonse, error: 12").arg(port->errorString());
if (warnOnError) {
qWarning() << _errorString;
}
return false;
}
if (bytesRead != maxSize) {
_errorString = tr("In correct number of bytes returned for read: actual(%1) expected(%2)").arg(bytesRead).arg(maxSize);
if (warnOnError) {
qWarning() << _errorString;
}
return false;
}
return true; return true;
} }
......
...@@ -144,7 +144,7 @@ void PX4FirmwareUpgradeThreadWorker::_findBootloaderOnce(void) ...@@ -144,7 +144,7 @@ void PX4FirmwareUpgradeThreadWorker::_findBootloaderOnce(void)
} else { } else {
_closeFind(); _closeFind();
_bootloaderPort->close(); _bootloaderPort->close();
delete _bootloaderPort; _bootloaderPort->deleteLater();
_bootloaderPort = NULL; _bootloaderPort = NULL;
qDebug() << "Bootloader error:" << _bootloader->errorString(); qDebug() << "Bootloader error:" << _bootloader->errorString();
emit error(commandBootloader, _bootloader->errorString()); emit error(commandBootloader, _bootloader->errorString());
...@@ -153,7 +153,7 @@ void PX4FirmwareUpgradeThreadWorker::_findBootloaderOnce(void) ...@@ -153,7 +153,7 @@ void PX4FirmwareUpgradeThreadWorker::_findBootloaderOnce(void)
} else { } else {
_closeFind(); _closeFind();
_bootloaderPort->close(); _bootloaderPort->close();
delete _bootloaderPort; _bootloaderPort->deleteLater();
_bootloaderPort = NULL; _bootloaderPort = NULL;
qDebug() << "Bootloader sync failed"; qDebug() << "Bootloader sync failed";
emit bootloaderSyncFailed(); emit bootloaderSyncFailed();
...@@ -189,7 +189,7 @@ void PX4FirmwareUpgradeThreadWorker::timeout(void) ...@@ -189,7 +189,7 @@ void PX4FirmwareUpgradeThreadWorker::timeout(void)
void PX4FirmwareUpgradeThreadWorker::sendBootloaderReboot(void) void PX4FirmwareUpgradeThreadWorker::sendBootloaderReboot(void)
{ {
_bootloader->sendBootloaderReboot(_bootloaderPort); _bootloader->sendBootloaderReboot(_bootloaderPort);
delete _bootloaderPort; _bootloaderPort->deleteLater();
_bootloaderPort = NULL; _bootloaderPort = NULL;
} }
...@@ -197,7 +197,7 @@ void PX4FirmwareUpgradeThreadWorker::program(const QString firmwareFilename) ...@@ -197,7 +197,7 @@ void PX4FirmwareUpgradeThreadWorker::program(const QString firmwareFilename)
{ {
qDebug() << "Program"; qDebug() << "Program";
if (!_bootloader->program(_bootloaderPort, firmwareFilename)) { if (!_bootloader->program(_bootloaderPort, firmwareFilename)) {
delete _bootloaderPort; _bootloaderPort->deleteLater();
_bootloaderPort = NULL; _bootloaderPort = NULL;
qDebug() << "Program failed:" << _bootloader->errorString(); qDebug() << "Program failed:" << _bootloader->errorString();
emit error(commandProgram, _bootloader->errorString()); emit error(commandProgram, _bootloader->errorString());
...@@ -217,7 +217,7 @@ void PX4FirmwareUpgradeThreadWorker::verify(const QString firmwareFilename) ...@@ -217,7 +217,7 @@ void PX4FirmwareUpgradeThreadWorker::verify(const QString firmwareFilename)
qDebug() << "Verify complete"; qDebug() << "Verify complete";
emit complete(commandVerify); emit complete(commandVerify);
} }
delete _bootloaderPort; _bootloaderPort->deleteLater();
_bootloaderPort = NULL; _bootloaderPort = NULL;
} }
...@@ -225,7 +225,7 @@ void PX4FirmwareUpgradeThreadWorker::erase(void) ...@@ -225,7 +225,7 @@ void PX4FirmwareUpgradeThreadWorker::erase(void)
{ {
qDebug() << "Erase"; qDebug() << "Erase";
if (!_bootloader->erase(_bootloaderPort)) { if (!_bootloader->erase(_bootloaderPort)) {
delete _bootloaderPort; _bootloaderPort->deleteLater();
_bootloaderPort = NULL; _bootloaderPort = NULL;
qDebug() << "Erase failed:" << _bootloader->errorString(); qDebug() << "Erase failed:" << _bootloader->errorString();
emit error(commandErase, _bootloader->errorString()); emit error(commandErase, _bootloader->errorString());
......
Supports Markdown
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