added zones and groups

master
nymea 2019-07-11 21:17:47 +02:00
parent 9d30ec249f
commit aa25f98762
5 changed files with 113 additions and 18 deletions

View File

@ -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();
}
}
@ -309,3 +313,19 @@ void DevicePluginBose::onBassCapabilitiesObjectReceived(BassCapabilitiesObject b
{
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;
}
}

View File

@ -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

View File

@ -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();
}
emit groupReceived(group);
} else {
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 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<QNetworkReply *>(sender());
reply->deleteLater();
qWarning(dcBose) << "Rest Error" << reply->errorString();
}
void SoundTouch::onWebsocketMessageReceived(QString message)
{
qDebug(dcBose) << "Websocket message received:" << message;
}

View File

@ -86,6 +86,7 @@ private slots:
void onWebsocketDisconnected();
void onWebsocketMessageReceived(QString message);
void onRestRequestFinished();
void onRestRequestError(QNetworkReply::NetworkError error);
};
#endif // SOUNDTOUCH_H

View File

@ -196,7 +196,7 @@ 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.
QList<MemberObject> 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<RolesObject> 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.
};