Commit e8b45972 authored by Don Gagne's avatar Don Gagne

Better error reporting

parent aaba1308
...@@ -755,6 +755,8 @@ QString QextSerialPort::errorString() ...@@ -755,6 +755,8 @@ QString QextSerialPort::errorString()
return tr("Permission denied"); return tr("Permission denied");
case E_AGAIN: case E_AGAIN:
return tr("Device is already locked"); return tr("Device is already locked");
case E_OS_SPECIFIC:
return tr("OS error: %1").arg(d->lastOSErrString);
default: default:
return tr("Unknown error: %1").arg(d->lastErr); return tr("Unknown error: %1").arg(d->lastErr);
} }
......
...@@ -68,6 +68,7 @@ ...@@ -68,6 +68,7 @@
#define E_FILE_NOT_FOUND 15 #define E_FILE_NOT_FOUND 15
#define E_PERMISSION_DENIED 16 #define E_PERMISSION_DENIED 16
#define E_AGAIN 17 #define E_AGAIN 17
#define E_OS_SPECIFIC 18 // Error did not translate, os error code in lastOSErr
enum BaudRateType enum BaudRateType
{ {
...@@ -201,7 +202,7 @@ public: ...@@ -201,7 +202,7 @@ public:
bool canReadLine() const; bool canReadLine() const;
QByteArray readAll(); QByteArray readAll();
ulong lastError() const; ulong lastError() const; ulong lastOpenOSError() const;
ulong lineStatus(); ulong lineStatus();
QString errorString(); QString errorString();
......
...@@ -197,6 +197,8 @@ public: ...@@ -197,6 +197,8 @@ public:
QextReadBuffer readBuffer; QextReadBuffer readBuffer;
int settingsDirtyFlags; int settingsDirtyFlags;
ulong lastErr; ulong lastErr;
ulong lastOSErr;
QString lastOSErrString;
QextSerialPort::QueryMode queryMode; QextSerialPort::QueryMode queryMode;
// platform specific members // platform specific members
......
...@@ -155,6 +155,11 @@ void QextSerialPortPrivate::translateError(ulong error) ...@@ -155,6 +155,11 @@ void QextSerialPortPrivate::translateError(ulong error)
case EAGAIN: case EAGAIN:
lastErr = E_AGAIN; lastErr = E_AGAIN;
break; break;
default:
lastOSErr = error;
lastOSErrString = strerror(error);
lastErr = E_OS_SPECIFIC;
break;
} }
} }
......
...@@ -106,6 +106,7 @@ bool QextSerialPortPrivate::open_sys(QIODevice::OpenMode mode) ...@@ -106,6 +106,7 @@ bool QextSerialPortPrivate::open_sys(QIODevice::OpenMode mode)
if (queryMode == QextSerialPort::EventDriven) { if (queryMode == QextSerialPort::EventDriven) {
if (!SetCommMask(handle, EV_TXEMPTY | EV_RXCHAR | EV_DSR)) { if (!SetCommMask(handle, EV_TXEMPTY | EV_RXCHAR | EV_DSR)) {
QESP_WARNING()<<"failed to set Comm Mask. Error code:"<<GetLastError(); QESP_WARNING()<<"failed to set Comm Mask. Error code:"<<GetLastError();
translateError(GetLastError());
return false; return false;
} }
winEventNotifier = new QWinEventNotifier(overlap.hEvent, q); winEventNotifier = new QWinEventNotifier(overlap.hEvent, q);
...@@ -115,6 +116,7 @@ bool QextSerialPortPrivate::open_sys(QIODevice::OpenMode mode) ...@@ -115,6 +116,7 @@ bool QextSerialPortPrivate::open_sys(QIODevice::OpenMode mode)
} }
return true; return true;
} }
translateError(GetLastError());
return false; return false;
} }
...@@ -159,30 +161,20 @@ qint64 QextSerialPortPrivate::bytesAvailable_sys() const ...@@ -159,30 +161,20 @@ qint64 QextSerialPortPrivate::bytesAvailable_sys() const
*/ */
void QextSerialPortPrivate::translateError(ulong error) void QextSerialPortPrivate::translateError(ulong error)
{ {
if (error & CE_BREAK) { lastOSErr = error;
lastErr = E_BREAK_CONDITION; lastErr = E_OS_SPECIFIC;
}
else if (error & CE_FRAME) { LPVOID lpMsgBuf;
lastErr = E_FRAMING_ERROR; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
} FORMAT_MESSAGE_FROM_SYSTEM |
else if (error & CE_IOE) { FORMAT_MESSAGE_IGNORE_INSERTS,
lastErr = E_IO_ERROR; NULL,
} error,
else if (error & CE_MODE) { MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
lastErr = E_INVALID_FD; (LPTSTR) &lpMsgBuf,
} 0, NULL);
else if (error & CE_OVERRUN) { lastOSErrString = QString((char*)lpMsgBuf);
lastErr = E_BUFFER_OVERRUN; LocalFree(lpMsgBuf);
}
else if (error & CE_RXPARITY) {
lastErr = E_RECEIVE_PARITY_ERROR;
}
else if (error & CE_RXOVER) {
lastErr = E_RECEIVE_OVERFLOW;
}
else if (error & CE_TXFULL) {
lastErr = E_TRANSMIT_OVERFLOW;
}
} }
/* /*
......
This diff is collapsed.
...@@ -43,9 +43,6 @@ public: ...@@ -43,9 +43,6 @@ public:
/// @brief Returns the error message associated with the last failed call to one of the bootloader /// @brief Returns the error message associated with the last failed call to one of the bootloader
/// utility routine below. /// utility routine below.
QString errorString(void) { return _errorString; } QString errorString(void) { return _errorString; }
static const bool warnOnError = true; ///< call qWarning to log error message on error
static const bool noWarnOnError = false; ///< Don't call qWarning on error
/// @brief Write a byte to the port /// @brief Write a byte to the port
/// @param port Port to write to /// @param port Port to write to
...@@ -58,13 +55,12 @@ public: ...@@ -58,13 +55,12 @@ public:
/// @brief Read a set of bytes from the port /// @brief Read a set of bytes from the port
/// @param data Read bytes into this buffer /// @param data Read bytes into this buffer
/// @param maxSize Number of bytes to read /// @param maxSize Number of bytes to read
/// @param warnOnError true: Log error using qWarning
/// @param readTimeout Msecs to wait for bytes to become available on port /// @param readTimeout Msecs to wait for bytes to become available on port
bool read(QextSerialPort* port, uint8_t* data, qint64 maxSize, bool warnOnError, int readTimeout = _readTimout); bool read(QextSerialPort* port, uint8_t* data, qint64 maxSize, int readTimeout = _readTimout);
/// @brief Read a PROTO_SYNC command response from the bootloader /// @brief Read a PROTO_SYNC command response from the bootloader
/// @param responseTimeout Msecs to wait for response bytes to become available on port /// @param responseTimeout Msecs to wait for response bytes to become available on port
bool getCommandResponse(QextSerialPort* port, bool warnOnError, const int responseTimeout = _responseTimeout); bool getCommandResponse(QextSerialPort* port, const int responseTimeout = _responseTimeout);
/// @brief Send a PROTO_GET_DEVICE command to retrieve a value from the bootloader /// @brief Send a PROTO_GET_DEVICE command to retrieve a value from the bootloader
/// @param param Value to retrieve using INFO_BOARD_* enums /// @param param Value to retrieve using INFO_BOARD_* enums
...@@ -74,7 +70,7 @@ public: ...@@ -74,7 +70,7 @@ public:
/// @brief Send a command to the bootloader /// @brief Send a command to the bootloader
/// @param cmd Command to send using PROTO_* enums /// @param cmd Command to send using PROTO_* enums
/// @return true: Command sent and valid sync response returned /// @return true: Command sent and valid sync response returned
bool sendCommand(QextSerialPort* port, uint8_t cmd, bool warnOnError, int responseTimeout = _responseTimeout); bool sendCommand(QextSerialPort* port, uint8_t cmd, int responseTimeout = _responseTimeout);
/// @brief Program the board with the specified firmware /// @brief Program the board with the specified firmware
bool program(QextSerialPort* port, const QString& firmwareFilename); bool program(QextSerialPort* port, const QString& firmwareFilename);
......
...@@ -121,10 +121,10 @@ void PX4FirmwareUpgradeThreadWorker::_findBoardOnce(void) ...@@ -121,10 +121,10 @@ void PX4FirmwareUpgradeThreadWorker::_findBoardOnce(void)
void PX4FirmwareUpgradeThreadWorker::findBootloader(const QString portName, int msecTimeout) void PX4FirmwareUpgradeThreadWorker::findBootloader(const QString portName, int msecTimeout)
{ {
connect(_timerRetry, &QTimer::timeout, this, &PX4FirmwareUpgradeThreadWorker::_findBootloaderOnce); Q_UNUSED(msecTimeout);
// Once the port shows up, we only try to connect to the bootloader a single time
_portName = portName; _portName = portName;
_timerTimeout->start(msecTimeout);
_elapsed.start();
_findBootloaderOnce(); _findBootloaderOnce();
} }
...@@ -144,28 +144,16 @@ void PX4FirmwareUpgradeThreadWorker::_findBootloaderOnce(void) ...@@ -144,28 +144,16 @@ void PX4FirmwareUpgradeThreadWorker::_findBootloaderOnce(void)
qDebug() << "Found bootloader"; qDebug() << "Found bootloader";
emit foundBootloader(bootloaderVersion, boardID, flashSize); emit foundBootloader(bootloaderVersion, boardID, flashSize);
return; return;
} else {
_closeFind();
_bootloaderPort->close();
_bootloaderPort->deleteLater();
_bootloaderPort = NULL;
qDebug() << "Bootloader Get Board Info error:" << _bootloader->errorString();
emit error(commandBootloader, _bootloader->errorString());
return;
} }
} else {
_closeFind();
_bootloaderPort->close();
_bootloaderPort->deleteLater();
_bootloaderPort = NULL;
qDebug() << "Bootloader sync failed";
emit bootloaderSyncFailed();
return;
} }
} }
emit updateProgress(_elapsed.elapsed(), _timerTimeout->interval()); _closeFind();
_timerRetry->start(); _bootloaderPort->close();
_bootloaderPort->deleteLater();
_bootloaderPort = NULL;
qDebug() << "Bootloader error:" << _bootloader->errorString();
emit error(commandBootloader, _bootloader->errorString());
} }
void PX4FirmwareUpgradeThreadWorker::_closeFind(void) void PX4FirmwareUpgradeThreadWorker::_closeFind(void)
......
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