# HG changeset patch # User Michiel Broek # Date 1657547826 -7200 # Node ID 792058058c2ffda36b647e30529a15e1a5e67e09 # Parent e4f1769047db96784912edfdd9fca03c5d76bfd0 Added nodes monitor detail screen. diff -r e4f1769047db -r 792058058c2f CMakeLists.txt --- a/CMakeLists.txt Sat Jul 09 23:05:25 2022 +0200 +++ b/CMakeLists.txt Mon Jul 11 15:57:06 2022 +0200 @@ -221,6 +221,7 @@ ${SRCDIR}/MonFermenters.cpp ${SRCDIR}/MonCO2meters.cpp ${SRCDIR}/MoniSpindels.cpp + ${SRCDIR}/DetailNode.cpp ${SRCDIR}/DetailFermenter.cpp ${SRCDIR}/DetailCO2meter.cpp ${SRCDIR}/DetailiSpindel.cpp @@ -283,6 +284,7 @@ ${SRCDIR}/MonFermenters.h ${SRCDIR}/MonCO2meters.h ${SRCDIR}/MoniSpindels.h + ${SRCDIR}/DetailNode.h ${SRCDIR}/DetailFermenter.h ${SRCDIR}/DetailCO2meter.h ${SRCDIR}/DetailiSpindel.h @@ -325,6 +327,7 @@ ${UIDIR}/EditProfileFerment.ui ${UIDIR}/EditRecipe.ui ${UIDIR}/EditProduct.ui + ${UIDIR}/DetailNode.ui ${UIDIR}/DetailFermenter.ui ${UIDIR}/DetailCO2meter.ui ${UIDIR}/DetailiSpindel.ui diff -r e4f1769047db -r 792058058c2f src/DetailNode.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/DetailNode.cpp Mon Jul 11 15:57:06 2022 +0200 @@ -0,0 +1,212 @@ +/** + * DetailNode.cpp is part of bmsapp. + * + * bmsapp is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * bmsapp is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "DetailNode.h" +#include "ChartCarbonate.h" +#include "../ui/ui_DetailNode.h" +#include "global.h" +#include "MainWindow.h" + + +/* + * Results are available via MySQL and websockets. Because we initialize using + * MySQL we only use that for the results and up to date status. + * Commands are send via websockets only. + */ + +DetailNode::DetailNode(int id, QWidget *parent) : QDialog(parent), ui(new Ui::DetailNode) +{ + QSqlQuery query; + + qDebug() << "DetailNode record:" << id; + ui->setupUi(this); + this->recno = id; + setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint); + setWindowTitle(tr("BMSapp - Details System")); + + connect(ui->rebootButton, SIGNAL(clicked()), this, SLOT(control_reboot())); + connect(ui->rebirthButton, SIGNAL(clicked()), this, SLOT(control_rebirth())); + connect(parent, SIGNAL(updateNode(QString)), this, SLOT(refreshNode(QString))); + emit refreshTable(); +} + + +void DetailNode::refreshTable() +{ + QSqlQuery query; + + qDebug() << "refreshTable node rec:" << this->recno; + + query.prepare("SELECT * FROM mon_nodes WHERE record = :recno"); + query.bindValue(":recno", this->recno); + query.exec(); + if (query.next()) { + + _node = query.value("node").toString(); + _group_id = query.value("group_id").toString(); + _uuid = query.value("uuid").toString(); + + ui->uuidEdit->setText(_uuid); + ui->systemEdit->setText(_node); + ui->typeEdit->setText(_group_id); + ui->firstEdit->setText(query.value("firstseen").toDateTime().toString("dd MMM yyyy HH:mm:ss")); + ui->lastEdit->setText(query.value("lastseen").toDateTime().toString("dd MMM yyyy HH:mm:ss")); + + if (query.value("online").toInt()) { + ui->statusEdit->setText(tr("Online")); + ui->makerEdit->show(); + ui->modelEdit->show(); + ui->osEdit->show(); + ui->fwEdit->show(); + ui->makerLabel->show(); + ui->modelLabel->show(); + ui->osLabel->show(); + ui->fwLabel->show(); + ui->intervalLabel->show(); + ui->intervalEdit->show(); + ui->makerEdit->setText(query.value("hardwaremake").toString()); + ui->modelEdit->setText(query.value("hardwaremodel").toString()); + ui->osEdit->setText(query.value("os").toString()+QString(tr(" version: "))+query.value("os_version").toString()); + ui->fwEdit->setText(query.value("firmware").toString()); + ui->intervalEdit->setValue(query.value("up_interval").toInt()); + + if (query.value("temperature").toDouble() > 0) { + ui->tempLabel->show(); + ui->tempEdit->show(); + ui->tempEdit->setValue(query.value("temperature").toDouble()); + } else { + ui->tempLabel->hide(); + ui->tempEdit->hide(); + } + if (query.value("humidity").toDouble() > 0) { + ui->humLabel->show(); + ui->humEdit->show(); + ui->humEdit->setValue(query.value("humidity").toDouble()); + } else { + ui->humLabel->hide(); + ui->humEdit->hide(); + } + if (query.value("barometer").toDouble() > 0) { + ui->baroLabel->show(); + ui->baroEdit->show(); + ui->baroEdit->setValue(query.value("barometer").toDouble()); + } else { + ui->baroLabel->hide(); + ui->baroEdit->hide(); + } + + ui->networkLabel->show(); + ui->networkEdit->show(); + ui->networkEdit->setText(query.value("net_ifname").toString()+" "+query.value("net_address").toString()); + + if (query.value("net_ssid").toString() != "") { + ui->ssidLabel->show(); + ui->ssidEdit->show(); + ui->ssidEdit->setText(query.value("net_ssid").toString()); + ui->rssiLabel->show(); + ui->rssiEdit->show(); + if (query.value("net_rssi").toInt() < 0) + ui->rssiEdit->setValue(query.value("net_rssi").toInt()); + } else { + ui->ssidLabel->hide(); + ui->ssidEdit->hide(); + ui->rssiLabel->hide(); + ui->rssiEdit->hide(); + } + + } else { + /* Offline */ + ui->statusEdit->setText(tr("Offline")); + + ui->makerEdit->hide(); + ui->modelEdit->hide(); + ui->osEdit->hide(); + ui->fwEdit->hide(); + ui->makerLabel->hide(); + ui->modelLabel->hide(); + ui->osLabel->hide(); + ui->fwLabel->hide(); + ui->intervalLabel->hide(); + ui->intervalEdit->hide(); + + ui->tempLabel->hide(); + ui->tempEdit->hide(); + ui->humLabel->hide(); + ui->humEdit->hide(); + ui->baroLabel->hide(); + ui->baroEdit->hide(); + + ui->networkLabel->hide(); + ui->networkEdit->hide(); + ui->ssidLabel->hide(); + ui->ssidEdit->hide(); + ui->rssiLabel->hide(); + ui->rssiEdit->hide(); + } + } + +} + + +DetailNode::~DetailNode() +{ + qDebug() << "DetailNode done"; + delete ui; + emit entry_changed(); +} + + +/* + * Receive signals destined for all co2meters. + * Check if the signal is for us. + */ +void DetailNode::refreshNode(QString data) +{ + if (_node == data) { + emit refreshTable(); + } +} + + +void DetailNode::on_quitButton_clicked() +{ + this->close(); + this->setResult(1); +} + + +void DetailNode::control_reboot() +{ + int rc = QMessageBox::warning(this, tr("Reboot application"), tr("Remote applicaation is running, really reboot?"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::No); + + if (rc == QMessageBox::No) + return; + + QString msg = QString("{\"node\":\""+_node+"\",\"group_id\":\""+_group_id+"\",\"control\":\"reboot\"}"); + qDebug() << msg; + webSocket->sendTextMessage(msg); +} + + +void DetailNode::control_rebirth() +{ + QString msg = QString("{\"node\":\""+_node+"\",\"group_id\":\""+_group_id+"\",\"control\":\"rebirth\"}"); + qDebug() << msg; + webSocket->sendTextMessage(msg); +} + + diff -r e4f1769047db -r 792058058c2f src/DetailNode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/DetailNode.h Mon Jul 11 15:57:06 2022 +0200 @@ -0,0 +1,43 @@ +#ifndef _DETAILNODE_H +#define _DETAILNODE_H + +#include +#include +#include +#include +#include +#include +#include + + +namespace Ui { +class DetailNode; +} + +class DetailNode : public QDialog +{ + Q_OBJECT + +signals: + void entry_changed(); + +public: + explicit DetailNode(int id, QWidget *parent = 0); + ~DetailNode(); + +private slots: + void on_quitButton_clicked(); + void refreshTable(void); + void control_reboot(); + void control_rebirth(); + +public slots: + void refreshNode(QString); + +private: + Ui::DetailNode *ui; + QString _node, _group_id, _uuid; + int recno; +}; + +#endif diff -r e4f1769047db -r 792058058c2f src/MonNodes.cpp --- a/src/MonNodes.cpp Sat Jul 09 23:05:25 2022 +0200 +++ b/src/MonNodes.cpp Mon Jul 11 15:57:06 2022 +0200 @@ -15,7 +15,7 @@ * along with this program. If not, see . */ #include "MonNodes.h" -#include "EditSupplier.h" +#include "DetailNode.h" #include "MainWindow.h" #include "config.h" @@ -140,16 +140,15 @@ { qDebug() << "refreshNodes" << node; emit refreshTable(); + emit updateNode(node); } void MonNodes::edit(int recno) { -// EditSupplier dialog(recno, this); - /* Signal from editor if a refresh is needed */ -// connect(&dialog, SIGNAL(entry_changed()), this, SLOT(refreshTable())); -// dialog.setModal(true); -// dialog.exec(); + DetailNode dialog(recno, this); + dialog.setModal(true); + dialog.exec(); } diff -r e4f1769047db -r 792058058c2f src/MonNodes.h --- a/src/MonNodes.h Sat Jul 09 23:05:25 2022 +0200 +++ b/src/MonNodes.h Mon Jul 11 15:57:06 2022 +0200 @@ -23,6 +23,7 @@ signals: void setStatus(QString); + void updateNode(QString); private slots: void on_editButton_clicked(); diff -r e4f1769047db -r 792058058c2f ui/DetailNode.ui --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/DetailNode.ui Mon Jul 11 15:57:06 2022 +0200 @@ -0,0 +1,674 @@ + + + DetailNode + + + + 0 + 0 + 1024 + 560 + + + + Dialog + + + + + + + + 20 + 10 + 961 + 461 + + + + + + 10 + 60 + 141 + 20 + + + + Uuid: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 10 + 90 + 141 + 20 + + + + System: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 10 + 150 + 141 + 20 + + + + Type: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 10 + 180 + 141 + 20 + + + + First seen: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 160 + 60 + 271 + 23 + + + + true + + + true + + + + + + 160 + 90 + 181 + 23 + + + + true + + + true + + + + + + 160 + 120 + 141 + 23 + + + + true + + + + + + 160 + 150 + 141 + 23 + + + + true + + + + + + 10 + 120 + 141 + 20 + + + + Current status: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 160 + 180 + 181 + 23 + + + + true + + + + + + 10 + 210 + 141 + 20 + + + + Last seen: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 160 + 210 + 181 + 23 + + + + true + + + + + + 10 + 20 + 941 + 25 + + + + + 12 + 75 + true + + + + System overview + + + Qt::AlignCenter + + + + + + 10 + 240 + 141 + 20 + + + + Hardware maker: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 10 + 270 + 141 + 20 + + + + Hardware model: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 10 + 300 + 141 + 20 + + + + OS: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 10 + 330 + 141 + 20 + + + + Firmware: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 10 + 360 + 141 + 20 + + + + Temperature: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 10 + 390 + 141 + 20 + + + + Humidity: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 490 + 270 + 141 + 20 + + + + Network: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 490 + 240 + 141 + 20 + + + + Update interval: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 160 + 240 + 271 + 23 + + + + true + + + + + + 160 + 270 + 271 + 23 + + + + true + + + + + + 160 + 300 + 271 + 23 + + + + true + + + + + + 160 + 330 + 181 + 23 + + + + true + + + + + + 10 + 420 + 141 + 20 + + + + Barometer: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 160 + 360 + 121 + 24 + + + + true + + + QAbstractSpinBox::NoButtons + + + °C + + + 1 + + + -30.000000000000000 + + + 100.000000000000000 + + + + + + 160 + 390 + 121 + 24 + + + + true + + + QAbstractSpinBox::NoButtons + + + % + + + 1 + + + 0.000000000000000 + + + 100.000000000000000 + + + + + + 160 + 420 + 121 + 24 + + + + true + + + QAbstractSpinBox::NoButtons + + + mbar + + + 0 + + + 0.000000000000000 + + + 1200.000000000000000 + + + + + + 490 + 300 + 141 + 20 + + + + WiFi SSID: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 490 + 330 + 141 + 20 + + + + WiFi signal: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 640 + 270 + 271 + 23 + + + + true + + + + + + 640 + 300 + 181 + 23 + + + + true + + + + + + 640 + 330 + 121 + 24 + + + + true + + + QAbstractSpinBox::NoButtons + + + -1000 + + + 0 + + + + + + 640 + 240 + 121 + 24 + + + + true + + + QAbstractSpinBox::NoButtons + + + 0 + + + 100000 + + + + + + 700 + 60 + 80 + 23 + + + + Reboot + + + + + + 830 + 60 + 80 + 23 + + + + Refresh + + + + + + + 460 + 500 + 80 + 23 + + + + + 0 + 0 + + + + Quit + + + + :icons/silk/door_out.png:icons/silk/door_out.png + + + + + + + + quitButton + + + + + +