fixed polling with queue

master
nymea 2019-07-12 14:18:55 +02:00
parent aa25f98762
commit 5450a96a00
3 changed files with 140 additions and 117 deletions

View File

@ -63,7 +63,6 @@ Device::DeviceSetupStatus DevicePluginBose::setupDevice(Device *device)
connect(soundTouch, &SoundTouch::sourcesReceived, this, &DevicePluginBose::onSourcesObjectReceived); connect(soundTouch, &SoundTouch::sourcesReceived, this, &DevicePluginBose::onSourcesObjectReceived);
connect(soundTouch, &SoundTouch::bassReceived, this, &DevicePluginBose::onBassObjectReceived); connect(soundTouch, &SoundTouch::bassReceived, this, &DevicePluginBose::onBassObjectReceived);
connect(soundTouch, &SoundTouch::bassCapabilitiesReceived, this, &DevicePluginBose::onBassCapabilitiesObjectReceived); connect(soundTouch, &SoundTouch::bassCapabilitiesReceived, this, &DevicePluginBose::onBassCapabilitiesObjectReceived);
connect(soundTouch, &SoundTouch::groupReceived, this, &DevicePluginBose::onGroupObjectReceived);
connect(soundTouch, &SoundTouch::zoneReceived, this, &DevicePluginBose::onZoneObjectReceived); connect(soundTouch, &SoundTouch::zoneReceived, this, &DevicePluginBose::onZoneObjectReceived);
soundTouch->getInfo(); soundTouch->getInfo();
@ -72,7 +71,6 @@ Device::DeviceSetupStatus DevicePluginBose::setupDevice(Device *device)
soundTouch->getSources(); soundTouch->getSources();
soundTouch->getBass(); soundTouch->getBass();
soundTouch->getBassCapabilities(); soundTouch->getBassCapabilities();
soundTouch->getGroup();
soundTouch->getZone(); soundTouch->getZone();
m_soundTouch.insert(device, soundTouch); m_soundTouch.insert(device, soundTouch);
@ -222,7 +220,6 @@ void DevicePluginBose::onPluginTimer()
soundTouch->getNowPlaying(); soundTouch->getNowPlaying();
soundTouch->getVolume(); soundTouch->getVolume();
soundTouch->getBass(); soundTouch->getBass();
soundTouch->getGroup();
soundTouch->getZone(); soundTouch->getZone();
} }
} }

View File

