WiP: added volume update and control

TODO: collect volume change events and send only one
This commit is contained in:
2018-10-06 14:51:27 +02:00
parent eff21056ec
commit c535f3784a
3 changed files with 92 additions and 62 deletions

View File

@@ -17,9 +17,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
mAddress = ui->txt_address->text();
// load initial data
sendCommand("<YAMAHA_AV cmd=\"GET\"><System>"
"<Power_Control><Power>GetParam</Power></Power_Control>"
"</System></YAMAHA_AV>");
sendCommand("<YAMAHA_AV cmd=\"GET\"><System><Power_Control><Power>GetParam</Power></Power_Control></System></YAMAHA_AV>");
sendCommand("<YAMAHA_AV cmd=\"GET\"><Main_Zone><Volume><Lvl>GetParam</Lvl></Volume></Main_Zone></YAMAHA_AV>");
}
MainWindow::~MainWindow()
@@ -27,6 +26,72 @@ MainWindow::~MainWindow()
delete ui;
}
void MainWindow::sendCommand(QString cmd)
{
QNetworkRequest request;
request.setUrl("http://" + mAddress + ":80/YamahaRemoteControl/ctrl");
request.setRawHeader("Content-Type", "text/xml; charset=UTF-8");
request.setRawHeader("Content-Length", QByteArray::number(cmd.size()));
QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
networkManager->post(request, cmd.toUtf8());
connect(networkManager, &QNetworkAccessManager::finished, this, &MainWindow::replyFinished);
}
void MainWindow::replyFinished(QNetworkReply* reply)
{
QString ans;
if(reply->error() == QNetworkReply::NoError) {
QByteArray data = reply->readAll();
ans = QString(data);
} else {
qDebug() << reply->url();
qDebug() << reply->errorString();
return;
}
// check power state
QRegularExpression regexPower("<Power_Control><Power>(.*)</Power></Power_Control>");
QRegularExpressionMatch matchPower = regexPower.match(ans);
if (matchPower.hasMatch()) {
if (matchPower.captured(1) == "On") mPowered = true;
else if (matchPower.captured(1) == "Off") mPowered = false;
}
// check volume
QRegularExpression regexVolume("<Volume><Lvl><Val>(.*)</Val>");
QRegularExpressionMatch matchVolume = regexVolume.match(ans);
if (matchVolume.hasMatch()) {
mVolume = matchVolume.captured(1).toInt();
}
qDebug() << ans;
reply->deleteLater();
updateUi();
}
void MainWindow::updateUi() {
ui->btn_onoff->setText(mPowered ? "On" : "Off");
ui->dial->setEnabled(mPowered);
ui->dial->setValue(mVolume);
ui->lbl_volume->setEnabled(mPowered);
ui->btn_hdmi1->setEnabled(mPowered);
ui->btn_hdmi2->setEnabled(mPowered);
ui->btn_hdmi3->setEnabled(mPowered);
ui->btn_spotify->setEnabled(mPowered);
ui->btn_airplay->setEnabled(mPowered);
ui->btn_audioin->setEnabled(mPowered);
}
void MainWindow::on_txt_address_textEdited(const QString &arg1)
{
mAddress = arg1;
}
void MainWindow::on_btn_onoff_clicked()
{
if (mPowered){
@@ -43,60 +108,10 @@ void MainWindow::on_btn_onoff_clicked()
updateUi();
}
void MainWindow::sendCommand(QString cmd)
}
void yremote::MainWindow::on_dial_valueChanged(int value)
{
QNetworkRequest request;
request.setUrl("http://" + mAddress + ":80/YamahaRemoteControl/ctrl");
request.setRawHeader("Content-Type", "text/xml; charset=UTF-8");
request.setRawHeader("Content-Length", QByteArray::number(cmd.size()));
QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
mReply = networkManager->post(request, cmd.toUtf8());
connect(networkManager, &QNetworkAccessManager::finished, this, &MainWindow::replyFinished);
}
void MainWindow::replyFinished()
{
QString ans;
mReply->deleteLater();
if(mReply->error() == QNetworkReply::NoError) {
QByteArray data = mReply->readAll();
ans = QString(data);
} else {
qDebug() << mReply->url();
qDebug() << mReply->errorString();
return;
}
// check power state
qDebug() << ans;
QRegularExpression regex("<Power_Control><Power>(.*)</Power></Power_Control>");
QRegularExpressionMatch match = regex.match(ans);
if (match.hasMatch()) {
if (match.captured(1) == "On") mPowered = true;
else if (match.captured(1) == "Off") mPowered = false;
}
updateUi();
}
void MainWindow::updateUi() {
ui->btn_onoff->setText(mPowered ? "On" : "Off");
ui->dial->setEnabled(mPowered);
ui->lbl_volume->setEnabled(mPowered);
ui->btn_hdmi1->setEnabled(mPowered);
ui->btn_hdmi2->setEnabled(mPowered);
ui->btn_hdmi3->setEnabled(mPowered);
ui->btn_spotify->setEnabled(mPowered);
ui->btn_airplay->setEnabled(mPowered);
ui->btn_audioin->setEnabled(mPowered);
}
void MainWindow::on_txt_address_textEdited(const QString &arg1)
{
mAddress = arg1;
}
ui->lbl_volume->setText(QString::number(value));
sendCommand("<YAMAHA_AV cmd=\"PUT\"><Main_Zone><Volume><Lvl><Val>" + QString::number(value) + "</Val><Exp>1</Exp><Unit>dB</Unit></Lvl></Volume></Main_Zone></YAMAHA_AV>");
}