From 6184126f8b9922b2e4781c10b8b155bfa0e9704e Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sat, 14 Nov 2015 16:43:35 -0800 Subject: [PATCH] Add requiresUSBMavlinkStart support --- src/comm/LinkInterface.h | 3 +++ src/comm/MAVLinkProtocol.cc | 18 ++++++++++-------- src/comm/SerialLink.cc | 12 ++++++++++-- src/comm/SerialLink.h | 3 ++- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/comm/LinkInterface.h b/src/comm/LinkInterface.h index 68bcf9f27..63ce51d78 100644 --- a/src/comm/LinkInterface.h +++ b/src/comm/LinkInterface.h @@ -125,6 +125,9 @@ public: /// set into the link when it is added to LinkManager uint8_t getMavlinkChannel(void) const { Q_ASSERT(_mavlinkChannelSet); return _mavlinkChannel; } + /// @return true: "sh /etc/init.d/rc.usb" must be sent on link to start mavlink + virtual bool requiresUSBMavlinkStart(void) const { return false; } + // These are left unimplemented in order to cause linker errors which indicate incorrect usage of // connect/disconnect on link directly. All connect/disconnect calls should be made through LinkManager. bool connect(void); diff --git a/src/comm/MAVLinkProtocol.cc b/src/comm/MAVLinkProtocol.cc index 42c3552ce..af6b42128 100644 --- a/src/comm/MAVLinkProtocol.cc +++ b/src/comm/MAVLinkProtocol.cc @@ -200,14 +200,16 @@ void MAVLinkProtocol::_linkStatusChanged(LinkInterface* link, bool connected) // Use the same shared pointer as LinkManager _connectedLinks.append(_linkMgr->sharedPointerForLink(link)); - // Send command to start MAVLink - // XXX hacky but safe - // Start NSH - const char init[] = {0x0d, 0x0d, 0x0d, 0x0d}; - link->writeBytes(init, sizeof(init)); - const char* cmd = "sh /etc/init.d/rc.usb\n"; - link->writeBytes(cmd, strlen(cmd)); - link->writeBytes(init, 4); + if (link->requiresUSBMavlinkStart()) { + // Send command to start MAVLink + // XXX hacky but safe + // Start NSH + const char init[] = {0x0d, 0x0d, 0x0d, 0x0d}; + link->writeBytes(init, sizeof(init)); + const char* cmd = "sh /etc/init.d/rc.usb\n"; + link->writeBytes(cmd, strlen(cmd)); + link->writeBytes(init, 4); + } } else { bool found = false; for (int i=0; i<_connectedLinks.count(); i++) { diff --git a/src/comm/SerialLink.cc b/src/comm/SerialLink.cc index 4541f893d..a19296ac1 100644 --- a/src/comm/SerialLink.cc +++ b/src/comm/SerialLink.cc @@ -15,10 +15,8 @@ #ifdef __android__ #include "qserialport.h" -#include "qserialportinfo.h" #else #include -#include #endif #include "SerialLink.h" @@ -26,6 +24,7 @@ #include "MG.h" #include "QGCLoggingCategory.h" #include "QGCApplication.h" +#include "QGCSerialPortInfo.h" QGC_LOGGING_CATEGORY(SerialLinkLog, "SerialLinkLog") @@ -380,6 +379,15 @@ LinkConfiguration* SerialLink::getLinkConfiguration() return _config; } +bool SerialLink::requiresUSBMavlinkStart(void) const +{ + if (_port) { + return QGCSerialPortInfo(*_port).boardTypePixhawk(); + } else { + return false; + } +} + //-------------------------------------------------------------------------- //-- SerialConfiguration diff --git a/src/comm/SerialLink.h b/src/comm/SerialLink.h index fbbeeea39..49baceaad 100644 --- a/src/comm/SerialLink.h +++ b/src/comm/SerialLink.h @@ -119,7 +119,8 @@ public: void requestReset(); bool isConnected() const; qint64 getConnectionSpeed() const; - + bool requiresUSBMavlinkStart(void) const; + // These are left unimplemented in order to cause linker errors which indicate incorrect usage of // connect/disconnect on link directly. All connect/disconnect calls should be made through LinkManager. bool connect(void); -- 2.22.0