@ -22,7 +22,6 @@
#include "soundtouch.h" #include "soundtouch.h"
#include "hardwaremanager.h" #include "hardwaremanager.h"
#include "soundtouch.h"
#include "devices/device.h" #include "devices/device.h"
#include "network/networkaccessmanager.h" #include "network/networkaccessmanager.h"
@ -47,111 +46,93 @@ SoundTouch::SoundTouch(NetworkAccessManager *networkAccessManager, QString ipAdd
void SoundTouch::getInfo() void SoundTouch::getInfo()
{ {
QUrl url; if (!m_getRepliesPending) {
url.setHost(m_ipAddress); sendGetRequest("/info");
url.setScheme("http"); } else {
url.setPort(m_port); if (!m_getRequestQueue.contains("/info"))
url.setPath("/info"); m_getRequestQueue.append("/info");
//qDebug(dcBose) << "Sending request" << url; }
QNetworkReply *reply = m_networkAccessManager->get(QNetworkRequest(url));
connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onRestRequestError(QNetworkReply::NetworkError)));
} }
void SoundTouch::getVolume() void SoundTouch::getVolume()
{ {
QUrl url; if (!m_getRepliesPending) {
url.setHost(m_ipAddress); sendGetRequest("/volume");
url.setScheme("http"); } else {
url.setPort(m_port); if (!m_getRequestQueue.contains("/volume"))
url.setPath("/volume"); m_getRequestQueue.append("/volume");
//qDebug(dcBose) << "Sending request" << url; }
QNetworkReply *reply = m_networkAccessManager->get(QNetworkRequest(url));
connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
} }
void SoundTouch::getNowPlaying() void SoundTouch::getNowPlaying()
{ {
QUrl url; if (!m_getRepliesPending) {
url.setHost(m_ipAddress); sendGetRequest("/now_playing");
url.setScheme("http"); } else {
url.setPort(m_port); if (!m_getRequestQueue.contains("/now_playing"))
url.setPath("/now_playing"); m_getRequestQueue.append("/now_playing");
//qDebug(dcBose) << "Sending request" << url; }
QNetworkReply *reply = m_networkAccessManager->get(QNetworkRequest(url));
connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
} }
void SoundTouch::getBass() void SoundTouch::getBass()
{ {
QUrl url; if (!m_getRepliesPending) {
url.setHost(m_ipAddress); sendGetRequest("/bass");
url.setScheme("http"); } else {
url.setPort(m_port); if (!m_getRequestQueue.contains("/bass"))
url.setPath("/bass"); m_getRequestQueue.append("/bass");
//qDebug(dcBose) << "Sending request" << url; }
QNetworkReply *reply = m_networkAccessManager->get(QNetworkRequest(url));
connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
} }
void SoundTouch::getGroup() void SoundTouch::getGroup()
{ {
QUrl url; if (!m_getRepliesPending) {
url.setHost(m_ipAddress); sendGetRequest("/getGroup");
url.setScheme("http"); } else {
url.setPort(m_port); if (!m_getRequestQueue.contains("/getGroup"))
url.setPath("/getGroup"); m_getRequestQueue.append("/getGroup");
//qDebug(dcBose) << "Sending request" << url; }
QNetworkReply *reply = m_networkAccessManager->get(QNetworkRequest(url));
connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
} }
void SoundTouch::getSources() void SoundTouch::getSources()
{ {
QUrl url; if (!m_getRepliesPending) {
url.setHost(m_ipAddress); sendGetRequest("/sources");
url.setScheme("http"); } else {
url.setPort(m_port); if (!m_getRequestQueue.contains("/sources"))
url.setPath("/sources"); m_getRequestQueue.append("/sources");
//qDebug(dcBose) << "Sending request" << url; }
QNetworkReply *reply = m_networkAccessManager->get(QNetworkRequest(url));
connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
} }
void SoundTouch::getZone() void SoundTouch::getZone()
{ {
QUrl url; if (!m_getRepliesPending) {
url.setHost(m_ipAddress); sendGetRequest("/getZone");
url.setScheme("http"); } else {
url.setPort(m_port); if (!m_getRequestQueue.contains("/getZone"))
url.setPath("/getZone"); m_getRequestQueue.append("/getZone");
//qDebug(dcBose) << "Sending request" << url; }
QNetworkReply *reply = m_networkAccessManager->get(QNetworkRequest(url));
connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
} }
void SoundTouch::getPresets() void SoundTouch::getPresets()
{ {
QUrl url; if (!m_getRepliesPending) {
url.setHost(m_ipAddress); sendGetRequest("/presets");
url.setScheme("http"); } else {
url.setPort(m_port); if (!m_getRequestQueue.contains("/presets"))
url.setPath("/presets"); m_getRequestQueue.append("/presets");
//qDebug(dcBose) << "Sending request" << url; }
QNetworkReply *reply = m_networkAccessManager->get(QNetworkRequest(url));
connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
} }
void SoundTouch::getBassCapabilities() void SoundTouch::getBassCapabilities()
{ {
QUrl url; if (!m_getRepliesPending) {
url.setHost(m_ipAddress); sendGetRequest("/bassCapabilities");
url.setScheme("http"); } else {
url.setPort(m_port); if (!m_getRequestQueue.contains("/bassCapabilities"))
url.setPath("/bassCapabilities"); m_getRequestQueue.append("/bassCapabilities");
//qDebug(dcBose) << "Sending request" << url; }
QNetworkReply *reply = m_networkAccessManager->get(QNetworkRequest(url));
connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
} }
void SoundTouch::setKey(KEY_VALUE keyValue) void SoundTouch::setKey(KEY_VALUE keyValue)
@ -161,62 +142,67 @@ void SoundTouch::setKey(KEY_VALUE keyValue)
url.setScheme("http"); url.setScheme("http");
url.setPort(m_port); url.setPort(m_port);
url.setPath("/key"); url.setPath("/key");
QByteArray content = ("<?xml version=\"1.0\" ?>"); QByteArray content;
content.append("<key state=\"press\" sender=\"Gabbo\">"); QXmlStreamWriter xml(&content);
xml.writeStartDocument("1.0");
xml.writeStartElement("key");
xml.writeAttribute("state", "press");
xml.writeAttribute("sender", "Gabbo");
switch (keyValue){ switch (keyValue){
case KEY_VALUE_PLAY: case KEY_VALUE_PLAY:
content.append("PLAY"); xml.writeCharacters("PLAY");
break; break;
case KEY_VALUE_STOP: case KEY_VALUE_STOP:
content.append("STOP"); xml.writeCharacters("STOP");
break; break;
case KEY_VALUE_PAUSE: case KEY_VALUE_PAUSE:
content.append("PAUSE"); xml.writeCharacters("PAUSE");
break; break;
case KEY_VALUE_PLAY_PAUSE: case KEY_VALUE_PLAY_PAUSE:
content.append("PLAY_PAUSE"); xml.writeCharacters("PLAY_PAUSE");
break; break;
case KEY_VALUE_POWER: case KEY_VALUE_POWER:
content.append("POWER"); xml.writeCharacters("POWER");
break; break;
case KEY_VALUE_NEXT_TRACK: case KEY_VALUE_NEXT_TRACK:
content.append("NEXT_TRACK"); xml.writeCharacters("NEXT_TRACK");
break; break;
case KEY_VALUE_PREV_TRACK: case KEY_VALUE_PREV_TRACK:
content.append("PREV_TRACK"); xml.writeCharacters("PREV_TRACK");
break; break;
case KEY_VALUE_BOOKMARK: case KEY_VALUE_BOOKMARK:
content.append("BOOKMARK"); xml.writeCharacters("BOOKMARK");
break; break;
case KEY_VALUE_AUX_INPUT: case KEY_VALUE_AUX_INPUT:
content.append("AUX_INPUT"); xml.writeCharacters("AUX_INPUT");
break; break;
case KEY_VALUE_REPEAT_ALL: case KEY_VALUE_REPEAT_ALL:
content.append("REPEAT_ALL"); xml.writeCharacters("REPEAT_ALL");
break; break;
case KEY_VALUE_REPEAT_ONE: case KEY_VALUE_REPEAT_ONE:
content.append("REPEAT_ONE"); xml.writeCharacters("REPEAT_ONE");
break; break;
case KEY_VALUE_REPEAT_OFF: case KEY_VALUE_REPEAT_OFF:
content.append("REPEAT_OFF"); xml.writeCharacters("REPEAT_OFF");
break; break;
case KEY_VALUE_ADD_FAVORITE: case KEY_VALUE_ADD_FAVORITE:
content.append("ADD_FAVORITE"); xml.writeCharacters("ADD_FAVORITE");
break; break;
case KEY_VALUE_MUTE: case KEY_VALUE_MUTE:
content.append("MUTE"); xml.writeCharacters("MUTE");
break; break;
case KEY_VALUE_SHUFFLE_ON: case KEY_VALUE_SHUFFLE_ON:
content.append("SHUFFLE_ON"); xml.writeCharacters("SHUFFLE_ON");
break; break;
case KEY_VALUE_SHUFFLE_OFF: case KEY_VALUE_SHUFFLE_OFF:
content.append("SHUFFLE_OFF"); xml.writeCharacters("SHUFFLE_OFF");
break; break;
default: default:
qWarning(dcBose) << "key not yet implemented"; qWarning(dcBose) << "key not yet implemented";
return; return;
} }
content.append("</key>"); xml.writeEndElement(); //key
xml.writeEndDocument();
qDebug(dcBose) << "Sending request" << url << content; qDebug(dcBose) << "Sending request" << url << content;
QNetworkReply *reply = m_networkAccessManager->post(QNetworkRequest(url), content); QNetworkReply *reply = m_networkAccessManager->post(QNetworkRequest(url), content);
connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished); connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
@ -227,11 +213,15 @@ void SoundTouch::setKey(KEY_VALUE keyValue)
url.setScheme("http"); url.setScheme("http");
url.setPort(m_port); url.setPort(m_port);
url.setPath("/key"); url.setPath("/key");
QByteArray content = ("<?xml version=\"1.0\" ?>"); QByteArray content;
content.append("<key state=\"release\" sender=\"Gabbo\">"); QXmlStreamWriter xml(&content);
content.append("POWER"); xml.writeStartDocument("1.0");
content.append("</key>"); xml.writeStartElement("key");
//qDebug(dcBose) << "Sending request" << url << content; xml.writeAttribute("state", "release");
xml.writeAttribute("sender", "Gabbo");
xml.writeCharacters("POWER");
xml.writeEndElement(); //key
xml.writeEndDocument();
QNetworkReply *reply = m_networkAccessManager->post(QNetworkRequest(url), content); QNetworkReply *reply = m_networkAccessManager->post(QNetworkRequest(url), content);
connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished); connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
} }
@ -270,8 +260,8 @@ void SoundTouch::setSource(ContentItemObject contentItem)
xml.writeEndDocument(); xml.writeEndDocument();
qDebug(dcBose) << "Sending request" << url << content; qDebug(dcBose) << "Sending request" << url << content;
//QNetworkReply *reply = m_networkAccessManager->post(QNetworkRequest(url), content); QNetworkReply *reply = m_networkAccessManager->post(QNetworkRequest(url), content);
//connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished); connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
} }
void SoundTouch::setZone(ZoneObject zone) void SoundTouch::setZone(ZoneObject zone)
@ -283,7 +273,7 @@ void SoundTouch::setZone(ZoneObject zone)
url.setPath("/setZone"); url.setPath("/setZone");
QByteArray content; QByteArray content;
QXmlStreamWriter xml(&content); QXmlStreamWriter xml(&content);
xml.writeStartDocument(); xml.writeStartDocument("1.0");
xml.writeStartElement("zone"); xml.writeStartElement("zone");
xml.writeAttribute("master", zone.deviceID); xml.writeAttribute("master", zone.deviceID);
foreach (MemberObject member, zone.members){ foreach (MemberObject member, zone.members){
@ -293,8 +283,8 @@ void SoundTouch::setZone(ZoneObject zone)
xml.writeEndElement(); //zone xml.writeEndElement(); //zone
xml.writeEndDocument(); xml.writeEndDocument();
qDebug(dcBose) << "Sending request" << url << content; qDebug(dcBose) << "Sending request" << url << content;
//QNetworkReply *reply = m_networkAccessManager->post(QNetworkRequest(url), content); QNetworkReply *reply = m_networkAccessManager->post(QNetworkRequest(url), content);
//connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished); connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
} }
void SoundTouch::addZoneSlave(ZoneObject zone) void SoundTouch::addZoneSlave(ZoneObject zone)
@ -306,7 +296,7 @@ void SoundTouch::addZoneSlave(ZoneObject zone)
url.setPath("/addZoneSlave"); url.setPath("/addZoneSlave");
QByteArray content; QByteArray content;
QXmlStreamWriter xml(&content); QXmlStreamWriter xml(&content);
xml.writeStartDocument(); xml.writeStartDocument("1.0");
xml.writeStartElement("zone"); xml.writeStartElement("zone");
xml.writeAttribute("master", zone.deviceID); xml.writeAttribute("master", zone.deviceID);
foreach (MemberObject member, zone.members){ foreach (MemberObject member, zone.members){
@ -316,8 +306,8 @@ void SoundTouch::addZoneSlave(ZoneObject zone)
xml.writeEndElement(); //zone xml.writeEndElement(); //zone
xml.writeEndDocument(); xml.writeEndDocument();
qDebug(dcBose) << "Sending request" << url << content; qDebug(dcBose) << "Sending request" << url << content;
//QNetworkReply *reply = m_networkAccessManager->post(QNetworkRequest(url), content); QNetworkReply *reply = m_networkAccessManager->post(QNetworkRequest(url), content);
//connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished); connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
} }
void SoundTouch::removeZoneSlave(ZoneObject zone) void SoundTouch::removeZoneSlave(ZoneObject zone)
@ -339,8 +329,8 @@ void SoundTouch::removeZoneSlave(ZoneObject zone)
xml.writeEndElement(); //zone xml.writeEndElement(); //zone
xml.writeEndDocument(); xml.writeEndDocument();
qDebug(dcBose) << "Sending request" << url << content; qDebug(dcBose) << "Sending request" << url << content;
//QNetworkReply *reply = m_networkAccessManager->post(QNetworkRequest(url), content); QNetworkReply *reply = m_networkAccessManager->post(QNetworkRequest(url), content);
//connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished); connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
} }
void SoundTouch::setBass(int volume) void SoundTouch::setBass(int volume)
@ -395,8 +385,8 @@ void SoundTouch::setSpeaker(PlayInfoObject playInfo)
xml.writeEndElement(); //play_info xml.writeEndElement(); //play_info
xml.writeEndDocument(); xml.writeEndDocument();
qDebug(dcBose) << "Sending request" << url << content; qDebug(dcBose) << "Sending request" << url << content;
//QNetworkReply *reply = m_networkAccessManager->post(QNetworkRequest(url), content); QNetworkReply *reply = m_networkAccessManager->post(QNetworkRequest(url), content);
//connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished); connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
} }
void SoundTouch::onWebsocketConnected() void SoundTouch::onWebsocketConnected()
@ -409,7 +399,7 @@ void SoundTouch::onWebsocketDisconnected()
{ {
qDebug(dcBose) << "Bose websocket disconnected"; qDebug(dcBose) << "Bose websocket disconnected";
emit connectionChanged(false); emit connectionChanged(false);
QTimer::singleShot(5000, [this](){ QTimer::singleShot(5000, this, [this](){
QUrl url; QUrl url;
url.setHost(m_ipAddress); url.setHost(m_ipAddress);
url.setScheme("ws"); url.setScheme("ws");
@ -423,15 +413,23 @@ void SoundTouch::onRestRequestFinished() {
QNetworkReply *reply = static_cast<QNetworkReply *>(sender()); QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
reply->deleteLater(); reply->deleteLater();
QByteArray data = reply->readAll();
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
//qDebug(dcBose) << data; if (m_getRequestQueue.isEmpty()) {
m_getRepliesPending = false;
} else {
sendGetRequest(m_getRequestQueue.takeFirst());
}
// Check HTTP status code // Check HTTP status code
if (status != 200 || reply->error() != QNetworkReply::NoError) { if (status != 200 || reply->error() != QNetworkReply::NoError) {
qCWarning(dcBose()) << "Request error:" << status << reply->errorString(); qCWarning(dcBose()) << "Request error:" << reply->errorString() << "request:" << reply->url().path();
return;
} }
QByteArray data = reply->readAll();
//qDebug(dcBose) << data;
QXmlStreamReader xml; QXmlStreamReader xml;
xml.addData(data); xml.addData(data);
@ -779,3 +777,19 @@ void SoundTouch::onWebsocketMessageReceived(QString message)
qDebug(dcBose) << "Websocket message received:" << message; qDebug(dcBose) << "Websocket message received:" << message;
} }
void SoundTouch::sendGetRequest(QString path)
{
QUrl url;
url.setHost(m_ipAddress);
url.setScheme("http");
url.setPort(m_port);
url.setPath(path);
//qDebug(dcBose) << "Sending request" << url;
QNetworkRequest request = QNetworkRequest(url);
QNetworkReply *reply = m_networkAccessManager->get(request);
m_getRepliesPending = true;
connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished);
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onRestRequestError(QNetworkReply::NetworkError)));
}

View File

@ -62,6 +62,18 @@ public:
private: private:
enum RequestType {
Get,
Post
};
void sendGetRequest(QString path);
//get calls are getting queued to don't overstrain the device
//post calls must get sent immediately
//if an get call of the same URL is already in the queu the new one will be ignored
QList<QString> m_getRequestQueue;
bool m_getRepliesPending = false;
NetworkAccessManager *m_networkAccessManager = nullptr; NetworkAccessManager *m_networkAccessManager = nullptr;
QString m_ipAddress; QString m_ipAddress;
int m_port = 8090; int m_port = 8090;