|
|
@ -53,6 +53,7 @@ const char* LinkManager::_autoconnectUDPKey = "AutoconnectUDP"; |
|
|
|
const char* LinkManager::_autoconnectPixhawkKey = "AutoconnectPixhawk"; |
|
|
|
const char* LinkManager::_autoconnectPixhawkKey = "AutoconnectPixhawk"; |
|
|
|
const char* LinkManager::_autoconnect3DRRadioKey = "Autoconnect3DRRadio"; |
|
|
|
const char* LinkManager::_autoconnect3DRRadioKey = "Autoconnect3DRRadio"; |
|
|
|
const char* LinkManager::_autoconnectPX4FlowKey = "AutoconnectPX4Flow"; |
|
|
|
const char* LinkManager::_autoconnectPX4FlowKey = "AutoconnectPX4Flow"; |
|
|
|
|
|
|
|
const char* LinkManager::_defaultUPDLinkName = "Default UDP Link"; |
|
|
|
|
|
|
|
|
|
|
|
LinkManager::LinkManager(QGCApplication* app) |
|
|
|
LinkManager::LinkManager(QGCApplication* app) |
|
|
|
: QGCTool(app) |
|
|
|
: QGCTool(app) |
|
|
@ -61,7 +62,6 @@ LinkManager::LinkManager(QGCApplication* app) |
|
|
|
, _connectionsSuspended(false) |
|
|
|
, _connectionsSuspended(false) |
|
|
|
, _mavlinkChannelsUsedBitMask(0) |
|
|
|
, _mavlinkChannelsUsedBitMask(0) |
|
|
|
, _mavlinkProtocol(NULL) |
|
|
|
, _mavlinkProtocol(NULL) |
|
|
|
, _autoconnectUDPConfig(NULL) |
|
|
|
|
|
|
|
, _autoconnectUDP(true) |
|
|
|
, _autoconnectUDP(true) |
|
|
|
, _autoconnectPixhawk(true) |
|
|
|
, _autoconnectPixhawk(true) |
|
|
|
, _autoconnect3DRRadio(true) |
|
|
|
, _autoconnect3DRRadio(true) |
|
|
@ -100,7 +100,7 @@ void LinkManager::setToolbox(QGCToolbox *toolbox) |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
LinkInterface* LinkManager::createConnectedLink(LinkConfiguration* config, bool autoconnectLink) |
|
|
|
LinkInterface* LinkManager::createConnectedLink(LinkConfiguration* config) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Q_ASSERT(config); |
|
|
|
Q_ASSERT(config); |
|
|
|
LinkInterface* pLink = NULL; |
|
|
|
LinkInterface* pLink = NULL; |
|
|
@ -126,20 +126,19 @@ LinkInterface* LinkManager::createConnectedLink(LinkConfiguration* config, bool |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
if(pLink) { |
|
|
|
if(pLink) { |
|
|
|
pLink->setAutoconnect(autoconnectLink); |
|
|
|
|
|
|
|
_addLink(pLink); |
|
|
|
_addLink(pLink); |
|
|
|
connectLink(pLink); |
|
|
|
connectLink(pLink); |
|
|
|
} |
|
|
|
} |
|
|
|
return pLink; |
|
|
|
return pLink; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
LinkInterface* LinkManager::createConnectedLink(const QString& name, bool autoconnectLink) |
|
|
|
LinkInterface* LinkManager::createConnectedLink(const QString& name) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Q_ASSERT(name.isEmpty() == false); |
|
|
|
Q_ASSERT(name.isEmpty() == false); |
|
|
|
for(int i = 0; i < _linkConfigurations.count(); i++) { |
|
|
|
for(int i = 0; i < _linkConfigurations.count(); i++) { |
|
|
|
LinkConfiguration* conf = _linkConfigurations.value<LinkConfiguration*>(i); |
|
|
|
LinkConfiguration* conf = _linkConfigurations.value<LinkConfiguration*>(i); |
|
|
|
if(conf && conf->name() == name) |
|
|
|
if(conf && conf->name() == name) |
|
|
|
return createConnectedLink(conf, autoconnectLink); |
|
|
|
return createConnectedLink(conf); |
|
|
|
} |
|
|
|
} |
|
|
|
return NULL; |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
} |
|
|
@ -184,11 +183,11 @@ void LinkManager::_addLink(LinkInterface* link) |
|
|
|
connect(link, &LinkInterface::disconnected, this, &LinkManager::_linkDisconnected); |
|
|
|
connect(link, &LinkInterface::disconnected, this, &LinkManager::_linkDisconnected); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void LinkManager::disconnectAll(bool disconnectAutoconnectLink) |
|
|
|
void LinkManager::disconnectAll(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// Walk list in reverse order to preserve indices during delete
|
|
|
|
// Walk list in reverse order to preserve indices during delete
|
|
|
|
for (int i=_links.count()-1; i>=0; i--) { |
|
|
|
for (int i=_links.count()-1; i>=0; i--) { |
|
|
|
disconnectLink(_links.value<LinkInterface*>(i), disconnectAutoconnectLink); |
|
|
|
disconnectLink(_links.value<LinkInterface*>(i)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -201,36 +200,27 @@ bool LinkManager::connectLink(LinkInterface* link) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool previousAnyConnectedLinks = anyConnectedLinks(); |
|
|
|
bool previousAnyConnectedLinks = anyConnectedLinks(); |
|
|
|
bool previousAnyNonAutoconnectConnectedLinks = anyNonAutoconnectConnectedLinks(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (link->_connect()) { |
|
|
|
if (link->_connect()) { |
|
|
|
if (!previousAnyConnectedLinks) { |
|
|
|
if (!previousAnyConnectedLinks) { |
|
|
|
emit anyConnectedLinksChanged(true); |
|
|
|
emit anyConnectedLinksChanged(true); |
|
|
|
} |
|
|
|
} |
|
|
|
if (!previousAnyNonAutoconnectConnectedLinks && anyNonAutoconnectConnectedLinks()) { |
|
|
|
|
|
|
|
emit anyNonAutoconnectConnectedLinksChanged(true); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool LinkManager::disconnectLink(LinkInterface* link, bool disconnectAutoconnectLink) |
|
|
|
void LinkManager::disconnectLink(LinkInterface* link) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Q_ASSERT(link); |
|
|
|
Q_ASSERT(link); |
|
|
|
|
|
|
|
|
|
|
|
if (disconnectAutoconnectLink || !link->autoconnect()) { |
|
|
|
link->_disconnect(); |
|
|
|
link->_disconnect(); |
|
|
|
LinkConfiguration* config = link->getLinkConfiguration(); |
|
|
|
LinkConfiguration* config = link->getLinkConfiguration(); |
|
|
|
if(config) { |
|
|
|
if(config) { |
|
|
|
config->setLink(NULL); |
|
|
|
config->setLink(NULL); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
_deleteLink(link); |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
_deleteLink(link); |
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void LinkManager::_deleteLink(LinkInterface* link) |
|
|
|
void LinkManager::_deleteLink(LinkInterface* link) |
|
|
@ -420,14 +410,23 @@ void LinkManager::_updateAutoConnectLinks(void) |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (_autoconnectUDP && !_autoconnectUDPConfig) { |
|
|
|
// Re-add UDP if we need to
|
|
|
|
_autoconnectUDPConfig = new UDPConfiguration("Default UDP Link"); |
|
|
|
bool foundUDP = false; |
|
|
|
_autoconnectUDPConfig->setLocalPort(QGC_UDP_LOCAL_PORT); |
|
|
|
for (int i=0; i<_links.count(); i++) { |
|
|
|
_autoconnectUDPConfig->setDynamic(true); |
|
|
|
LinkConfiguration* linkConfig = _links.value<LinkInterface*>(i)->getLinkConfiguration(); |
|
|
|
createConnectedLink(_autoconnectUDPConfig, true /* persistenLink */); |
|
|
|
|
|
|
|
|
|
|
|
if (linkConfig->type() == LinkConfiguration::TypeUdp && linkConfig->name() == _defaultUPDLinkName) { |
|
|
|
|
|
|
|
foundUDP = true; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (!foundUDP) { |
|
|
|
|
|
|
|
UDPConfiguration* udpConfig = new UDPConfiguration(_defaultUPDLinkName); |
|
|
|
|
|
|
|
udpConfig->setLocalPort(QGC_UDP_LOCAL_PORT); |
|
|
|
|
|
|
|
udpConfig->setDynamic(true); |
|
|
|
|
|
|
|
createConnectedLink(udpConfig); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef __ios__ |
|
|
|
#ifndef __ios__ |
|
|
|
QStringList currentPorts; |
|
|
|
QStringList currentPorts; |
|
|
|
QList<QGCSerialPortInfo> portList = QGCSerialPortInfo::availablePorts(); |
|
|
|
QList<QGCSerialPortInfo> portList = QGCSerialPortInfo::availablePorts(); |
|
|
@ -492,7 +491,7 @@ void LinkManager::_updateAutoConnectLinks(void) |
|
|
|
|
|
|
|
|
|
|
|
_autoconnectConfigurations.append(pSerialConfig); |
|
|
|
_autoconnectConfigurations.append(pSerialConfig); |
|
|
|
|
|
|
|
|
|
|
|
createConnectedLink(pSerialConfig, true /* persistenLink */); |
|
|
|
createConnectedLink(pSerialConfig); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -505,19 +504,22 @@ void LinkManager::_updateAutoConnectLinks(void) |
|
|
|
|
|
|
|
|
|
|
|
if (linkConfig) { |
|
|
|
if (linkConfig) { |
|
|
|
if (!currentPorts.contains(linkConfig->portName())) { |
|
|
|
if (!currentPorts.contains(linkConfig->portName())) { |
|
|
|
_confToDelete.append(linkConfig); |
|
|
|
// We don't remove links which are still connected even though at this point the cable may
|
|
|
|
|
|
|
|
// have been pulled. This is due to the fact that whether a serial port goes away from the
|
|
|
|
|
|
|
|
// list when the cable is pulled is OS dependant. By not disconnecting in this case, we keep
|
|
|
|
|
|
|
|
// things working the same across all OS.
|
|
|
|
|
|
|
|
if (!linkConfig->link() || !linkConfig->link()->isConnected()) { |
|
|
|
|
|
|
|
_confToDelete.append(linkConfig); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
qWarning() << "Internal error"; |
|
|
|
qWarning() << "Internal error"; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Now disconnect/remove all links that are gone
|
|
|
|
// Now remove all configs that are gone
|
|
|
|
foreach (LinkConfiguration* pDeleteConfig, _confToDelete) { |
|
|
|
foreach (LinkConfiguration* pDeleteConfig, _confToDelete) { |
|
|
|
LinkInterface* link = pDeleteConfig->link(); |
|
|
|
qCDebug(LinkManagerLog) << "Removing unused autoconnect config" << pDeleteConfig->name(); |
|
|
|
if (link) { |
|
|
|
|
|
|
|
disconnectLink(link, true /* disconnectAutoconnectLink */); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
_autoconnectConfigurations.removeOne(pDeleteConfig); |
|
|
|
_autoconnectConfigurations.removeOne(pDeleteConfig); |
|
|
|
delete pDeleteConfig; |
|
|
|
delete pDeleteConfig; |
|
|
|
} |
|
|
|
} |
|
|
@ -538,21 +540,6 @@ bool LinkManager::anyConnectedLinks(void) |
|
|
|
return found; |
|
|
|
return found; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool LinkManager::anyNonAutoconnectConnectedLinks(void) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
// FIXME: Should remove this duplication with anyConnectedLinks
|
|
|
|
|
|
|
|
bool found = false; |
|
|
|
|
|
|
|
for (int i=0; i<_links.count(); i++) { |
|
|
|
|
|
|
|
LinkInterface* link = _links.value<LinkInterface*>(i); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (link && !link->autoconnect() && link->isConnected()) { |
|
|
|
|
|
|
|
found = true; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return found; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool LinkManager::anyActiveLinks(void) |
|
|
|
bool LinkManager::anyActiveLinks(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
bool found = false; |
|
|
|
bool found = false; |
|
|
@ -567,21 +554,6 @@ bool LinkManager::anyActiveLinks(void) |
|
|
|
return found; |
|
|
|
return found; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool LinkManager::anyNonAutoconnectActiveLinks(void) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
// FIXME: Should remove this duplication with anyActiveLinks
|
|
|
|
|
|
|
|
bool found = false; |
|
|
|
|
|
|
|
for (int i=0; i<_links.count(); i++) { |
|
|
|
|
|
|
|
LinkInterface* link = _links.value<LinkInterface*>(i); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (link && !link->autoconnect() && link->active()) { |
|
|
|
|
|
|
|
found = true; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return found; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void LinkManager::_vehicleHeartbeatInfo(LinkInterface* link, int vehicleId, int vehicleMavlinkVersion, int vehicleFirmwareType, int vehicleType) |
|
|
|
void LinkManager::_vehicleHeartbeatInfo(LinkInterface* link, int vehicleId, int vehicleMavlinkVersion, int vehicleFirmwareType, int vehicleType) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!link->active() && !_ignoreVehicleIds.contains(vehicleId)) { |
|
|
|
if (!link->active() && !_ignoreVehicleIds.contains(vehicleId)) { |
|
|
@ -607,7 +579,6 @@ void LinkManager::_vehicleHeartbeatInfo(LinkInterface* link, int vehicleId, int |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool previousAnyActiveLinks = anyActiveLinks(); |
|
|
|
bool previousAnyActiveLinks = anyActiveLinks(); |
|
|
|
bool previousAnyNonAutoconnectActiveLinks = anyNonAutoconnectActiveLinks(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
link->setActive(true); |
|
|
|
link->setActive(true); |
|
|
|
emit linkActive(link, vehicleId, vehicleFirmwareType, vehicleType); |
|
|
|
emit linkActive(link, vehicleId, vehicleFirmwareType, vehicleType); |
|
|
@ -615,16 +586,13 @@ void LinkManager::_vehicleHeartbeatInfo(LinkInterface* link, int vehicleId, int |
|
|
|
if (!previousAnyActiveLinks) { |
|
|
|
if (!previousAnyActiveLinks) { |
|
|
|
emit anyActiveLinksChanged(true); |
|
|
|
emit anyActiveLinksChanged(true); |
|
|
|
} |
|
|
|
} |
|
|
|
if (!previousAnyNonAutoconnectActiveLinks && anyNonAutoconnectActiveLinks()) { |
|
|
|
|
|
|
|
emit anyNonAutoconnectActiveLinksChanged(true); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void LinkManager::shutdown(void) |
|
|
|
void LinkManager::shutdown(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
setConnectionsSuspended("Shutdown"); |
|
|
|
setConnectionsSuspended("Shutdown"); |
|
|
|
disconnectAll(true /* disconnectAutoconnectLink */); |
|
|
|
disconnectAll(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void LinkManager::setAutoconnectUDP(bool autoconnect) |
|
|
|
void LinkManager::setAutoconnectUDP(bool autoconnect) |
|
|
|