diff --git a/src/ui/px4_configuration/PX4Bootloader.cc b/src/ui/px4_configuration/PX4Bootloader.cc index eabd11ffd8b4b019437e4adf70f015430754838f..51c6d3310b4ae9b85269879f4ac0a5b711a887f9 100644 --- a/src/ui/px4_configuration/PX4Bootloader.cc +++ b/src/ui/px4_configuration/PX4Bootloader.cc @@ -119,6 +119,12 @@ Again: 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); if (bytesWritten == -1) { _errorString = tr("Write failed: %1").arg(port->errorString()); @@ -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) { - qint64 bytesRead; - - if (port->bytesAvailable() < maxSize) { - if (!port->waitForReadyRead(readTimeout)) { - _errorString = tr("Timeout waiting for read bytes available: %1").arg(port->errorString()); + qint64 bytesToRead = 0; + + while (bytesToRead < maxSize) { + if (port->bytesAvailable() == 0) { + 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) { qWarning() << _errorString; } 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; } diff --git a/src/ui/px4_configuration/PX4FirmwareUpgradeThread.cc b/src/ui/px4_configuration/PX4FirmwareUpgradeThread.cc index 7e9ee479cdc399217dd2a130b3cfb78b71f7c957..496fec388c11c4b5959d14bd9f356ce8ab5f6461 100644 --- a/src/ui/px4_configuration/PX4FirmwareUpgradeThread.cc +++ b/src/ui/px4_configuration/PX4FirmwareUpgradeThread.cc @@ -144,7 +144,7 @@ void PX4FirmwareUpgradeThreadWorker::_findBootloaderOnce(void) } else { _closeFind(); _bootloaderPort->close(); - delete _bootloaderPort; + _bootloaderPort->deleteLater(); _bootloaderPort = NULL; qDebug() << "Bootloader error:" << _bootloader->errorString(); emit error(commandBootloader, _bootloader->errorString()); @@ -153,7 +153,7 @@ void PX4FirmwareUpgradeThreadWorker::_findBootloaderOnce(void) } else { _closeFind(); _bootloaderPort->close(); - delete _bootloaderPort; + _bootloaderPort->deleteLater(); _bootloaderPort = NULL; qDebug() << "Bootloader sync failed"; emit bootloaderSyncFailed(); @@ -189,7 +189,7 @@ void PX4FirmwareUpgradeThreadWorker::timeout(void) void PX4FirmwareUpgradeThreadWorker::sendBootloaderReboot(void) { _bootloader->sendBootloaderReboot(_bootloaderPort); - delete _bootloaderPort; + _bootloaderPort->deleteLater(); _bootloaderPort = NULL; } @@ -197,7 +197,7 @@ void PX4FirmwareUpgradeThreadWorker::program(const QString firmwareFilename) { qDebug() << "Program"; if (!_bootloader->program(_bootloaderPort, firmwareFilename)) { - delete _bootloaderPort; + _bootloaderPort->deleteLater(); _bootloaderPort = NULL; qDebug() << "Program failed:" << _bootloader->errorString(); emit error(commandProgram, _bootloader->errorString()); @@ -217,7 +217,7 @@ void PX4FirmwareUpgradeThreadWorker::verify(const QString firmwareFilename) qDebug() << "Verify complete"; emit complete(commandVerify); } - delete _bootloaderPort; + _bootloaderPort->deleteLater(); _bootloaderPort = NULL; } @@ -225,7 +225,7 @@ void PX4FirmwareUpgradeThreadWorker::erase(void) { qDebug() << "Erase"; if (!_bootloader->erase(_bootloaderPort)) { - delete _bootloaderPort; + _bootloaderPort->deleteLater(); _bootloaderPort = NULL; qDebug() << "Erase failed:" << _bootloader->errorString(); emit error(commandErase, _bootloader->errorString());