Commit df27e66b authored by Gus Grubba's avatar Gus Grubba

IP and RTSP Settings

Remove telemetry heartbeats
parent c6a366bf
...@@ -168,14 +168,39 @@ TaisyncManager::setToolbox(QGCToolbox* toolbox) ...@@ -168,14 +168,39 @@ TaisyncManager::setToolbox(QGCToolbox* toolbox)
_reset(); _reset();
} }
//-----------------------------------------------------------------------------
bool
TaisyncManager::setRTSPSettings(QString uri, QString account, QString password)
{
if(_taiSettings) {
return _taiSettings->setRTSPSettings(uri, account, password);
}
return false;
}
//-----------------------------------------------------------------------------
bool
TaisyncManager::setIPSettings(QString localIP, QString remoteIP, QString netMask)
{
#if !defined(__ios__) && !defined(__android__)
if(_taiSettings) {
return _taiSettings->setIPSettings(localIP, remoteIP, netMask);
}
#endif
return false;
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void void
TaisyncManager::_radioSettingsChanged(QVariant) TaisyncManager::_radioSettingsChanged(QVariant)
{ {
if(_taiSettings) { if(_taiSettings) {
_workTimer.stop();
_taiSettings->setRadioSettings( _taiSettings->setRadioSettings(
_radioModeList[_radioMode->rawValue().toInt()], _radioModeList[_radioMode->rawValue().toInt()],
_radioChannel->enumStringValue()); _radioChannel->enumStringValue());
_reqMask |= REQ_RADIO_SETTINGS;
_workTimer.start(3000);
} }
} }
...@@ -184,10 +209,13 @@ void ...@@ -184,10 +209,13 @@ void
TaisyncManager::_videoSettingsChanged(QVariant) TaisyncManager::_videoSettingsChanged(QVariant)
{ {
if(_taiSettings) { if(_taiSettings) {
_workTimer.stop();
_taiSettings->setVideoSettings( _taiSettings->setVideoSettings(
_videoOutputList[_videoOutput->rawValue().toInt()], _videoOutputList[_videoOutput->rawValue().toInt()],
_videoMode->enumStringValue(), _videoMode->enumStringValue(),
_videoRateList[_videoRate->rawValue().toInt()]); _videoRateList[_videoRate->rawValue().toInt()]);
_reqMask |= REQ_VIDEO_SETTINGS;
_workTimer.start(500);
} }
} }
...@@ -209,6 +237,7 @@ TaisyncManager::_setEnabled() ...@@ -209,6 +237,7 @@ TaisyncManager::_setEnabled()
_taiTelemetery->start(); _taiTelemetery->start();
} }
#endif #endif
_reqMask = REQ_ALL;
_workTimer.start(1000); _workTimer.start(1000);
} else { } else {
//-- Stop everything //-- Stop everything
...@@ -326,24 +355,38 @@ TaisyncManager::_checkTaisync() ...@@ -326,24 +355,38 @@ TaisyncManager::_checkTaisync()
_taiSettings->start(); _taiSettings->start();
} }
} else { } else {
if(++_currReq >= REQ_LAST) { while(true) {
_currReq = REQ_LINK_STATUS; if (_reqMask & REQ_LINK_STATUS) {
} _taiSettings->requestLinkStatus();
switch(_currReq) { break;
case REQ_LINK_STATUS: }
_taiSettings->requestLinkStatus(); if (_reqMask & REQ_DEV_INFO) {
break; _taiSettings->requestDevInfo();
case REQ_DEV_INFO: break;
_taiSettings->requestDevInfo(); }
break; if (_reqMask & REQ_FREQ_SCAN) {
case REQ_FREQ_SCAN: _reqMask |= ~static_cast<uint32_t>(REQ_FREQ_SCAN);
_taiSettings->requestFreqScan(); _taiSettings->requestFreqScan();
break; break;
case REQ_VIDEO_SETTINGS: }
_taiSettings->requestVideoSettings(); if (_reqMask & REQ_VIDEO_SETTINGS) {
break; _taiSettings->requestVideoSettings();
case REQ_RADIO_SETTINGS: break;
_taiSettings->requestRadioSettings(); }
if (_reqMask & REQ_RADIO_SETTINGS) {
_taiSettings->requestRadioSettings();
break;
}
if (_reqMask & REQ_RTSP_SETTINGS) {
_reqMask |= ~static_cast<uint32_t>(REQ_RTSP_SETTINGS);
_taiSettings->requestRTSPURISettings();
break;
}
if (_reqMask & REQ_IP_SETTINGS) {
_reqMask |= ~static_cast<uint32_t>(REQ_IP_SETTINGS);
_taiSettings->requestIPSettings();
break;
}
break; break;
} }
} }
...@@ -365,6 +408,7 @@ TaisyncManager::_updateSettings(QByteArray jSonData) ...@@ -365,6 +408,7 @@ TaisyncManager::_updateSettings(QByteArray jSonData)
QJsonObject jObj = doc.object(); QJsonObject jObj = doc.object();
//-- Link Status? //-- Link Status?
if(jSonData.contains("\"flight\":")) { if(jSonData.contains("\"flight\":")) {
_reqMask |= ~static_cast<uint32_t>(REQ_LINK_STATUS);
bool tlinkConnected = jObj["flight"].toString("") == "online"; bool tlinkConnected = jObj["flight"].toString("") == "online";
if(tlinkConnected != _linkConnected) { if(tlinkConnected != _linkConnected) {
_linkConnected = tlinkConnected; _linkConnected = tlinkConnected;
...@@ -381,6 +425,7 @@ TaisyncManager::_updateSettings(QByteArray jSonData) ...@@ -381,6 +425,7 @@ TaisyncManager::_updateSettings(QByteArray jSonData)
} }
//-- Device Info? //-- Device Info?
} else if(jSonData.contains("\"firmwareversion\":")) { } else if(jSonData.contains("\"firmwareversion\":")) {
_reqMask |= ~static_cast<uint32_t>(REQ_DEV_INFO);
QString tfwVersion = jObj["firmwareversion"].toString(_fwVersion); QString tfwVersion = jObj["firmwareversion"].toString(_fwVersion);
QString tserialNumber = jObj["sn"].toString(_serialNumber); QString tserialNumber = jObj["sn"].toString(_serialNumber);
if(tfwVersion != _fwVersion || tserialNumber != _serialNumber) { if(tfwVersion != _fwVersion || tserialNumber != _serialNumber) {
...@@ -390,6 +435,7 @@ TaisyncManager::_updateSettings(QByteArray jSonData) ...@@ -390,6 +435,7 @@ TaisyncManager::_updateSettings(QByteArray jSonData)
} }
//-- Radio Settings? //-- Radio Settings?
} else if(jSonData.contains("\"freq\":")) { } else if(jSonData.contains("\"freq\":")) {
_reqMask |= ~static_cast<uint32_t>(REQ_RADIO_SETTINGS);
int idx = _radioModeList.indexOf(jObj["mode"].toString(_radioMode->enumStringValue())); int idx = _radioModeList.indexOf(jObj["mode"].toString(_radioMode->enumStringValue()));
if(idx >= 0) _radioMode->_containerSetRawValue(idx); if(idx >= 0) _radioMode->_containerSetRawValue(idx);
idx = _radioChannel->valueIndex(jObj["freq"].toString(_radioChannel->enumStringValue())); idx = _radioChannel->valueIndex(jObj["freq"].toString(_radioChannel->enumStringValue()));
...@@ -397,6 +443,7 @@ TaisyncManager::_updateSettings(QByteArray jSonData) ...@@ -397,6 +443,7 @@ TaisyncManager::_updateSettings(QByteArray jSonData)
_radioChannel->_containerSetRawValue(idx); _radioChannel->_containerSetRawValue(idx);
//-- Video Settings? //-- Video Settings?
} else if(jSonData.contains("\"maxbitrate\":")) { } else if(jSonData.contains("\"maxbitrate\":")) {
_reqMask |= ~static_cast<uint32_t>(REQ_VIDEO_SETTINGS);
int idx; int idx;
idx = _videoMode->valueIndex(jObj["mode"].toString(_videoMode->enumStringValue())); idx = _videoMode->valueIndex(jObj["mode"].toString(_videoMode->enumStringValue()));
if(idx < 0) idx = 0; if(idx < 0) idx = 0;
...@@ -405,5 +452,41 @@ TaisyncManager::_updateSettings(QByteArray jSonData) ...@@ -405,5 +452,41 @@ TaisyncManager::_updateSettings(QByteArray jSonData)
if(idx >= 0) _videoRate->_containerSetRawValue(idx); if(idx >= 0) _videoRate->_containerSetRawValue(idx);
idx = _videoOutputList.indexOf(jObj["decode"].toString(_videoOutput->enumStringValue())); idx = _videoOutputList.indexOf(jObj["decode"].toString(_videoOutput->enumStringValue()));
if(idx >= 0) _videoOutput->_containerSetRawValue(idx); if(idx >= 0) _videoOutput->_containerSetRawValue(idx);
//-- IP Address Settings?
} else if(jSonData.contains("\"usbEthIp\":")) {
QString value;
value = jObj["ipaddr"].toString(_localIPAddr);
if(value != _localIPAddr) {
_localIPAddr = value;
emit localIPAddrChanged();
}
value = jObj["netmask"].toString(_netMask);
if(value != _netMask) {
_netMask = value;
emit netMaskChanged();
}
value = jObj["usbEthIp"].toString(_remoteIPAddr);
if(value != _remoteIPAddr) {
_remoteIPAddr = value;
emit remoteIPAddrChanged();
}
//-- RTSP URI Settings?
} else if(jSonData.contains("\"rtspURI\":")) {
QString value;
value = jObj["rtspURI"].toString(_rtspURI);
if(value != _rtspURI) {
_rtspURI = value;
emit rtspURIChanged();
}
value = jObj["account"].toString(_rtspAccount);
if(value != _rtspAccount) {
_rtspAccount = value;
emit rtspAccountChanged();
}
value = jObj["passwd"].toString(_rtspPassword);
if(value != _rtspPassword) {
_rtspPassword = value;
emit rtspPasswordChanged();
}
} }
} }
...@@ -41,6 +41,15 @@ public: ...@@ -41,6 +41,15 @@ public:
Q_PROPERTY(Fact* videoOutput READ videoOutput CONSTANT) Q_PROPERTY(Fact* videoOutput READ videoOutput CONSTANT)
Q_PROPERTY(Fact* videoMode READ videoMode CONSTANT) Q_PROPERTY(Fact* videoMode READ videoMode CONSTANT)
Q_PROPERTY(Fact* videoRate READ videoRate CONSTANT) Q_PROPERTY(Fact* videoRate READ videoRate CONSTANT)
Q_PROPERTY(QString rtspURI READ rtspURI NOTIFY rtspURIChanged)
Q_PROPERTY(QString rtspAccount READ rtspAccount NOTIFY rtspAccountChanged)
Q_PROPERTY(QString rtspPassword READ rtspPassword NOTIFY rtspPasswordChanged)
Q_PROPERTY(QString localIPAddr READ localIPAddr NOTIFY localIPAddrChanged)
Q_PROPERTY(QString remoteIPAddr READ remoteIPAddr NOTIFY remoteIPAddrChanged)
Q_PROPERTY(QString netMask READ netMask NOTIFY netMaskChanged)
Q_INVOKABLE bool setRTSPSettings (QString uri, QString account, QString password);
Q_INVOKABLE bool setIPSettings (QString localIP, QString remoteIP, QString netMask);
explicit TaisyncManager (QGCApplication* app, QGCToolbox* toolbox); explicit TaisyncManager (QGCApplication* app, QGCToolbox* toolbox);
~TaisyncManager () override; ~TaisyncManager () override;
...@@ -59,6 +68,12 @@ public: ...@@ -59,6 +68,12 @@ public:
Fact* videoOutput () { return _videoOutput; } Fact* videoOutput () { return _videoOutput; }
Fact* videoMode () { return _videoMode; } Fact* videoMode () { return _videoMode; }
Fact* videoRate () { return _videoRate; } Fact* videoRate () { return _videoRate; }
QString rtspURI () { return _rtspURI; }
QString rtspAccount () { return _rtspAccount; }
QString rtspPassword () { return _rtspPassword; }
QString localIPAddr () { return _localIPAddr; }
QString remoteIPAddr () { return _remoteIPAddr; }
QString netMask () { return _netMask; }
signals: signals:
void linkChanged (); void linkChanged ();
...@@ -67,6 +82,12 @@ signals: ...@@ -67,6 +82,12 @@ signals:
void connectedChanged (); void connectedChanged ();
void decodeIndexChanged (); void decodeIndexChanged ();
void rateIndexChanged (); void rateIndexChanged ();
void rtspURIChanged ();
void rtspAccountChanged ();
void rtspPasswordChanged ();
void localIPAddrChanged ();
void remoteIPAddrChanged ();
void netMaskChanged ();
private slots: private slots:
void _connected (); void _connected ();
...@@ -90,15 +111,17 @@ private: ...@@ -90,15 +111,17 @@ private:
private: private:
enum { enum {
REQ_LINK_STATUS, REQ_LINK_STATUS = 1,
REQ_DEV_INFO, REQ_DEV_INFO = 2,
REQ_FREQ_SCAN, REQ_FREQ_SCAN = 4,
REQ_VIDEO_SETTINGS, REQ_VIDEO_SETTINGS = 8,
REQ_RADIO_SETTINGS, REQ_RADIO_SETTINGS = 16,
REQ_LAST REQ_RTSP_SETTINGS = 32,
REQ_IP_SETTINGS = 64,
REQ_ALL = 0xFFFFFFFF,
}; };
int _currReq = REQ_LAST; uint32_t _reqMask = REQ_ALL;
bool _running = false; bool _running = false;
bool _isConnected = false; bool _isConnected = false;
AppSettings* _appSettings = nullptr; AppSettings* _appSettings = nullptr;
...@@ -134,4 +157,10 @@ private: ...@@ -134,4 +157,10 @@ private:
QStringList _radioModeList; QStringList _radioModeList;
QStringList _videoOutputList; QStringList _videoOutputList;
QStringList _videoRateList; QStringList _videoRateList;
QString _rtspURI;
QString _rtspAccount;
QString _rtspPassword;
QString _localIPAddr;
QString _remoteIPAddr;
QString _netMask;
}; };
...@@ -22,6 +22,10 @@ static const char* kPostReq = ...@@ -22,6 +22,10 @@ static const char* kPostReq =
static const char* kGetReq = "GET %1 HTTP/1.1\r\n\r\n"; static const char* kGetReq = "GET %1 HTTP/1.1\r\n\r\n";
static const char* kRadioURI = "/v1/radio.json"; static const char* kRadioURI = "/v1/radio.json";
static const char* kVideoURI = "/v1/video.json"; static const char* kVideoURI = "/v1/video.json";
static const char* kRTSPURI = "/v1/rtspuri.json";
#if !defined(__ios__) && !defined(__android__)
static const char* kIPAddrURI = "/v1/ipaddr.json";
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
TaisyncSettings::TaisyncSettings(QObject* parent) TaisyncSettings::TaisyncSettings(QObject* parent)
...@@ -75,6 +79,22 @@ TaisyncSettings::requestRadioSettings() ...@@ -75,6 +79,22 @@ TaisyncSettings::requestRadioSettings()
return _request(kRadioURI); return _request(kRadioURI);
} }
//-----------------------------------------------------------------------------
#if !defined(__ios__) && !defined(__android__)
bool
TaisyncSettings::requestIPSettings()
{
return _request(kIPAddrURI);
}
#endif
//-----------------------------------------------------------------------------
bool
TaisyncSettings::requestRTSPURISettings()
{
return _request(kRTSPURI);
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool bool
TaisyncSettings::_request(const QString& request) TaisyncSettings::_request(const QString& request)
...@@ -119,6 +139,26 @@ TaisyncSettings::setVideoSettings(const QString& output, const QString& mode, co ...@@ -119,6 +139,26 @@ TaisyncSettings::setVideoSettings(const QString& output, const QString& mode, co
return _post(kVideoURI, post); return _post(kVideoURI, post);
} }
//-----------------------------------------------------------------------------
bool
TaisyncSettings::setRTSPSettings(const QString& uri, const QString& account, const QString& password)
{
static const char* kRTSPPost = "{\"rtspURI\":\"%1\",\"account\":\"%2\",\"passwd\":\"%3\"}";
QString post = QString(kRTSPPost).arg(uri).arg(account).arg(password);
return _post(kRTSPURI, post);
}
//-----------------------------------------------------------------------------
#if !defined(__ios__) && !defined(__android__)
bool
TaisyncSettings::setIPSettings(const QString& localIP, const QString& remoteIP, const QString& netMask)
{
static const char* kRTSPPost = "{\"ipaddr\":\"%1\",\"netmask\":\"%2\",\"usbEthIp\":\"%3\"}";
QString post = QString(kRTSPPost).arg(localIP).arg(netMask).arg(remoteIP);
return _post(kIPAddrURI, post);
}
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void void
TaisyncSettings::_readBytes() TaisyncSettings::_readBytes()
......
...@@ -22,8 +22,16 @@ public: ...@@ -22,8 +22,16 @@ public:
bool requestFreqScan (); bool requestFreqScan ();
bool requestVideoSettings (); bool requestVideoSettings ();
bool requestRadioSettings (); bool requestRadioSettings ();
#if !defined(__ios__) && !defined(__android__)
bool requestIPSettings ();
#endif
bool requestRTSPURISettings ();
bool setRadioSettings (const QString& mode, const QString& channel); bool setRadioSettings (const QString& mode, const QString& channel);
bool setVideoSettings (const QString& output, const QString& mode, const QString& rate); bool setVideoSettings (const QString& output, const QString& mode, const QString& rate);
bool setRTSPSettings (const QString& uri, const QString& account, const QString& password);
#if !defined(__ios__) && !defined(__android__)
bool setIPSettings (const QString& localIP, const QString& remoteIP, const QString& netMask);
#endif
signals: signals:
void updateSettings (QByteArray jSonData); void updateSettings (QByteArray jSonData);
......
...@@ -22,10 +22,6 @@ TaisyncTelemetry::TaisyncTelemetry(QObject* parent) ...@@ -22,10 +22,6 @@ TaisyncTelemetry::TaisyncTelemetry(QObject* parent)
bool bool
TaisyncTelemetry::close() TaisyncTelemetry::close()
{ {
if(_mavlinkChannel >= 0) {
qgcApp()->toolbox()->linkManager()->_freeMavlinkChannel(_mavlinkChannel);
_mavlinkChannel = -1;
}
if(TaisyncHandler::close()) { if(TaisyncHandler::close()) {
qCDebug(TaisyncLog) << "Close Taisync Telemetry"; qCDebug(TaisyncLog) << "Close Taisync Telemetry";
return true; return true;
...@@ -37,15 +33,7 @@ TaisyncTelemetry::close() ...@@ -37,15 +33,7 @@ TaisyncTelemetry::close()
bool TaisyncTelemetry::start() bool TaisyncTelemetry::start()
{ {
qCDebug(TaisyncLog) << "Start Taisync Telemetry"; qCDebug(TaisyncLog) << "Start Taisync Telemetry";
if(_start(TAISYNC_TELEM_PORT)) { return _start(TAISYNC_TELEM_PORT);
_mavlinkChannel = qgcApp()->toolbox()->linkManager()->_reserveMavlinkChannel();
_heartbeatTimer.setInterval(1000);
_heartbeatTimer.setSingleShot(false);
connect(&_heartbeatTimer, &QTimer::timeout, this, &TaisyncTelemetry::_sendGCSHeartbeat);
_heartbeatTimer.start();
return true;
}
return false;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
...@@ -69,36 +57,8 @@ TaisyncTelemetry::_newConnection() ...@@ -69,36 +57,8 @@ TaisyncTelemetry::_newConnection()
void void
TaisyncTelemetry::_readBytes() TaisyncTelemetry::_readBytes()
{ {
_heartbeatTimer.stop();
while(_tcpSocket->bytesAvailable()) { while(_tcpSocket->bytesAvailable()) {
QByteArray bytesIn = _tcpSocket->read(_tcpSocket->bytesAvailable()); QByteArray bytesIn = _tcpSocket->read(_tcpSocket->bytesAvailable());
emit bytesReady(bytesIn); emit bytesReady(bytesIn);
} }
} }
//-----------------------------------------------------------------------------
void
TaisyncTelemetry::_sendGCSHeartbeat()
{
//-- TODO: This is temporary. We should not have to send out heartbeats for a link to start.
if(_tcpSocket) {
MAVLinkProtocol* pMavlinkProtocol = qgcApp()->toolbox()->mavlinkProtocol();
if(pMavlinkProtocol && _mavlinkChannel >= 0) {
qCDebug(TaisyncLog) << "Taisync heartbeat out";
mavlink_message_t message;
mavlink_msg_heartbeat_pack_chan(
static_cast<uint8_t>(pMavlinkProtocol->getSystemId()),
static_cast<uint8_t>(pMavlinkProtocol->getComponentId()),
static_cast<uint8_t>(_mavlinkChannel),
&message,
MAV_TYPE_GCS, // MAV_TYPE
MAV_AUTOPILOT_INVALID, // MAV_AUTOPILOT
MAV_MODE_MANUAL_ARMED, // MAV_MODE
0, // custom mode
MAV_STATE_ACTIVE); // MAV_STATE
uint8_t buffer[MAVLINK_MAX_PACKET_LEN];
int len = mavlink_msg_to_send_buffer(buffer, &message);
_tcpSocket->write(reinterpret_cast<const char*>(buffer), len);
}
}
}
...@@ -29,10 +29,5 @@ signals: ...@@ -29,10 +29,5 @@ signals:
private slots: private slots:
void _newConnection () override; void _newConnection () override;
void _readBytes () override; void _readBytes () override;
void _sendGCSHeartbeat ();
private:
int _mavlinkChannel = -1;
QTimer _heartbeatTimer;
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment