|
|
|
@ -1516,13 +1516,33 @@ void Vehicle::_updatePriorityLink(void)
@@ -1516,13 +1516,33 @@ void Vehicle::_updatePriorityLink(void)
|
|
|
|
|
{ |
|
|
|
|
LinkInterface* newPriorityLink = NULL; |
|
|
|
|
|
|
|
|
|
#ifndef NO_SERIAL_LINK |
|
|
|
|
// Note that this routine specificallty does not clear _priorityLink when there are no links remaining.
|
|
|
|
|
// This routine specifically does not clear _priorityLink when there are no links remaining.
|
|
|
|
|
// By doing this we hold a reference on the last link as the Vehicle shuts down. Thus preventing shutdown
|
|
|
|
|
// ordering NULL pointer crashes where priorityLink() is still called during shutdown sequence.
|
|
|
|
|
if (_links.count() == 0) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Check for the existing priority link to still be valid
|
|
|
|
|
for (int i=0; i<_links.count(); i++) { |
|
|
|
|
if (_priorityLink.data() == _links[i]) { |
|
|
|
|
if (!_priorityLink.data()->highLatency()) { |
|
|
|
|
// Link is still valid. Continue to use it unless it is high latency. In that case we still look for a better
|
|
|
|
|
// link to use as priority link.
|
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// The previous priority link is no longer valid. We must no find the best link available in this priority order:
|
|
|
|
|
// Direct USB connection
|
|
|
|
|
// Not a high latency link
|
|
|
|
|
// Any link
|
|
|
|
|
|
|
|
|
|
#ifndef NO_SERIAL_LINK |
|
|
|
|
// Search for direct usb connection
|
|
|
|
|
for (int i=0; i<_links.count(); i++) { |
|
|
|
|
LinkInterface* link = _links[i]; |
|
|
|
|
if (link->isConnected()) { |
|
|
|
|
SerialLink* pSerialLink = qobject_cast<SerialLink*>(link); |
|
|
|
|
if (pSerialLink) { |
|
|
|
|
LinkConfiguration* config = pSerialLink->getLinkConfiguration(); |
|
|
|
@ -1538,17 +1558,26 @@ void Vehicle::_updatePriorityLink(void)
@@ -1538,17 +1558,26 @@ void Vehicle::_updatePriorityLink(void)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
if (!newPriorityLink && !_priorityLink.data() && _links.count()) { |
|
|
|
|
if (!newPriorityLink) { |
|
|
|
|
// Search for non-high latency link
|
|
|
|
|
for (int i=0; i<_links.count(); i++) { |
|
|
|
|
LinkInterface* link = _links[i]; |
|
|
|
|
if (!link->highLatency()) { |
|
|
|
|
newPriorityLink = link; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!newPriorityLink) { |
|
|
|
|
// Use any link
|
|
|
|
|
newPriorityLink = _links[0]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (newPriorityLink) { |
|
|
|
|
_priorityLink = _toolbox->linkManager()->sharedLinkInterfacePointerForLink(newPriorityLink); |
|
|
|
|
_updateHighLatencyLink(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Vehicle::_updateAttitude(UASInterface*, double roll, double pitch, double yaw, quint64) |
|
|
|
|