@ -53,6 +53,7 @@ const char* LinkManager::_autoconnectUDPKey = "AutoconnectUDP";
@@ -53,6 +53,7 @@ const char* LinkManager::_autoconnectUDPKey = "AutoconnectUDP";
const char * LinkManager : : _autoconnectPixhawkKey = " AutoconnectPixhawk " ;
const char * LinkManager : : _autoconnect3DRRadioKey = " Autoconnect3DRRadio " ;
const char * LinkManager : : _autoconnectPX4FlowKey = " AutoconnectPX4Flow " ;
const char * LinkManager : : _defaultUPDLinkName = " Default UDP Link " ;
LinkManager : : LinkManager ( QGCApplication * app )
: QGCTool ( app )
@ -61,7 +62,6 @@ LinkManager::LinkManager(QGCApplication* app)
@@ -61,7 +62,6 @@ LinkManager::LinkManager(QGCApplication* app)
, _connectionsSuspended ( false )
, _mavlinkChannelsUsedBitMask ( 0 )
, _mavlinkProtocol ( NULL )
, _autoconnectUDPConfig ( NULL )
, _autoconnectUDP ( true )
, _autoconnectPixhawk ( true )
, _autoconnect3DRRadio ( true )
@ -100,7 +100,7 @@ void LinkManager::setToolbox(QGCToolbox *toolbox)
@@ -100,7 +100,7 @@ void LinkManager::setToolbox(QGCToolbox *toolbox)
}
LinkInterface * LinkManager : : createConnectedLink ( LinkConfiguration * config , bool autoconnectLink )
LinkInterface * LinkManager : : createConnectedLink ( LinkConfiguration * config )
{
Q_ASSERT ( config ) ;
LinkInterface * pLink = NULL ;
@ -126,20 +126,19 @@ LinkInterface* LinkManager::createConnectedLink(LinkConfiguration* config, bool
@@ -126,20 +126,19 @@ LinkInterface* LinkManager::createConnectedLink(LinkConfiguration* config, bool
# endif
}
if ( pLink ) {
pLink - > setAutoconnect ( autoconnectLink ) ;
_addLink ( pLink ) ;
connectLink ( pLink ) ;
}
return pLink ;
}
LinkInterface * LinkManager : : createConnectedLink ( const QString & name , bool autoconnectLink )
LinkInterface * LinkManager : : createConnectedLink ( const QString & name )
{
Q_ASSERT ( name . isEmpty ( ) = = false ) ;
for ( int i = 0 ; i < _linkConfigurations . count ( ) ; i + + ) {
LinkConfiguration * conf = _linkConfigurations . value < LinkConfiguration * > ( i ) ;
if ( conf & & conf - > name ( ) = = name )
return createConnectedLink ( conf , autoconnectLink ) ;
return createConnectedLink ( conf ) ;
}
return NULL ;
}
@ -184,11 +183,11 @@ void LinkManager::_addLink(LinkInterface* link)
@@ -184,11 +183,11 @@ void LinkManager::_addLink(LinkInterface* link)
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
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)
@@ -201,36 +200,27 @@ bool LinkManager::connectLink(LinkInterface* link)
}
bool previousAnyConnectedLinks = anyConnectedLinks ( ) ;
bool previousAnyNonAutoconnectConnectedLinks = anyNonAutoconnectConnectedLinks ( ) ;
if ( link - > _connect ( ) ) {
if ( ! previousAnyConnectedLinks ) {
emit anyConnectedLinksChanged ( true ) ;
}
if ( ! previousAnyNonAutoconnectConnectedLinks & & anyNonAutoconnectConnectedLinks ( ) ) {
emit anyNonAutoconnectConnectedLinksChanged ( true ) ;
}
return true ;
} else {
return false ;
}
}
bool LinkManager : : disconnectLink ( LinkInterface * link , bool disconnectAutoconnectL ink )
void LinkManager : : disconnectLink ( LinkInterface * link )
{
Q_ASSERT ( link ) ;
if ( disconnectAutoconnectLink | | ! link - > autoconnect ( ) ) {
link - > _disconnect ( ) ;
LinkConfiguration * config = link - > getLinkConfiguration ( ) ;
if ( config ) {
config - > setLink ( NULL ) ;
}
_deleteLink ( link ) ;
return true ;
link - > _disconnect ( ) ;
LinkConfiguration * config = link - > getLinkConfiguration ( ) ;
if ( config ) {
config - > setLink ( NULL ) ;
}
return false ;
_deleteLink ( link ) ;
}
void LinkManager : : _deleteLink ( LinkInterface * link )
@ -420,14 +410,23 @@ void LinkManager::_updateAutoConnectLinks(void)
@@ -420,14 +410,23 @@ void LinkManager::_updateAutoConnectLinks(void)
return ;
}
if ( _autoconnectUDP & & ! _autoconnectUDPConfig ) {
_autoconnectUDPConfig = new UDPConfiguration ( " Default UDP Link " ) ;
_autoconnectUDPConfig - > setLocalPort ( QGC_UDP_LOCAL_PORT ) ;
_autoconnectUDPConfig - > setDynamic ( true ) ;
createConnectedLink ( _autoconnectUDPConfig , true /* persistenLink */ ) ;
// Re-add UDP if we need to
bool foundUDP = false ;
for ( int i = 0 ; i < _links . count ( ) ; i + + ) {
LinkConfiguration * linkConfig = _links . value < LinkInterface * > ( i ) - > getLinkConfiguration ( ) ;
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__
QStringList currentPorts ;
QList < QGCSerialPortInfo > portList = QGCSerialPortInfo : : availablePorts ( ) ;
@ -492,7 +491,7 @@ void LinkManager::_updateAutoConnectLinks(void)
@@ -492,7 +491,7 @@ void LinkManager::_updateAutoConnectLinks(void)
_autoconnectConfigurations . append ( pSerialConfig ) ;
createConnectedLink ( pSerialConfig , true /* persistenLink */ ) ;
createConnectedLink ( pSerialConfig ) ;
}
}
}
@ -505,19 +504,22 @@ void LinkManager::_updateAutoConnectLinks(void)
@@ -505,19 +504,22 @@ void LinkManager::_updateAutoConnectLinks(void)
if ( linkConfig ) {
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 {
qWarning ( ) < < " Internal error " ;
}
}
// Now disconnect/remove all link s that are gone
// Now remove all config s that are gone
foreach ( LinkConfiguration * pDeleteConfig , _confToDelete ) {
LinkInterface * link = pDeleteConfig - > link ( ) ;
if ( link ) {
disconnectLink ( link , true /* disconnectAutoconnectLink */ ) ;
}
qCDebug ( LinkManagerLog ) < < " Removing unused autoconnect config " < < pDeleteConfig - > name ( ) ;
_autoconnectConfigurations . removeOne ( pDeleteConfig ) ;
delete pDeleteConfig ;
}
@ -538,21 +540,6 @@ bool LinkManager::anyConnectedLinks(void)
@@ -538,21 +540,6 @@ bool LinkManager::anyConnectedLinks(void)
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 found = false ;
@ -567,21 +554,6 @@ bool LinkManager::anyActiveLinks(void)
@@ -567,21 +554,6 @@ bool LinkManager::anyActiveLinks(void)
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 )
{
if ( ! link - > active ( ) & & ! _ignoreVehicleIds . contains ( vehicleId ) ) {
@ -607,7 +579,6 @@ void LinkManager::_vehicleHeartbeatInfo(LinkInterface* link, int vehicleId, int
@@ -607,7 +579,6 @@ void LinkManager::_vehicleHeartbeatInfo(LinkInterface* link, int vehicleId, int
}
bool previousAnyActiveLinks = anyActiveLinks ( ) ;
bool previousAnyNonAutoconnectActiveLinks = anyNonAutoconnectActiveLinks ( ) ;
link - > setActive ( true ) ;
emit linkActive ( link , vehicleId , vehicleFirmwareType , vehicleType ) ;
@ -615,16 +586,13 @@ void LinkManager::_vehicleHeartbeatInfo(LinkInterface* link, int vehicleId, int
@@ -615,16 +586,13 @@ void LinkManager::_vehicleHeartbeatInfo(LinkInterface* link, int vehicleId, int
if ( ! previousAnyActiveLinks ) {
emit anyActiveLinksChanged ( true ) ;
}
if ( ! previousAnyNonAutoconnectActiveLinks & & anyNonAutoconnectActiveLinks ( ) ) {
emit anyNonAutoconnectActiveLinksChanged ( true ) ;
}
}
}
void LinkManager : : shutdown ( void )
{
setConnectionsSuspended ( " Shutdown " ) ;
disconnectAll ( true /* disconnectAutoconnectLink */ ) ;
disconnectAll ( ) ;
}
void LinkManager : : setAutoconnectUDP ( bool autoconnect )