Browse Source

Don't show resource busy errors from auto connect attempt

QGC4.4
Don Gagne 10 years ago
parent
commit
95f54af964
  1. 37
      src/comm/SerialLink.cc
  2. 3
      src/comm/SerialLink.h

37
src/comm/SerialLink.cc

@ -154,28 +154,30 @@ bool SerialLink::_connect(void)
qgcApp()->toolbox()->linkManager()->suspendConfigurationUpdates(true); qgcApp()->toolbox()->linkManager()->suspendConfigurationUpdates(true);
#endif #endif
QSerialPort::SerialPortError error;
QString errorString;
// Initialize the connection // Initialize the connection
if (!_hardwareConnect(_type)) { if (!_hardwareConnect(error, errorString)) {
// Need to error out here. if (qgcApp()->toolbox()->linkManager()->isAutoconnectLink(this)) {
QString err("Could not create port."); // Be careful with spitting out open error related to trying to open a busy port using autoconnect
if (_port) { if (error == QSerialPort::PermissionError) {
err = _port->errorString(); // Device already open, ignore and fail connect
return false;
}
} }
_emitLinkError("Error connecting: " + err);
_emitLinkError(QString("Error connecting: Could not create port. %1").arg(errorString));
return false; return false;
} }
return true; return true;
} }
/** /// Performs the actual hardware port connection.
* @brief This function is called indirectly by the _connect() call. /// @param[out] error if failed
* /// @param[out] error string if failed
* The _connect() function starts the thread and indirectly calls this method. /// @return success/fail
* bool SerialLink::_hardwareConnect(QSerialPort::SerialPortError& error, QString& errorString)
* @return True if the connection could be established, false otherwise
* @see _connect() For the right function to establish the connection.
**/
bool SerialLink::_hardwareConnect(QString &type)
{ {
if (_port) { if (_port) {
qCDebug(SerialLinkLog) << "SerialLink:" << QString::number((long)this, 16) << "closing port"; qCDebug(SerialLinkLog) << "SerialLink:" << QString::number((long)this, 16) << "closing port";
@ -235,6 +237,9 @@ bool SerialLink::_hardwareConnect(QString &type)
} }
#endif #endif
if (!_port->isOpen() ) { if (!_port->isOpen() ) {
qDebug() << "open failed" << _port->errorString() << _port->error() << getName() << qgcApp()->toolbox()->linkManager()->isAutoconnectLink(this);
error = _port->error();
errorString = _port->errorString();
emit communicationUpdate(getName(),"Error opening port: " + _port->errorString()); emit communicationUpdate(getName(),"Error opening port: " + _port->errorString());
_port->close(); _port->close();
delete _port; delete _port;
@ -252,7 +257,7 @@ bool SerialLink::_hardwareConnect(QString &type)
emit communicationUpdate(getName(), "Opened port!"); emit communicationUpdate(getName(), "Opened port!");
emit connected(); emit connected();
qCDebug(SerialLinkLog) << "CONNECTING LINK: " << __FILE__ << __LINE__ << "type:" << type << "with settings" << _config->portName() qCDebug(SerialLinkLog) << "Connection SeriaLink: " << "with settings" << _config->portName()
<< _config->baud() << _config->dataBits() << _config->parity() << _config->stopBits(); << _config->baud() << _config->dataBits() << _config->parity() << _config->stopBits();
return true; // successful connection return true; // successful connection

3
src/comm/SerialLink.h

@ -152,7 +152,6 @@ protected:
int _timeout; int _timeout;
QMutex _dataMutex; // Mutex for reading data from _port QMutex _dataMutex; // Mutex for reading data from _port
QMutex _writeMutex; // Mutex for accessing the _transmitBuffer. QMutex _writeMutex; // Mutex for accessing the _transmitBuffer.
QString _type;
private slots: private slots:
void _readBytes(void); void _readBytes(void);
@ -168,7 +167,7 @@ private:
// Internal methods // Internal methods
void _emitLinkError(const QString& errorMsg); void _emitLinkError(const QString& errorMsg);
bool _hardwareConnect(QString &_type); bool _hardwareConnect(QSerialPort::SerialPortError& error, QString& errorString);
bool _isBootloader(); bool _isBootloader();
void _resetConfiguration(); void _resetConfiguration();

Loading…
Cancel
Save