diff --git a/bose/devicepluginbose.cpp b/bose/devicepluginbose.cpp index 25d66679..ea0ce81b 100644 --- a/bose/devicepluginbose.cpp +++ b/bose/devicepluginbose.cpp @@ -63,6 +63,8 @@ Device::DeviceSetupStatus DevicePluginBose::setupDevice(Device *device) connect(soundTouch, &SoundTouch::sourcesReceived, this, &DevicePluginBose::onSourcesObjectReceived); connect(soundTouch, &SoundTouch::bassReceived, this, &DevicePluginBose::onBassObjectReceived); connect(soundTouch, &SoundTouch::bassCapabilitiesReceived, this, &DevicePluginBose::onBassCapabilitiesObjectReceived); + connect(soundTouch, &SoundTouch::groupReceived, this, &DevicePluginBose::onGroupObjectReceived); + connect(soundTouch, &SoundTouch::zoneReceived, this, &DevicePluginBose::onZoneObjectReceived); soundTouch->getInfo(); soundTouch->getNowPlaying(); @@ -220,6 +222,8 @@ void DevicePluginBose::onPluginTimer() soundTouch->getNowPlaying(); soundTouch->getVolume(); soundTouch->getBass(); + soundTouch->getGroup(); + soundTouch->getZone(); } } @@ -307,5 +311,21 @@ void DevicePluginBose::onBassObjectReceived(BassObject bass) void DevicePluginBose::onBassCapabilitiesObjectReceived(BassCapabilitiesObject bassCapabilities) { - qDebug(dcBose()) << "Bass capabilities (max, min, default):" << bassCapabilities.bassMax << bassCapabilities.bassMin << bassCapabilities.bassDefault; + qDebug(dcBose()) << "Bass capabilities (max, min, default):" << bassCapabilities.bassMax << bassCapabilities.bassMin << bassCapabilities.bassDefault; +} + +void DevicePluginBose::onGroupObjectReceived(GroupObject group) +{ + qDebug(dcBose()) << "Group" << group.name << group.status; + foreach (RolesObject role, group.roles) { + qDebug(dcBose()) << "-> member:" << role.groupRole.deviceID; + } +} + +void DevicePluginBose::onZoneObjectReceived(ZoneObject zone) +{ + qDebug(dcBose()) << "Zone master" << zone.deviceID; + foreach (MemberObject member, zone.members) { + qDebug(dcBose()) << "-> member:" << member.deviceID; + } } diff --git a/bose/devicepluginbose.h b/bose/devicepluginbose.h index 72a3711e..48e953b0 100644 --- a/bose/devicepluginbose.h +++ b/bose/devicepluginbose.h @@ -64,6 +64,8 @@ private slots: void onSourcesObjectReceived(SourcesObject sources); void onBassObjectReceived(BassObject bass); void onBassCapabilitiesObjectReceived(BassCapabilitiesObject bassCapabilities); + void onGroupObjectReceived(GroupObject group); + void onZoneObjectReceived(ZoneObject zone); }; #endif // DEVICEPLUGINBOSE_H diff --git a/bose/soundtouch.cpp b/bose/soundtouch.cpp index 28dcd92d..af440bdb 100644 --- a/bose/soundtouch.cpp +++ b/bose/soundtouch.cpp @@ -22,6 +22,7 @@ #include "soundtouch.h" #include "hardwaremanager.h" +#include "soundtouch.h" #include "devices/device.h" #include "network/networkaccessmanager.h" @@ -54,6 +55,7 @@ void SoundTouch::getInfo() //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() @@ -98,8 +100,8 @@ void SoundTouch::getGroup() url.setHost(m_ipAddress); url.setScheme("http"); url.setPort(m_port); - url.setPath("/group"); - qDebug(dcBose) << "Sending request" << url; + url.setPath("/getGroup"); + //qDebug(dcBose) << "Sending request" << url; QNetworkReply *reply = m_networkAccessManager->get(QNetworkRequest(url)); connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished); } @@ -135,7 +137,7 @@ void SoundTouch::getPresets() url.setScheme("http"); url.setPort(m_port); url.setPath("/presets"); - qDebug(dcBose) << "Sending request" << url; + //qDebug(dcBose) << "Sending request" << url; QNetworkReply *reply = m_networkAccessManager->get(QNetworkRequest(url)); connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished); } @@ -147,7 +149,7 @@ void SoundTouch::getBassCapabilities() url.setScheme("http"); url.setPort(m_port); url.setPath("/bassCapabilities"); - qDebug(dcBose) << "Sending request" << url; + //qDebug(dcBose) << "Sending request" << url; QNetworkReply *reply = m_networkAccessManager->get(QNetworkRequest(url)); connect(reply, &QNetworkReply::finished, this, &SoundTouch::onRestRequestFinished); } @@ -284,8 +286,10 @@ void SoundTouch::setZone(ZoneObject zone) xml.writeStartDocument(); xml.writeStartElement("zone"); xml.writeAttribute("master", zone.deviceID); - xml.writeTextElement("member", zone.member.deviceID); - xml.writeAttribute("ipaddress", zone.member.ipAddress); + foreach (MemberObject member, zone.members){ + xml.writeTextElement("member", member.deviceID); + xml.writeAttribute("ipaddress", member.ipAddress); + } xml.writeEndElement(); //zone xml.writeEndDocument(); qDebug(dcBose) << "Sending request" << url << content; @@ -305,8 +309,10 @@ void SoundTouch::addZoneSlave(ZoneObject zone) xml.writeStartDocument(); xml.writeStartElement("zone"); xml.writeAttribute("master", zone.deviceID); - xml.writeTextElement("member", zone.member.deviceID); - xml.writeAttribute("ipaddress", zone.member.ipAddress); + foreach (MemberObject member, zone.members){ + xml.writeTextElement("member", member.deviceID); + xml.writeAttribute("ipaddress", member.ipAddress); + } xml.writeEndElement(); //zone xml.writeEndDocument(); qDebug(dcBose) << "Sending request" << url << content; @@ -326,8 +332,10 @@ void SoundTouch::removeZoneSlave(ZoneObject zone) xml.writeStartDocument(); xml.writeStartElement("zone"); xml.writeAttribute("master", zone.deviceID); - xml.writeTextElement("member", zone.member.deviceID); - xml.writeAttribute("ipaddress", zone.member.ipAddress); + foreach (MemberObject member, zone.members){ + xml.writeTextElement("member", member.deviceID); + xml.writeAttribute("ipaddress", member.ipAddress); + } xml.writeEndElement(); //zone xml.writeEndDocument(); qDebug(dcBose) << "Sending request" << url << content; @@ -651,7 +659,7 @@ void SoundTouch::onRestRequestFinished() { } else if(xml.name() == "actualbass"){ //qDebug(dcBose) << "Actual bass" << xml.readElementText(); bassObject.actualBass = xml.readElementText().toInt(); - }else { + } else { xml.skipCurrentElement(); } } @@ -659,6 +667,27 @@ void SoundTouch::onRestRequestFinished() { } else if (xml.name() == "bassCapabilities") { BassCapabilitiesObject bassCapabilities; + if(xml.attributes().hasAttribute("deviceID")) { + bassCapabilities.deviceID = xml.attributes().value("deviceID").toString(); + } + + while(xml.readNextStartElement()){ + if(xml.name() == "bassAvailable"){ + //qDebug(dcBose) << "BassAvailable" << xml.readElementText(); + bassCapabilities.bassAvailable = ( xml.readElementText().toUpper() == "TRUE" ); + } else if(xml.name() == "bassMin"){ + //qDebug(dcBose) << "bass Min" << xml.readElementText(); + bassCapabilities.bassMin = xml.readElementText().toInt(); + } else if(xml.name() == "bassMax"){ + //qDebug(dcBose) << "bass Max" << xml.readElementText(); + bassCapabilities.bassMax = xml.readElementText().toInt(); + } else if(xml.name() == "bassDefault"){ + //qDebug(dcBose) << "bass default" << xml.readElementText(); + bassCapabilities.bassDefault = xml.readElementText().toInt(); + }else { + xml.skipCurrentElement(); + } + } emit bassCapabilitiesReceived(bassCapabilities); } else if (xml.name() == "presets") { PresetObject preset; @@ -691,19 +720,62 @@ void SoundTouch::onRestRequestFinished() { } else if (xml.name() == "group") { GroupObject group; if(xml.attributes().hasAttribute("deviceID")) { - //qDebug(dcBose) << "Device ID" << xml.attributes().value("deviceID").toString(); group.id = xml.attributes().value("id").toString(); } - + while(xml.readNextStartElement()){ + if(xml.name() == "name") { + group.name = xml.readElementText(); + } else if(xml.name() == "masterDeviceId") { + group.masterDeviceId = xml.readElementText(); + } else if(xml.name() == "roles") { + //group.roles = xml.readElementText().toInt(); + } else if(xml.name() == "status"){ + QString groupStatus = xml.readElementText(); + //qDebug(dcBose) << "Group role" << groupStatus; + //group.status = xml.readElementText(); + }else { + xml.skipCurrentElement(); + } + } emit groupReceived(group); - } else { + } else if (xml.name() == "zone") { + ZoneObject zone; + if(xml.attributes().hasAttribute("master")) { + zone.deviceID = xml.attributes().value("master").toString(); + } + while(xml.readNextStartElement()){ + MemberObject member; + if(xml.name() == "member") { + if(xml.attributes().hasAttribute("ipaddress")) { + member.ipAddress = xml.attributes().value("ipaddress").toString(); + } + member.deviceID = xml.readElementText(); + } else { + xml.skipCurrentElement(); + } + zone.members.append(member); + } + emit zoneReceived(zone); + } + else { xml.skipCurrentElement(); } } } +void SoundTouch::onRestRequestError(QNetworkReply::NetworkError error) +{ + Q_UNUSED(error) + + QNetworkReply *reply = static_cast(sender()); + reply->deleteLater(); + + qWarning(dcBose) << "Rest Error" << reply->errorString(); +} + void SoundTouch::onWebsocketMessageReceived(QString message) { qDebug(dcBose) << "Websocket message received:" << message; + } diff --git a/bose/soundtouch.h b/bose/soundtouch.h index 69111cbc..887e5fc7 100644 --- a/bose/soundtouch.h +++ b/bose/soundtouch.h @@ -86,6 +86,7 @@ private slots: void onWebsocketDisconnected(); void onWebsocketMessageReceived(QString message); void onRestRequestFinished(); + void onRestRequestError(QNetworkReply::NetworkError error); }; #endif // SOUNDTOUCH_H diff --git a/bose/soundtouchtypes.h b/bose/soundtouchtypes.h index 4ecac7e1..930d1ce1 100644 --- a/bose/soundtouchtypes.h +++ b/bose/soundtouchtypes.h @@ -195,8 +195,8 @@ struct MemberObject { }; struct ZoneObject { - QString deviceID; //Attribute. The deviceID unique identifier of the master product. - MemberObject member; //Element. This object describes products in the zone There is an object for each product. + QString deviceID; //Attribute. The deviceID unique identifier of the master product. + QList members; //Element. This object describes products in the zone There is an object for each product. }; struct BassCapabilitiesObject { @@ -234,7 +234,7 @@ struct GroupObject { QString id; //Attribute. A unique ID for the group. QString name; //Element. A user-set name for the group. QString masterDeviceId; //Element. The unique identifier of the master product in the group. - RolesObject roles; //Element. This object describes the products in the group and their location (left/right). + QList roles; //Element. This object describes the products in the group and their location (left/right). PLAY_STATUS status; //Element. The state of the stereo pair group. };